I am currently reading this document: Ada for the C++ or Java Developer. Chapter 8 (page 33) contains an introduction to object oriented programming in Ada. The chapter starts with the following example:
type T is tagged record V, W : Integer; end record; type T_Access is access all T; function F (V : T) return Integer; procedure P1 (V : access T); procedure P2 (V : T_Access);
The following page describes an example on how to call the subprogram
declare V : T; begin V.P1; end;
This results into the following error:
object in prefixed call to "P1" must be aliased (RM 4.1.3 (13 1/2)). If I replace
procedure P1 (V : access T); with
procedure P1 (V : in out T); the example is successfully compiled. Is this a typo in the document?
I’d say that the document is wrong. Perhaps this part of the material was developed before Ada 2005.
It is true that, under some circumstances, a tagged object is automatically aliased: ARM 3.10(9) says
[...] a formal parameter or generic formal object of a tagged type is defined to be aliased.
So, this is legal:
declare procedure Proc (Param : in out T) is begin Param.P1; end Proc; V : T; begin Proc (V); end;