summaryrefslogtreecommitdiff
path: root/gcc/ada/sem_ch3.adb
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/ada/sem_ch3.adb')
-rw-r--r--gcc/ada/sem_ch3.adb1507
1 files changed, 927 insertions, 580 deletions
diff --git a/gcc/ada/sem_ch3.adb b/gcc/ada/sem_ch3.adb
index 29efc4d9512..71afa7d1813 100644
--- a/gcc/ada/sem_ch3.adb
+++ b/gcc/ada/sem_ch3.adb
@@ -104,7 +104,7 @@ package body Sem_Ch3 is
-- implicit derived full type for a type derived from a private type (in
-- that case the subprograms must only be derived for the private view of
-- the type).
-
+ --
-- ??? These flags need a bit of re-examination and re-documentation:
-- ??? are they both necessary (both seem related to the recursion)?
@@ -227,6 +227,20 @@ package body Sem_Ch3 is
-- Needs a more complete spec--what are the parameters exactly, and what
-- exactly is the returned value, and how is Bound affected???
+ procedure Build_Itype_Reference
+ (Ityp : Entity_Id;
+ Nod : Node_Id);
+ -- Create a reference to an internal type, for use by Gigi. The back-end
+ -- elaborates itypes on demand, i.e. when their first use is seen. This
+ -- can lead to scope anomalies if the first use is within a scope that is
+ -- nested within the scope that contains the point of definition of the
+ -- itype. The Itype_Reference node forces the elaboration of the itype
+ -- in the proper scope. The node is inserted after Nod, which is the
+ -- enclosing declaration that generated Ityp.
+ -- A related mechanism is used during expansion, for itypes created in
+ -- branches of conditionals. See Ensure_Defined in exp_util.
+ -- Could both mechanisms be merged ???
+
procedure Build_Underlying_Full_View
(N : Node_Id;
Typ : Entity_Id;
@@ -239,6 +253,9 @@ package body Sem_Ch3 is
-- view cannot itself have a full view (it would get clobbered during
-- view exchanges).
+ procedure Check_Abstract_Interfaces (N : Node_Id; Def : Node_Id);
+ -- Check ARM rules 3.9.4 (15/2), 9.1 (9.d/2) and 9.4 (11.d/2)
+
procedure Check_Access_Discriminant_Requires_Limited
(D : Node_Id;
Loc : Node_Id);
@@ -246,25 +263,39 @@ package body Sem_Ch3 is
-- belongs must be a concurrent type or a descendant of a type with
-- the reserved word 'limited' in its declaration.
+ procedure Check_Anonymous_Access_Components
+ (Typ_Decl : Node_Id;
+ Typ : Entity_Id;
+ Prev : Entity_Id;
+ Comp_List : Node_Id);
+ -- Ada 2005 AI-382: an access component in a record definition can refer to
+ -- the enclosing record, in which case it denotes the type itself, and not
+ -- the current instance of the type. We create an anonymous access type for
+ -- the component, and flag it as an access to a component, so accessibility
+ -- checks are properly performed on it. The declaration of the access type
+ -- is placed ahead of that of the record to prevent order-of-elaboration
+ -- circularity issues in Gigi. We create an incomplete type for the record
+ -- declaration, which is the designated type of the anonymous access.
+
procedure Check_Delta_Expression (E : Node_Id);
- -- Check that the expression represented by E is suitable for use
- -- as a delta expression, i.e. it is of real type and is static.
+ -- Check that the expression represented by E is suitable for use as a
+ -- delta expression, i.e. it is of real type and is static.
procedure Check_Digits_Expression (E : Node_Id);
- -- Check that the expression represented by E is suitable for use as
- -- a digits expression, i.e. it is of integer type, positive and static.
+ -- Check that the expression represented by E is suitable for use as a
+ -- digits expression, i.e. it is of integer type, positive and static.
procedure Check_Initialization (T : Entity_Id; Exp : Node_Id);
- -- Validate the initialization of an object declaration. T is the
- -- required type, and Exp is the initialization expression.
+ -- Validate the initialization of an object declaration. T is the required
+ -- type, and Exp is the initialization expression.
procedure Check_Or_Process_Discriminants
(N : Node_Id;
T : Entity_Id;
Prev : Entity_Id := Empty);
- -- If T is the full declaration of an incomplete or private type, check
- -- the conformance of the discriminants, otherwise process them. Prev
- -- is the entity of the partial declaration, if any.
+ -- If T is the full declaration of an incomplete or private type, check the
+ -- conformance of the discriminants, otherwise process them. Prev is the
+ -- entity of the partial declaration, if any.
procedure Check_Real_Bound (Bound : Node_Id);
-- Check given bound for being of real type and static. If not, post an
@@ -283,19 +314,17 @@ package body Sem_Ch3 is
Parent_Type : Entity_Id;
Derived_Type : Entity_Id;
Loc : Source_Ptr);
- -- For derived scalar types, convert the bounds in the type definition
- -- to the derived type, and complete their analysis. Given a constraint
- -- of the form:
- -- .. new T range Lo .. Hi;
- -- Lo and Hi are analyzed and resolved with T'Base, the parent_type.
- -- The bounds of the derived type (the anonymous base) are copies of
- -- Lo and Hi. Finally, the bounds of the derived subtype are conversions
- -- of those bounds to the derived_type, so that their typing is
- -- consistent.
+ -- For derived scalar types, convert the bounds in the type definition to
+ -- the derived type, and complete their analysis. Given a constraint of the
+ -- form ".. new T range Lo .. Hi", Lo and Hi are analyzed and resolved with
+ -- T'Base, the parent_type. The bounds of the derived type (the anonymous
+ -- base) are copies of Lo and Hi. Finally, the bounds of the derived
+ -- subtype are conversions of those bounds to the derived_type, so that
+ -- their typing is consistent.
procedure Copy_Array_Base_Type_Attributes (T1, T2 : Entity_Id);
- -- Copies attributes from array base type T2 to array base type T1.
- -- Copies only attributes that apply to base types, but not subtypes.
+ -- Copies attributes from array base type T2 to array base type T1. Copies
+ -- only attributes that apply to base types, but not subtypes.
procedure Copy_Array_Subtype_Attributes (T1, T2 : Entity_Id);
-- Copies attributes from array subtype T2 to array subtype T1. Copies
@@ -308,12 +337,12 @@ package body Sem_Ch3 is
Constraints : Elist_Id);
-- Build the list of entities for a constrained discriminated record
-- subtype. If a component depends on a discriminant, replace its subtype
- -- using the discriminant values in the discriminant constraint.
- -- Subt is the defining identifier for the subtype whose list of
- -- constrained entities we will create. Decl_Node is the type declaration
- -- node where we will attach all the itypes created. Typ is the base
- -- discriminated type for the subtype Subt. Constraints is the list of
- -- discriminant constraints for Typ.
+ -- using the discriminant values in the discriminant constraint. Subt is
+ -- the defining identifier for the subtype whose list of constrained
+ -- entities we will create. Decl_Node is the type declaration node where we
+ -- will attach all the itypes created. Typ is the base discriminated type
+ -- for the subtype Subt. Constraints is the list of discriminant
+ -- constraints for Typ.
function Constrain_Component_Type
(Comp : Entity_Id;
@@ -324,11 +353,12 @@ package body Sem_Ch3 is
-- Given a discriminated base type Typ, a list of discriminant constraint
-- Constraints for Typ and a component of Typ, with type Compon_Type,
-- create and return the type corresponding to Compon_type where all
- -- discriminant references are replaced with the corresponding
- -- constraint. If no discriminant references occur in Compon_Typ then
- -- return it as is. Constrained_Typ is the final constrained subtype to
- -- which the constrained Compon_Type belongs. Related_Node is the node
- -- where we will attach all the itypes created.
+ -- discriminant references are replaced with the corresponding constraint.
+ -- If no discriminant references occur in Compon_Typ then return it as is.
+ -- Constrained_Typ is the final constrained subtype to which the
+ -- constrained Compon_Type belongs. Related_Node is the node where we will
+ -- attach all the itypes created.
+ -- Above description is confused, what is Compon_Type???
procedure Constrain_Access
(Def_Id : in out Entity_Id;
@@ -418,10 +448,10 @@ package body Sem_Ch3 is
Suffix : Character;
Suffix_Index : Nat);
-- Process an index constraint in a constrained array declaration. The
- -- constraint can be a subtype name, or a range with or without an
- -- explicit subtype mark. The index is the corresponding index of the
- -- unconstrained array. The Related_Id and Suffix parameters are used to
- -- build the associated Implicit type name.
+ -- constraint can be a subtype name, or a range with or without an explicit
+ -- subtype mark. The index is the corresponding index of the unconstrained
+ -- array. The Related_Id and Suffix parameters are used to build the
+ -- associated Implicit type name.
procedure Constrain_Integer (Def_Id : Node_Id; S : Node_Id);
-- Build subtype of a signed or modular integer type
@@ -431,9 +461,9 @@ package body Sem_Ch3 is
-- build an E_Ordinary_Fixed_Point_Subtype entity.
procedure Copy_And_Swap (Priv, Full : Entity_Id);
- -- Copy the Priv entity into the entity of its full declaration
- -- then swap the two entities in such a manner that the former private
- -- type is now seen as a full type.
+ -- Copy the Priv entity into the entity of its full declaration then swap
+ -- the two entities in such a manner that the former private type is now
+ -- seen as a full type.
procedure Decimal_Fixed_Point_Type_Declaration
(T : Entity_Id;
@@ -522,8 +552,8 @@ package body Sem_Ch3 is
--
-- Is_Tagged is set if we are dealing with tagged types
--
- -- If Inherit_Discr is set, Derived_Base inherits its discriminants
- -- from Parent_Base, otherwise no discriminants are inherited.
+ -- If Inherit_Discr is set, Derived_Base inherits its discriminants from
+ -- Parent_Base, otherwise no discriminants are inherited.
--
-- Discs gives the list of constraints that apply to Parent_Base in the
-- derived type declaration. If Discs is set to No_Elist, then we have
@@ -542,8 +572,8 @@ package body Sem_Ch3 is
--
-- (Old_Component => New_Component),
--
- -- where Old_Component is the Entity_Id of a component in Parent_Base
- -- and New_Component is the Entity_Id of the corresponding component in
+ -- where Old_Component is the Entity_Id of a component in Parent_Base and
+ -- New_Component is the Entity_Id of the corresponding component in
-- Derived_Base. For untagged records, this association list is needed when
-- copying the record declaration for the derived base. In the tagged case
-- the value returned is irrelevant.
@@ -684,6 +714,7 @@ package body Sem_Ch3 is
and then Is_Task_Type (Etype (Scope (Current_Scope)))
then
Error_Msg_N ("task entries cannot have access parameters", N);
+ return Empty;
end if;
-- Ada 2005: for an object declaration the corresponding anonymous
@@ -701,24 +732,26 @@ package body Sem_Ch3 is
(E_Anonymous_Access_Type, Related_Nod,
Scope_Id => Current_Scope);
- -- For the anonymous function result case, retrieve the scope of
- -- the function specification's associated entity rather than using
- -- the current scope. The current scope will be the function itself
- -- if the formal part is currently being analyzed, but will be the
- -- parent scope in the case of a parameterless function, and we
- -- always want to use the function's parent scope.
+ -- For the anonymous function result case, retrieve the scope of the
+ -- function specification's associated entity rather than using the
+ -- current scope. The current scope will be the function itself if the
+ -- formal part is currently being analyzed, but will be the parent scope
+ -- in the case of a parameterless function, and we always want to use
+ -- the function's parent scope. Finally, if the function is a child
+ -- unit, we must traverse the the tree to retrieve the proper entity.
elsif Nkind (Related_Nod) = N_Function_Specification
and then Nkind (Parent (N)) /= N_Parameter_Specification
then
Anon_Type :=
Create_Itype
- (E_Anonymous_Access_Type, Related_Nod,
- Scope_Id => Scope (Defining_Unit_Name (Related_Nod)));
+ (E_Anonymous_Access_Type,
+ Related_Nod,
+ Scope_Id => Scope (Defining_Entity (Related_Nod)));
else
- -- For access formals, access components, and access
- -- discriminants, the scope is that of the enclosing declaration,
+ -- For access formals, access components, and access discriminants,
+ -- the scope is that of the enclosing declaration,
Anon_Type :=
Create_Itype
@@ -732,8 +765,8 @@ package body Sem_Ch3 is
Error_Msg_N ("ALL is not permitted for anonymous access types", N);
end if;
- -- Ada 2005 (AI-254): In case of anonymous access to subprograms
- -- call the corresponding semantic routine
+ -- Ada 2005 (AI-254): In case of anonymous access to subprograms call
+ -- the corresponding semantic routine
if Present (Access_To_Subprogram_Definition (N)) then
Access_Subprogram_Declaration
@@ -761,9 +794,8 @@ package body Sem_Ch3 is
Set_Depends_On_Private (Anon_Type, Has_Private_Component (Anon_Type));
-- Ada 2005 (AI-231): Ada 2005 semantics for anonymous access differs
- -- from Ada 95 semantics. In Ada 2005, anonymous access must specify
- -- if the null value is allowed. In Ada 95 the null value is never
- -- allowed.
+ -- from Ada 95 semantics. In Ada 2005, anonymous access must specify if
+ -- the null value is allowed. In Ada 95 the null value is never allowed.
if Ada_Version >= Ada_05 then
Set_Can_Never_Be_Null (Anon_Type, Null_Exclusion_Present (N));
@@ -804,9 +836,9 @@ package body Sem_Ch3 is
-- Ada 2005: if the designated type is an interface that may contain
-- tasks, create a Master entity for the declaration. This must be done
- -- before expansion of the full declaration, because the declaration
- -- may include an expression that is an allocator, whose expansion needs
- -- the proper Master for the created tasks.
+ -- before expansion of the full declaration, because the declaration may
+ -- include an expression that is an allocator, whose expansion needs the
+ -- proper Master for the created tasks.
if Nkind (Related_Nod) = N_Object_Declaration
and then Expander_Active
@@ -845,6 +877,16 @@ package body Sem_Ch3 is
end if;
end if;
+ -- For a private component of a protected type, it is imperative that
+ -- the back-end elaborate the type immediately after the protected
+ -- declaration, because this type will be used in the declarations
+ -- created for the component within each protected body, so we must
+ -- create an itype reference for it now.
+
+ if Nkind (Parent (Related_Nod)) = N_Protected_Definition then
+ Build_Itype_Reference (Anon_Type, Parent (Parent (Related_Nod)));
+ end if;
+
return Anon_Type;
end Access_Definition;
@@ -864,8 +906,8 @@ package body Sem_Ch3 is
Create_Itype (E_Subprogram_Type, Parent (T_Def));
begin
- -- Associate the Itype node with the inner full-type declaration
- -- or subprogram spec. This is required to handle nested anonymous
+ -- Associate the Itype node with the inner full-type declaration or
+ -- subprogram spec. This is required to handle nested anonymous
-- declarations. For example:
-- procedure P
@@ -1109,9 +1151,30 @@ package body Sem_Ch3 is
Last_Tag : Node_Id;
Comp : Node_Id;
+ procedure Add_Sync_Iface_Tags (T : Entity_Id);
+ -- Local subprogram used to recursively climb through the parents
+ -- of T to add the tags of all the progenitor interfaces.
+
procedure Add_Tag (Iface : Entity_Id);
-- Add tag for one of the progenitor interfaces
+ -------------------------
+ -- Add_Sync_Iface_Tags --
+ -------------------------
+
+ procedure Add_Sync_Iface_Tags (T : Entity_Id) is
+ begin
+ if Etype (T) /= T then
+ Add_Sync_Iface_Tags (Etype (T));
+ end if;
+
+ Elmt := First_Elmt (Abstract_Interfaces (T));
+ while Present (Elmt) loop
+ Add_Tag (Node (Elmt));
+ Next_Elmt (Elmt);
+ end loop;
+ end Add_Sync_Iface_Tags;
+
-------------
-- Add_Tag --
-------------
@@ -1191,69 +1254,80 @@ package body Sem_Ch3 is
end if;
end Add_Tag;
+ -- Local variables
+
+ Iface_List : List_Id;
+
-- Start of processing for Add_Interface_Tag_Components
begin
if Ekind (Typ) /= E_Record_Type
- or else No (Abstract_Interfaces (Typ))
- or else Is_Empty_Elmt_List (Abstract_Interfaces (Typ))
or else not RTE_Available (RE_Interface_Tag)
+ or else (Is_Concurrent_Record_Type (Typ)
+ and then Is_Empty_List (Abstract_Interface_List (Typ)))
+ or else (not Is_Concurrent_Record_Type (Typ)
+ and then No (Abstract_Interfaces (Typ))
+ and then Is_Empty_Elmt_List (Abstract_Interfaces (Typ)))
then
return;
end if;
- if Present (Abstract_Interfaces (Typ)) then
+ -- Find the current last tag
+
+ if Nkind (Type_Definition (N)) = N_Derived_Type_Definition then
+ Ext := Record_Extension_Part (Type_Definition (N));
+ else
+ pragma Assert (Nkind (Type_Definition (N)) = N_Record_Definition);
+ Ext := Type_Definition (N);
+ end if;
- -- Find the current last tag
+ Last_Tag := Empty;
+ if not (Present (Component_List (Ext))) then
+ Set_Null_Present (Ext, False);
+ L := New_List;
+ Set_Component_List (Ext,
+ Make_Component_List (Loc,
+ Component_Items => L,
+ Null_Present => False));
+ else
if Nkind (Type_Definition (N)) = N_Derived_Type_Definition then
- Ext := Record_Extension_Part (Type_Definition (N));
+ L := Component_Items
+ (Component_List
+ (Record_Extension_Part
+ (Type_Definition (N))));
else
- pragma Assert (Nkind (Type_Definition (N)) = N_Record_Definition);
- Ext := Type_Definition (N);
+ L := Component_Items
+ (Component_List
+ (Type_Definition (N)));
end if;
- Last_Tag := Empty;
+ -- Find the last tag component
- if not (Present (Component_List (Ext))) then
- Set_Null_Present (Ext, False);
- L := New_List;
- Set_Component_List (Ext,
- Make_Component_List (Loc,
- Component_Items => L,
- Null_Present => False));
- else
- if Nkind (Type_Definition (N)) = N_Derived_Type_Definition then
- L := Component_Items
- (Component_List
- (Record_Extension_Part
- (Type_Definition (N))));
- else
- L := Component_Items
- (Component_List
- (Type_Definition (N)));
+ Comp := First (L);
+ while Present (Comp) loop
+ if Is_Tag (Defining_Identifier (Comp)) then
+ Last_Tag := Comp;
end if;
- -- Find the last tag component
-
- Comp := First (L);
- while Present (Comp) loop
- if Is_Tag (Defining_Identifier (Comp)) then
- Last_Tag := Comp;
- end if;
+ Next (Comp);
+ end loop;
+ end if;
- Next (Comp);
- end loop;
- end if;
+ -- At this point L references the list of components and Last_Tag
+ -- references the current last tag (if any). Now we add the tag
+ -- corresponding with all the interfaces that are not implemented
+ -- by the parent.
- -- At this point L references the list of components and Last_Tag
- -- references the current last tag (if any). Now we add the tag
- -- corresponding with all the interfaces that are not implemented
- -- by the parent.
+ if Is_Concurrent_Record_Type (Typ) then
+ Iface_List := Abstract_Interface_List (Typ);
- pragma Assert (Present
- (First_Elmt (Abstract_Interfaces (Typ))));
+ if Is_Non_Empty_List (Iface_List) then
+ Add_Sync_Iface_Tags (Etype (First (Iface_List)));
+ end if;
+ end if;
+ if Present (Abstract_Interfaces (Typ)) then
Elmt := First_Elmt (Abstract_Interfaces (Typ));
while Present (Elmt) loop
Add_Tag (Node (Elmt));
@@ -1396,7 +1470,7 @@ package body Sem_Ch3 is
(Access_Definition
(Component_Definition (N))))
then
- T := Replace_Anonymous_Access_To_Protected_Subprogram (N, T);
+ T := Replace_Anonymous_Access_To_Protected_Subprogram (N);
end if;
end if;
@@ -1485,7 +1559,7 @@ package body Sem_Ch3 is
-- Components cannot be abstract, except for the special case of
-- the _Parent field (case of extending an abstract tagged type)
- elsif Is_Abstract (T) and then Chars (Id) /= Name_uParent then
+ elsif Is_Abstract_Type (T) and then Chars (Id) /= Name_uParent then
Error_Msg_N ("type of a component cannot be abstract", N);
end if;
@@ -1674,11 +1748,19 @@ package body Sem_Ch3 is
end if;
-- If next node is a body then freeze all types before the body.
- -- An exception occurs for expander generated bodies, which can
- -- be recognized by their already being analyzed. The expander
- -- ensures that all types needed by these bodies have been frozen
- -- but it is not necessary to freeze all types (and would be wrong
- -- since it would not correspond to an RM defined freeze point).
+ -- An exception occurs for some expander-generated bodies. If these
+ -- are generated at places where in general language rules would not
+ -- allow a freeze point, then we assume that the expander has
+ -- explicitly checked that all required types are properly frozen,
+ -- and we do not cause general freezing here. This special circuit
+ -- is used when the encountered body is marked as having already
+ -- been analyzed.
+
+ -- In all other cases (bodies that come from source, and expander
+ -- generated bodies that have not been analyzed yet), freeze all
+ -- types now. Note that in the latter case, the expander must take
+ -- care to attach the bodies at a proper place in the tree so as to
+ -- not cause unwanted freezing at that point.
elsif not Analyzed (Next_Node)
and then (Nkind (Next_Node) = N_Subprogram_Body
@@ -1765,8 +1847,8 @@ package body Sem_Ch3 is
-- Type is abstract if full declaration carries keyword, or if
-- previous partial view did.
- Set_Is_Abstract (T);
- Set_Is_Interface (T);
+ Set_Is_Abstract_Type (T);
+ Set_Is_Interface (T);
Set_Is_Limited_Interface (T, Limited_Present (Def));
Set_Is_Protected_Interface (T, Protected_Present (Def));
@@ -2061,6 +2143,15 @@ package body Sem_Ch3 is
T := Find_Type_Of_Object (Object_Definition (N), N);
+ if Nkind (Object_Definition (N)) = N_Access_Definition
+ and then Present
+ (Access_To_Subprogram_Definition (Object_Definition (N)))
+ and then Protected_Present
+ (Access_To_Subprogram_Definition (Object_Definition (N)))
+ then
+ T := Replace_Anonymous_Access_To_Protected_Subprogram (N);
+ end if;
+
if Error_Posted (Id) then
Set_Etype (Id, T);
Set_Ekind (Id, E_Variable);
@@ -2241,7 +2332,7 @@ package body Sem_Ch3 is
-- x'class'input where x is abstract) where we legitimately
-- generate an abstract object.
- if Is_Abstract (T) and then Comes_From_Source (N) then
+ if Is_Abstract_Type (T) and then Comes_From_Source (N) then
Error_Msg_N ("type of object cannot be abstract",
Object_Definition (N));
@@ -3035,7 +3126,7 @@ package body Sem_Ch3 is
if Is_Tagged_Type (T) then
Set_Is_Tagged_Type (Id);
- Set_Is_Abstract (Id, Is_Abstract (T));
+ Set_Is_Abstract_Type (Id, Is_Abstract_Type (T));
Set_Primitive_Operations
(Id, Primitive_Operations (T));
Set_Class_Wide_Type (Id, Class_Wide_Type (T));
@@ -3053,11 +3144,10 @@ package body Sem_Ch3 is
(Id, Has_Unknown_Discriminants (T));
if Is_Tagged_Type (T) then
- Set_Is_Tagged_Type (Id);
- Set_Is_Abstract (Id, Is_Abstract (T));
- Set_Primitive_Operations
- (Id, Primitive_Operations (T));
- Set_Class_Wide_Type (Id, Class_Wide_Type (T));
+ Set_Is_Tagged_Type (Id);
+ Set_Is_Abstract_Type (Id, Is_Abstract_Type (T));
+ Set_Primitive_Operations (Id, Primitive_Operations (T));
+ Set_Class_Wide_Type (Id, Class_Wide_Type (T));
end if;
-- In general the attributes of the subtype of a private type
@@ -3275,6 +3365,7 @@ package body Sem_Ch3 is
if R /= Error then
Analyze (R);
Set_Etype (N, Etype (R));
+ Resolve (R, Entity (T));
else
Set_Error_Posted (R);
Set_Error_Posted (T);
@@ -3293,10 +3384,9 @@ package body Sem_Ch3 is
Is_Remote : constant Boolean :=
(Is_Remote_Types (Current_Scope)
- or else Is_Remote_Call_Interface (Current_Scope))
- and then not (In_Private_Part (Current_Scope)
- or else
- In_Package_Body (Current_Scope));
+ or else Is_Remote_Call_Interface (Current_Scope))
+ and then not (In_Private_Part (Current_Scope)
+ or else In_Package_Body (Current_Scope));
procedure Check_Ops_From_Incomplete_Type;
-- If there is a tagged incomplete partial view of the type, transfer
@@ -3351,11 +3441,24 @@ package body Sem_Ch3 is
-- Ada 2005 (AI-50217): If the type was previously decorated when
-- imported through a LIMITED WITH clause, it appears as incomplete
-- but has no full view.
+ -- If the incomplete view is tagged, a class_wide type has been
+ -- created already. Use it for the full view as well, to prevent
+ -- multiple incompatible class-wide types that may be created for
+ -- self-referential anonymous access components.
if Ekind (Prev) = E_Incomplete_Type
and then Present (Full_View (Prev))
then
T := Full_View (Prev);
+
+ if Is_Tagged_Type (Prev)
+ and then Present (Class_Wide_Type (Prev))
+ then
+ Set_Ekind (T, Ekind (Prev)); -- will be reset later
+ Set_Class_Wide_Type (T, Class_Wide_Type (Prev));
+ Set_Etype (Class_Wide_Type (T), T);
+ end if;
+
else
T := Prev;
end if;
@@ -3517,7 +3620,18 @@ package body Sem_Ch3 is
-- made which is the "real" entity, i.e. the one swapped in,
-- and the second parameter provides the reference location.
- Generate_Reference (T, T, 'c');
+ -- Also, we want to kill Has_Pragma_Unreferenced temporarily here
+ -- since we don't want a complaint about the full type being an
+ -- unwanted reference to the private type
+
+ declare
+ B : constant Boolean := Has_Pragma_Unreferenced (T);
+ begin
+ Set_Has_Pragma_Unreferenced (T, False);
+ Generate_Reference (T, T, 'c');
+ Set_Has_Pragma_Unreferenced (T, B);
+ end;
+
Set_Completion_Referenced (Def_Id);
-- For completion of incomplete type, process incomplete dependents
@@ -3727,11 +3841,21 @@ package body Sem_Ch3 is
-- Ada 2005 (AI-230): Access Definition case
else pragma Assert (Present (Access_Definition (Component_Def)));
+
+ -- Indicate that the anonymous access type is created by the
+ -- array type declaration.
+
Element_Type := Access_Definition
- (Related_Nod => Related_Id,
+ (Related_Nod => P,
N => Access_Definition (Component_Def));
Set_Is_Local_Anonymous_Access (Element_Type);
+ -- Propagate the parent. This field is needed if we have to generate
+ -- the master_id associated with an anonymous access to task type
+ -- component (see Expand_N_Full_Type_Declaration.Build_Master)
+
+ Set_Parent (Element_Type, Parent (T));
+
-- Ada 2005 (AI-230): In case of components that are anonymous
-- access types the level of accessibility depends on the enclosing
-- type declaration
@@ -3747,8 +3871,7 @@ package body Sem_Ch3 is
begin
if Present (CD) and then Protected_Present (CD) then
Element_Type :=
- Replace_Anonymous_Access_To_Protected_Subprogram
- (Def, Element_Type);
+ Replace_Anonymous_Access_To_Protected_Subprogram (Def);
end if;
end;
end if;
@@ -3782,18 +3905,19 @@ package body Sem_Ch3 is
-- Complete setup of implicit base type
- Set_First_Index (Implicit_Base, First_Index (T));
- Set_Component_Type (Implicit_Base, Element_Type);
- Set_Has_Task (Implicit_Base, Has_Task (Element_Type));
- Set_Component_Size (Implicit_Base, Uint_0);
+ Set_First_Index (Implicit_Base, First_Index (T));
+ Set_Component_Type (Implicit_Base, Element_Type);
+ Set_Has_Task (Implicit_Base, Has_Task (Element_Type));
+ Set_Component_Size (Implicit_Base, Uint_0);
+ Set_Packed_Array_Type (Implicit_Base, Empty);
Set_Has_Controlled_Component
- (Implicit_Base, Has_Controlled_Component
- (Element_Type)
- or else
- Is_Controlled (Element_Type));
+ (Implicit_Base, Has_Controlled_Component
+ (Element_Type)
+ or else Is_Controlled
+ (Element_Type));
Set_Finalize_Storage_Only
- (Implicit_Base, Finalize_Storage_Only
- (Element_Type));
+ (Implicit_Base, Finalize_Storage_Only
+ (Element_Type));
-- Unconstrained array case
@@ -3815,7 +3939,10 @@ package body Sem_Ch3 is
(Element_Type));
end if;
+ -- Common attributes for both cases
+
Set_Component_Type (Base_Type (T), Element_Type);
+ Set_Packed_Array_Type (T, Empty);
if Aliased_Present (Component_Definition (Def)) then
Set_Has_Aliased_Components (Etype (T));
@@ -3885,7 +4012,7 @@ package body Sem_Ch3 is
("unconstrained element type in array declaration",
Subtype_Indication (Component_Def));
- elsif Is_Abstract (Element_Type) then
+ elsif Is_Abstract_Type (Element_Type) then
Error_Msg_N
("the type of a component cannot be abstract",
Subtype_Indication (Component_Def));
@@ -3898,8 +4025,7 @@ package body Sem_Ch3 is
------------------------------------------------------
function Replace_Anonymous_Access_To_Protected_Subprogram
- (N : Node_Id;
- Prev_E : Entity_Id) return Entity_Id
+ (N : Node_Id) return Entity_Id
is
Loc : constant Source_Ptr := Sloc (N);
@@ -3923,15 +4049,19 @@ package body Sem_Ch3 is
N_Unconstrained_Array_Definition |
N_Constrained_Array_Definition =>
Comp := Component_Definition (N);
- Acc := Access_Definition (Component_Definition (N));
+ Acc := Access_Definition (Comp);
when N_Discriminant_Specification =>
Comp := Discriminant_Type (N);
- Acc := Discriminant_Type (N);
+ Acc := Comp;
when N_Parameter_Specification =>
Comp := Parameter_Type (N);
- Acc := Parameter_Type (N);
+ Acc := Comp;
+
+ when N_Object_Declaration =>
+ Comp := Object_Definition (N);
+ Acc := Comp;
when others =>
raise Program_Error;
@@ -3969,6 +4099,11 @@ package body Sem_Ch3 is
Rewrite (Comp, New_Occurrence_Of (Anon, Loc));
Set_Etype (Defining_Identifier (N), Anon);
Set_Null_Exclusion_Present (N, False);
+
+ elsif Nkind (N) = N_Object_Declaration then
+ Rewrite (Comp, New_Occurrence_Of (Anon, Loc));
+ Set_Etype (Defining_Identifier (N), Anon);
+
else
Rewrite (Comp,
Make_Component_Definition (Loc,
@@ -3980,11 +4115,15 @@ package body Sem_Ch3 is
-- Temporarily remove the current scope from the stack to add the new
-- declarations to the enclosing scope
- Scope_Stack.Decrement_Last;
- Analyze (Decl);
- Scope_Stack.Append (Curr_Scope);
+ if Nkind (N) /= N_Object_Declaration then
+ Scope_Stack.Decrement_Last;
+ Analyze (Decl);
+ Scope_Stack.Append (Curr_Scope);
+ else
+ Analyze (Decl);
+ end if;
- Set_Original_Access_Type (Anon, Prev_E);
+ Set_Ekind (Anon, E_Anonymous_Access_Protected_Subprogram_Type);
return Anon;
end Replace_Anonymous_Access_To_Protected_Subprogram;
@@ -5134,32 +5273,25 @@ package body Sem_Ch3 is
-- be possibly non-private. We build a underlying full view that
-- will be installed when the enclosing child body is compiled.
- declare
- IR : constant Node_Id := Make_Itype_Reference (Sloc (N));
+ Full_Der :=
+ Make_Defining_Identifier (Sloc (Derived_Type),
+ Chars => Chars (Derived_Type));
+ Set_Is_Itype (Full_Der);
+ Build_Itype_Reference (Full_Der, N);
- begin
- Full_Der :=
- Make_Defining_Identifier (Sloc (Derived_Type),
- Chars (Derived_Type));
- Set_Is_Itype (Full_Der);
- Set_Itype (IR, Full_Der);
- Insert_After (N, IR);
-
- -- The full view will be used to swap entities on entry/exit
- -- to the body, and must appear in the entity list for the
- -- package.
-
- Append_Entity (Full_Der, Scope (Derived_Type));
- Set_Has_Private_Declaration (Full_Der);
- Set_Has_Private_Declaration (Derived_Type);
- Set_Associated_Node_For_Itype (Full_Der, N);
- Set_Parent (Full_Der, Parent (Derived_Type));
- Full_P := Full_View (Parent_Type);
- Exchange_Declarations (Parent_Type);
- Copy_And_Build;
- Exchange_Declarations (Full_P);
- Set_Underlying_Full_View (Derived_Type, Full_Der);
- end;
+ -- The full view will be used to swap entities on entry/exit to
+ -- the body, and must appear in the entity list for the package.
+
+ Append_Entity (Full_Der, Scope (Derived_Type));
+ Set_Has_Private_Declaration (Full_Der);
+ Set_Has_Private_Declaration (Derived_Type);
+ Set_Associated_Node_For_Itype (Full_Der, N);
+ Set_Parent (Full_Der, Parent (Derived_Type));
+ Full_P := Full_View (Parent_Type);
+ Exchange_Declarations (Parent_Type);
+ Copy_And_Build;
+ Exchange_Declarations (Full_P);
+ Set_Underlying_Full_View (Derived_Type, Full_Der);
end if;
end if;
end Build_Derived_Private_Type;
@@ -5179,12 +5311,12 @@ package body Sem_Ch3 is
-- type R (...) is [tagged] record ... end record;
-- type T (...) is new R (...) [with ...];
- -- The representation clauses of T can specify a completely different
- -- record layout from R's. Hence the same component can be placed in
- -- two very different positions in objects of type T and R. If R and T
- -- are tagged types, representation clauses for T can only specify the
- -- layout of non inherited components, thus components that are common
- -- in R and T have the same position in objects of type R and T.
+ -- The representation clauses for T can specify a completely different
+ -- record layout from R's. Hence the same component can be placed in two
+ -- very different positions in objects of type T and R. If R and are tagged
+ -- types, representation clauses for T can only specify the layout of non
+ -- inherited components, thus components that are common in R and T have
+ -- the same position in objects of type R and T.
-- This has two implications. The first is that the entire tree for R's
-- declaration needs to be copied for T in the untagged case, so that T
@@ -5651,23 +5783,28 @@ package body Sem_Ch3 is
end if;
-- Before we start the previously documented transformations, here is
- -- a little fix for size and alignment of tagged types. Normally when
- -- we derive type D from type P, we copy the size and alignment of P
- -- as the default for D, and in the absence of explicit representation
- -- clauses for D, the size and alignment are indeed the same as the
- -- parent.
+ -- little fix for size and alignment of tagged types. Normally when we
+ -- derive type D from type P, we copy the size and alignment of P as the
+ -- default for D, and in the absence of explicit representation clauses
+ -- for D, the size and alignment are indeed the same as the parent.
+
+ -- But this is wrong for tagged types, since fields may be added, and
+ -- the default size may need to be larger, and the default alignment may
+ -- need to be larger.
- -- But this is wrong for tagged types, since fields may be added,
- -- and the default size may need to be larger, and the default
- -- alignment may need to be larger.
+ -- We therefore reset the size and alignment fields in the tagged case.
+ -- Note that the size and alignment will in any case be at least as
+ -- large as the parent type (since the derived type has a copy of the
+ -- parent type in the _parent field)
- -- We therefore reset the size and alignment fields in the tagged
- -- case. Note that the size and alignment will in any case be at
- -- least as large as the parent type (since the derived type has
- -- a copy of the parent type in the _parent field)
+ -- The type is also marked as being tagged here, which is needed when
+ -- processing components with a self-referential anonymous access type
+ -- in the call to Check_Anonymous_Access_Components below. Note that
+ -- this flag is also set later on for completeness.
if Is_Tagged then
- Init_Size_Align (Derived_Type);
+ Set_Is_Tagged_Type (Derived_Type);
+ Init_Size_Align (Derived_Type);
end if;
-- STEP 0a: figure out what kind of derived type declaration we have
@@ -5688,6 +5825,16 @@ package body Sem_Ch3 is
if Present (Record_Extension_Part (Type_Def)) then
Set_Ekind (Derived_Type, E_Record_Type);
+
+ -- Create internal access types for components with anonymous
+ -- access types.
+
+ if Ada_Version >= Ada_05 then
+ Check_Anonymous_Access_Components
+ (N, Derived_Type, Derived_Type,
+ Component_List (Record_Extension_Part (Type_Def)));
+ end if;
+
else
Set_Ekind (Derived_Type, Ekind (Parent_Base));
end if;
@@ -5966,7 +6113,6 @@ package body Sem_Ch3 is
if Ada_Version = Ada_05
and then Is_Tagged
then
-
-- "The declaration of a specific descendant of an interface type
-- freezes the interface type" (RM 13.14).
@@ -6198,7 +6344,10 @@ package body Sem_Ch3 is
and then Ekind (Derived_Type) /= E_Private_Type
and then Ekind (Derived_Type) /= E_Limited_Private_Type
then
- Set_Is_Interface (Derived_Type, Interface_Present (Type_Def));
+ if Interface_Present (Type_Def) then
+ Analyze_Interface_Declaration (Derived_Type, Type_Def);
+ end if;
+
Set_Abstract_Interfaces (Derived_Type, No_Elist);
end if;
@@ -6210,13 +6359,16 @@ package body Sem_Ch3 is
(Derived_Type, Has_Specified_Layout (Parent_Type));
Set_Is_Limited_Composite
(Derived_Type, Is_Limited_Composite (Parent_Type));
- Set_Is_Limited_Record
- (Derived_Type,
- Is_Limited_Record (Parent_Type)
- and then not Is_Interface (Parent_Type));
Set_Is_Private_Composite
(Derived_Type, Is_Private_Composite (Parent_Type));
+ if not Is_Limited_Record (Derived_Type) then
+ Set_Is_Limited_Record
+ (Derived_Type,
+ Is_Limited_Record (Parent_Type)
+ and then not Is_Interface (Parent_Type));
+ end if;
+
-- Fields inherited from the Parent_Base
Set_Has_Controlled_Component
@@ -6278,7 +6430,7 @@ package body Sem_Ch3 is
end if;
Make_Class_Wide_Type (Derived_Type);
- Set_Is_Abstract (Derived_Type, Abstract_Present (Type_Def));
+ Set_Is_Abstract_Type (Derived_Type, Abstract_Present (Type_Def));
if Has_Discriminants (Derived_Type)
and then Constraint_Present
@@ -6287,13 +6439,17 @@ package body Sem_Ch3 is
(Derived_Type, Expand_To_Stored_Constraint (Parent_Base, Discs));
end if;
- -- Ada 2005 (AI-251): Collect the list of progenitors that are not
- -- already in the parents.
-
if Ada_Version >= Ada_05 then
declare
Ifaces_List : Elist_Id;
begin
+ -- Check ARM rules 3.9.4 (15/2), 9.1 (9.d/2) and 9.4 (11.d/2)
+
+ Check_Abstract_Interfaces (N, Type_Def);
+
+ -- Ada 2005 (AI-251): Collect the list of progenitors that are
+ -- not already in the parents.
+
Collect_Abstract_Interfaces
(T => Derived_Type,
Ifaces_List => Ifaces_List,
@@ -6395,7 +6551,9 @@ package body Sem_Ch3 is
-- Ada 2005 (AI-251): Addition of the Tag corresponding to all the
-- implemented interfaces if we are in expansion mode
- if Expander_Active then
+ if Expander_Active
+ and then Has_Abstract_Interfaces (Derived_Type)
+ then
Add_Interface_Tag_Components (N, Derived_Type);
end if;
@@ -7025,7 +7183,7 @@ package body Sem_Ch3 is
Set_Primitive_Operations (Def_Id, Primitive_Operations (T));
end if;
- Set_Is_Abstract (Def_Id, Is_Abstract (T));
+ Set_Is_Abstract_Type (Def_Id, Is_Abstract_Type (T));
end if;
-- Subtypes introduced by component declarations do not need to be
@@ -7059,6 +7217,20 @@ package body Sem_Ch3 is
end if;
end Build_Discriminated_Subtype;
+ ---------------------------
+ -- Build_Itype_Reference --
+ ---------------------------
+
+ procedure Build_Itype_Reference
+ (Ityp : Entity_Id;
+ Nod : Node_Id)
+ is
+ IR : constant Node_Id := Make_Itype_Reference (Sloc (Nod));
+ begin
+ Set_Itype (IR, Ityp);
+ Insert_After (Nod, IR);
+ end Build_Itype_Reference;
+
------------------------
-- Build_Scalar_Bound --
------------------------
@@ -7207,6 +7379,131 @@ package body Sem_Ch3 is
end Build_Underlying_Full_View;
-------------------------------
+ -- Check_Abstract_Interfaces --
+ -------------------------------
+
+ procedure Check_Abstract_Interfaces (N : Node_Id; Def : Node_Id) is
+
+ procedure Check_Ifaces (Iface_Def : Node_Id; Error_Node : Node_Id);
+ -- Local subprogram used to avoid code duplication. In case of error
+ -- the message will be associated to Error_Node.
+
+ ------------------
+ -- Check_Ifaces --
+ ------------------
+
+ procedure Check_Ifaces (Iface_Def : Node_Id; Error_Node : Node_Id) is
+ begin
+ -- Ada 2005 (AI-345): Protected interfaces can only inherit from
+ -- limited, synchronized or protected interfaces.
+
+ if Protected_Present (Def) then
+ if Limited_Present (Iface_Def)
+ or else Synchronized_Present (Iface_Def)
+ or else Protected_Present (Iface_Def)
+ then
+ null;
+
+ elsif Task_Present (Iface_Def) then
+ Error_Msg_N ("(Ada 2005) protected interface cannot inherit"
+ & " from task interface", Error_Node);
+
+ else
+ Error_Msg_N ("(Ada 2005) protected interface cannot inherit"
+ & " from non-limited interface", Error_Node);
+ end if;
+
+ -- Ada 2005 (AI-345): Synchronized interfaces can only inherit from
+ -- limited and synchronized.
+
+ elsif Synchronized_Present (Def) then
+ if Limited_Present (Iface_Def)
+ or else Synchronized_Present (Iface_Def)
+ then
+ null;
+
+ elsif Protected_Present (Iface_Def) then
+ Error_Msg_N ("(Ada 2005) synchronized interface cannot inherit"
+ & " from protected interface", Error_Node);
+
+ elsif Task_Present (Iface_Def) then
+ Error_Msg_N ("(Ada 2005) synchronized interface cannot inherit"
+ & " from task interface", Error_Node);
+
+ else
+ Error_Msg_N ("(Ada 2005) synchronized interface cannot inherit"
+ & " from non-limited interface", Error_Node);
+ end if;
+
+ -- Ada 2005 (AI-345): Task interfaces can only inherit from limited,
+ -- synchronized or task interfaces.
+
+ elsif Task_Present (Def) then
+ if Limited_Present (Iface_Def)
+ or else Synchronized_Present (Iface_Def)
+ or else Task_Present (Iface_Def)
+ then
+ null;
+
+ elsif Protected_Present (Iface_Def) then
+ Error_Msg_N ("(Ada 2005) task interface cannot inherit from"
+ & " protected interface", Error_Node);
+
+ else
+ Error_Msg_N ("(Ada 2005) task interface cannot inherit from"
+ & " non-limited interface", Error_Node);
+ end if;
+ end if;
+ end Check_Ifaces;
+
+ -- Local variables
+
+ Iface : Node_Id;
+ Iface_Def : Node_Id;
+ Iface_Typ : Entity_Id;
+
+ -- Start of processing for Check_Abstract_Interfaces
+
+ begin
+ -- Why is this still unsupported???
+
+ if Nkind (N) = N_Private_Extension_Declaration then
+ return;
+ end if;
+
+ -- Check the parent in case of derivation of interface type
+
+ if Nkind (Type_Definition (N)) = N_Derived_Type_Definition
+ and then Is_Interface (Etype (Defining_Identifier (N)))
+ then
+ Check_Ifaces
+ (Iface_Def => Type_Definition
+ (Parent (Etype (Defining_Identifier (N)))),
+ Error_Node => Subtype_Indication (Type_Definition (N)));
+ end if;
+
+ Iface := First (Interface_List (Def));
+ while Present (Iface) loop
+ Iface_Typ := Find_Type_Of_Subtype_Indic (Iface);
+ Iface_Def := Type_Definition (Parent (Iface_Typ));
+
+ if not Is_Interface (Iface_Typ) then
+ Error_Msg_NE ("(Ada 2005) & must be an interface",
+ Iface, Iface_Typ);
+
+ else
+ -- "The declaration of a specific descendant of an interface
+ -- type freezes the interface type" RM 13.14
+
+ Freeze_Before (N, Iface_Typ);
+ Check_Ifaces (Iface_Def, Error_Node => Iface);
+ end if;
+
+ Next (Iface);
+ end loop;
+ end Check_Abstract_Interfaces;
+
+ -------------------------------
-- Check_Abstract_Overriding --
-------------------------------
@@ -7231,19 +7528,23 @@ package body Sem_Ch3 is
-- come from source, and the associated source location is the
-- location of the first subtype of the derived type.
+ -- Ada 2005 (AI-228): Apply the rules of RM-3.9.3(6/2) for
+ -- subprograms that "require overriding".
+
-- Special exception, do not complain about failure to override the
-- stream routines _Input and _Output, as well as the primitive
-- operations used in dispatching selects since we always provide
-- automatic overridings for these subprograms.
- if (Is_Abstract (Subp)
- or else (Has_Controlling_Result (Subp)
- and then Present (Alias_Subp)
- and then not Comes_From_Source (Subp)
- and then Sloc (Subp) = Sloc (First_Subtype (T))))
+ if (Is_Abstract_Subprogram (Subp)
+ or else Requires_Overriding (Subp)
+ or else (Has_Controlling_Result (Subp)
+ and then Present (Alias_Subp)
+ and then not Comes_From_Source (Subp)
+ and then Sloc (Subp) = Sloc (First_Subtype (T))))
and then not Is_TSS (Subp, TSS_Stream_Input)
and then not Is_TSS (Subp, TSS_Stream_Output)
- and then not Is_Abstract (T)
+ and then not Is_Abstract_Type (T)
and then Chars (Subp) /= Name_uDisp_Asynchronous_Select
and then Chars (Subp) /= Name_uDisp_Conditional_Select
and then Chars (Subp) /= Name_uDisp_Get_Prim_Op_Kind
@@ -7280,7 +7581,8 @@ package body Sem_Ch3 is
or else not Is_Null_Extension (T)
or else Ekind (Subp) = E_Procedure
or else not Has_Controlling_Result (Subp)
- or else Is_Abstract (Alias_Subp)
+ or else Is_Abstract_Subprogram (Alias_Subp)
+ or else Requires_Overriding (Subp)
or else Is_Access_Type (Etype (Subp)))
then
Error_Msg_NE
@@ -7347,12 +7649,17 @@ package body Sem_Ch3 is
end if;
else
- Error_Msg_NE
- ("abstract subprogram not allowed for type&",
- Subp, T);
- Error_Msg_NE
- ("nonabstract type has abstract subprogram&",
- T, Subp);
+ Error_Msg_Node_2 := T;
+ Error_Msg_N
+ ("abstract subprogram& not allowed for type&", Subp);
+
+ -- Also post unconditional warning on the type (unconditional
+ -- so that if there are more than one of these cases, we get
+ -- them all, and not just the first one).
+
+ Error_Msg_Node_2 := Subp;
+ Error_Msg_N
+ ("nonabstract type& has abstract subprogram&!", T);
end if;
end if;
@@ -7479,7 +7786,7 @@ package body Sem_Ch3 is
-- If a generated entity has no completion, then either previous
-- semantic errors have disabled the expansion phase, or else we had
- -- missing subunits, or else we are compiling without expan- sion,
+ -- missing subunits, or else we are compiling without expansion,
-- or else something is very wrong.
if not Comes_From_Source (E) then
@@ -7571,13 +7878,23 @@ package body Sem_Ch3 is
-- be flagged as requiring completion, because it is a
-- compilation unit.
+ -- Ignore missing completion for a subprogram that does not come from
+ -- source (including the _Call primitive operation of RAS types,
+ -- which has to have the flag Comes_From_Source for other purposes):
+ -- we assume that the expander will provide the missing completion.
+
elsif Ekind (E) = E_Function
or else Ekind (E) = E_Procedure
or else Ekind (E) = E_Generic_Function
or else Ekind (E) = E_Generic_Procedure
then
if not Has_Completion (E)
- and then not Is_Abstract (E)
+ and then not (Is_Subprogram (E)
+ and then Is_Abstract_Subprogram (E))
+ and then not (Is_Subprogram (E)
+ and then
+ (not Comes_From_Source (E)
+ or else Chars (E) = Name_uCall))
and then Nkind (Parent (Unit_Declaration_Node (E))) /=
N_Compilation_Unit
and then Chars (E) /= Name_uSize
@@ -8310,6 +8627,7 @@ package body Sem_Ch3 is
-- a derivation from a private type) has no discriminants.
-- (Defect Report 8652/0008, Technical Corrigendum 1, checked
-- by ACATS B371001).
+
-- Rule updated for Ada 2005: the private type is said to have
-- a constrained partial view, given that objects of the type
-- can be declared.
@@ -8401,12 +8719,19 @@ package body Sem_Ch3 is
-- generic body, the rule is checked assuming that the actual type has
-- defaulted discriminants.
- if Ada_Version >= Ada_05 then
+ if Ada_Version >= Ada_05 or else Warn_On_Ada_2005_Compatibility then
if Ekind (Base_Type (T)) = E_General_Access_Type
and then Has_Defaulted_Discriminants (Desig_Type)
then
- Error_Msg_N
- ("access subype of general access type not allowed", S);
+ if Ada_Version < Ada_05 then
+ Error_Msg_N
+ ("access subtype of general access type would not " &
+ "be allowed in Ada 2005?", S);
+ else
+ Error_Msg_N
+ ("access subype of general access type not allowed", S);
+ end if;
+
Error_Msg_N ("\discriminants have defaults", S);
elsif Is_Access_Type (T)
@@ -8414,7 +8739,15 @@ package body Sem_Ch3 is
and then Has_Discriminants (Desig_Type)
and then In_Package_Body (Current_Scope)
then
- Error_Msg_N ("access subtype not allowed in generic body", S);
+ if Ada_Version < Ada_05 then
+ Error_Msg_N
+ ("access subtype would not be allowed in generic body " &
+ "in Ada 2005?", S);
+ else
+ Error_Msg_N
+ ("access subtype not allowed in generic body", S);
+ end if;
+
Error_Msg_N
("\designated type is a discriminated formal", S);
end if;
@@ -9648,6 +9981,10 @@ package body Sem_Ch3 is
Set_Is_Public (Full, Is_Public (Priv));
Set_Is_Pure (Full, Is_Pure (Priv));
Set_Is_Tagged_Type (Full, Is_Tagged_Type (Priv));
+ Set_Has_Pragma_Unreferenced (Full, Has_Pragma_Unreferenced (Priv));
+ Set_Has_Pragma_Unreferenced_Objects
+ (Full, Has_Pragma_Unreferenced_Objects
+ (Priv));
Conditional_Delay (Full, Priv);
@@ -10379,7 +10716,13 @@ package body Sem_Ch3 is
Subp := Node (Elmt);
Iface := Find_Dispatching_Type (Subp);
- if not Is_Ancestor (Iface, Tagged_Type) then
+ if Is_Concurrent_Record_Type (Tagged_Type) then
+ if not Present (Abstract_Interface_Alias (Subp)) then
+ Derive_Subprogram (New_Subp, Subp, Tagged_Type, Iface);
+ Append_Elmt (New_Subp, Ifaces_List);
+ end if;
+
+ elsif not Is_Parent (Iface, Tagged_Type) then
Derive_Subprogram (New_Subp, Subp, Tagged_Type, Iface);
Append_Elmt (New_Subp, Ifaces_List);
end if;
@@ -10441,7 +10784,8 @@ package body Sem_Ch3 is
Set_Is_Hidden (Iface_Subp);
Set_Abstract_Interface_Alias (Iface_Subp, Alias (Iface_Subp));
Set_Alias (Iface_Subp, E);
- Set_Is_Abstract (Iface_Subp, Is_Abstract (E));
+ Set_Is_Abstract_Subprogram (Iface_Subp,
+ Is_Abstract_Subprogram (E));
Remove_Homonym (Iface_Subp);
Next_Elmt (Elmt);
@@ -10527,7 +10871,6 @@ package body Sem_Ch3 is
procedure Replace_Type (Id, New_Id : Entity_Id) is
Acc_Type : Entity_Id;
- IR : Node_Id;
Par : constant Node_Id := Parent (Derived_Type);
begin
@@ -10578,10 +10921,7 @@ package body Sem_Ch3 is
Set_Scope (New_Id, New_Subp);
-- Create a reference to it
-
- IR := Make_Itype_Reference (Sloc (Parent (Derived_Type)));
- Set_Itype (IR, Acc_Type);
- Insert_After (Parent (Derived_Type), IR);
+ Build_Itype_Reference (Acc_Type, Parent (Derived_Type));
else
Set_Etype (New_Id, Etype (Id));
@@ -10802,16 +11142,42 @@ package body Sem_Ch3 is
-- function is not abstract unless the actual is.
if Is_Generic_Type (Derived_Type)
- and then not Is_Abstract (Derived_Type)
+ and then not Is_Abstract_Type (Derived_Type)
then
null;
- elsif Is_Abstract (Alias (New_Subp))
- or else (Is_Tagged_Type (Derived_Type)
- and then Etype (New_Subp) = Derived_Type
- and then No (Actual_Subp))
+ -- Ada 2005 (AI-228): Calculate the "require overriding" and "abstract"
+ -- properties of the subprogram, as defined in RM-3.9.3(4/2-6/2).
+
+ elsif Ada_Version >= Ada_05
+ and then (Is_Abstract_Subprogram (Alias (New_Subp))
+ or else (Is_Tagged_Type (Derived_Type)
+ and then Etype (New_Subp) = Derived_Type
+ and then not Is_Null_Extension (Derived_Type))
+ or else (Is_Tagged_Type (Derived_Type)
+ and then Ekind (Etype (New_Subp)) =
+ E_Anonymous_Access_Type
+ and then Designated_Type (Etype (New_Subp)) =
+ Derived_Type
+ and then not Is_Null_Extension (Derived_Type)))
+ and then No (Actual_Subp)
+ then
+ if not Is_Tagged_Type (Derived_Type)
+ or else Is_Abstract_Type (Derived_Type)
+ or else Is_Abstract_Subprogram (Alias (New_Subp))
+ then
+ Set_Is_Abstract_Subprogram (New_Subp);
+ else
+ Set_Requires_Overriding (New_Subp);
+ end if;
+
+ elsif Ada_Version < Ada_05
+ and then (Is_Abstract_Subprogram (Alias (New_Subp))
+ or else (Is_Tagged_Type (Derived_Type)
+ and then Etype (New_Subp) = Derived_Type
+ and then No (Actual_Subp)))
then
- Set_Is_Abstract (New_Subp);
+ Set_Is_Abstract_Subprogram (New_Subp);
-- Finally, if the parent type is abstract we must verify that all
-- inherited operations are either non-abstract or overridden, or
@@ -10822,13 +11188,13 @@ package body Sem_Ch3 is
-- the parent type, in which case the abstractness of the inherited
-- operation is carried to the new subprogram.
- elsif Is_Abstract (Parent_Type)
+ elsif Is_Abstract_Type (Parent_Type)
and then not In_Open_Scopes (Scope (Parent_Type))
and then Is_Private_Overriding
- and then Is_Abstract (Visible_Subp)
+ and then Is_Abstract_Subprogram (Visible_Subp)
then
Set_Alias (New_Subp, Visible_Subp);
- Set_Is_Abstract (New_Subp);
+ Set_Is_Abstract_Subprogram (New_Subp);
end if;
New_Overloaded_Entity (New_Subp, Derived_Type);
@@ -10918,7 +11284,7 @@ package body Sem_Ch3 is
-- Ada 2005 (AI-251): Add the derivation of an abstract
-- interface primitive to the list of entities to which
- -- we have to associate aliased entity.
+ -- we have to associate an aliased entity.
if Ada_Version >= Ada_05
and then Is_Dispatching_Operation (Subp)
@@ -10939,7 +11305,11 @@ package body Sem_Ch3 is
Next_Elmt (Elmt);
end loop;
- Derive_Interface_Subprograms (Parent_Type, Derived_Type, Ifaces_List);
+ if Ada_Version >= Ada_05
+ and then Is_Tagged_Type (Derived_Type)
+ then
+ Derive_Interface_Subprograms (Parent_Type, Derived_Type, Ifaces_List);
+ end if;
end Derive_Subprograms;
--------------------------------
@@ -11116,16 +11486,19 @@ package body Sem_Ch3 is
null;
elsif Protected_Present (Iface_Def) then
- Error_Msg_N ("(Ada 2005) non-limited interface cannot" &
- " inherit from protected interface", Indic);
+ Error_Msg_N
+ ("(Ada 2005) non-limited interface cannot " &
+ "inherit from protected interface", Indic);
elsif Synchronized_Present (Iface_Def) then
- Error_Msg_N ("(Ada 2005) non-limited interface cannot" &
- " inherit from synchronized interface", Indic);
+ Error_Msg_N
+ ("(Ada 2005) non-limited interface cannot " &
+ "inherit from synchronized interface", Indic);
elsif Task_Present (Iface_Def) then
- Error_Msg_N ("(Ada 2005) non-limited interface cannot" &
- " inherit from task interface", Indic);
+ Error_Msg_N
+ ("(Ada 2005) non-limited interface cannot " &
+ "inherit from task interface", Indic);
else
null;
@@ -11134,6 +11507,16 @@ package body Sem_Ch3 is
end if;
end if;
+ if Is_Tagged_Type (Parent_Type)
+ and then Is_Concurrent_Type (Parent_Type)
+ and then not Is_Interface (Parent_Type)
+ and then not Is_Completion
+ then
+ Error_Msg_N ("parent type of a record extension cannot be " &
+ "a synchronized tagged type (3.9.1 (3/1)", N);
+ return;
+ end if;
+
-- Ada 2005 (AI-251): Decorate all the names in the list of ancestor
-- interfaces
@@ -12681,21 +13064,24 @@ package body Sem_Ch3 is
-----------------------
function Is_Null_Extension (T : Entity_Id) return Boolean is
- Full_Type_Decl : constant Node_Id := Parent (T);
- Full_Type_Defn : constant Node_Id := Type_Definition (Full_Type_Decl);
- Comp_List : Node_Id;
- First_Comp : Node_Id;
+ Type_Decl : constant Node_Id := Parent (T);
+ Comp_List : Node_Id;
+ First_Comp : Node_Id;
begin
- if not Is_Tagged_Type (T)
- or else Nkind (Full_Type_Defn) /= N_Derived_Type_Definition
+ if Nkind (Type_Decl) /= N_Full_Type_Declaration
+ or else not Is_Tagged_Type (T)
+ or else Nkind (Type_Definition (Type_Decl)) /=
+ N_Derived_Type_Definition
+ or else No (Record_Extension_Part (Type_Definition (Type_Decl)))
then
return False;
end if;
- Comp_List := Component_List (Record_Extension_Part (Full_Type_Defn));
+ Comp_List :=
+ Component_List (Record_Extension_Part (Type_Definition (Type_Decl)));
- if Present (Discriminant_Specifications (Full_Type_Decl)) then
+ if Present (Discriminant_Specifications (Type_Decl)) then
return False;
elsif Present (Comp_List)
@@ -12956,7 +13342,7 @@ package body Sem_Ch3 is
Set_Ekind (CW_Type, E_Class_Wide_Type);
Set_Is_Tagged_Type (CW_Type, True);
Set_Primitive_Operations (CW_Type, New_Elmt_List);
- Set_Is_Abstract (CW_Type, False);
+ Set_Is_Abstract_Type (CW_Type, False);
Set_Is_Constrained (CW_Type, False);
Set_Is_First_Subtype (CW_Type, Is_First_Subtype (T));
Init_Size_Align (CW_Type);
@@ -13705,8 +14091,7 @@ package body Sem_Ch3 is
(Discriminant_Type (Discr)))
then
Discr_Type :=
- Replace_Anonymous_Access_To_Protected_Subprogram
- (Discr, Discr_Type);
+ Replace_Anonymous_Access_To_Protected_Subprogram (Discr);
end if;
else
@@ -14080,7 +14465,9 @@ package body Sem_Ch3 is
("completion of nonlimited type cannot be limited", Full_T);
Explain_Limited_Type (Full_T, Full_T);
- elsif Is_Abstract (Full_T) and then not Is_Abstract (Priv_T) then
+ elsif Is_Abstract_Type (Full_T)
+ and then not Is_Abstract_Type (Priv_T)
+ then
Error_Msg_N
("completion of nonabstract type cannot be abstract", Full_T);
@@ -14105,13 +14492,12 @@ package body Sem_Ch3 is
-- Check that ancestor interfaces of private and full views are
-- consistent. We omit this check for synchronized types because
- -- they are performed on thecorresponding record type when frozen.
+ -- they are performed on the corresponding record type when frozen.
if Ada_Version >= Ada_05
and then Is_Tagged_Type (Priv_T)
and then Is_Tagged_Type (Full_T)
- and then Ekind (Full_T) /= E_Task_Type
- and then Ekind (Full_T) /= E_Protected_Type
+ and then not Is_Concurrent_Type (Full_T)
then
declare
Iface : Entity_Id;
@@ -14309,8 +14695,7 @@ package body Sem_Ch3 is
if Ada_Version >= Ada_05
and then Nkind (Parent (Priv_T)) = N_Private_Extension_Declaration
and then Synchronized_Present (Parent (Priv_T))
- and then Ekind (Full_T) /= E_Task_Type
- and then Ekind (Full_T) /= E_Protected_Type
+ and then not Is_Concurrent_Type (Full_T)
then
Error_Msg_N ("full view of synchronized extension must " &
"be synchronized type", N);
@@ -14374,8 +14759,7 @@ package body Sem_Ch3 is
-- operations from the private view to the full view.
if Is_Tagged_Type (Full_T)
- and then Ekind (Full_T) /= E_Task_Type
- and then Ekind (Full_T) /= E_Protected_Type
+ and then not Is_Concurrent_Type (Full_T)
then
declare
Priv_List : Elist_Id;
@@ -15079,6 +15463,15 @@ package body Sem_Ch3 is
when Access_Kind =>
Constrain_Access (Def_Id, S, Related_Nod);
+ if Expander_Active
+ and then Is_Itype (Designated_Type (Def_Id))
+ and then Nkind (Related_Nod) = N_Subtype_Declaration
+ and then not Is_Incomplete_Type (Designated_Type (Def_Id))
+ then
+ Build_Itype_Reference
+ (Designated_Type (Def_Id), Related_Nod);
+ end if;
+
when Array_Kind =>
Constrain_Array (Def_Id, S, Related_Nod, Related_Id, Suffix);
@@ -15142,13 +15535,7 @@ package body Sem_Ch3 is
and then
Nkind (Parent (P)) = N_Full_Type_Declaration
then
- declare
- Ref_Node : Node_Id;
- begin
- Ref_Node := Make_Itype_Reference (Sloc (Related_Nod));
- Set_Itype (Ref_Node, Def_Id);
- Insert_After (Parent (P), Ref_Node);
- end;
+ Build_Itype_Reference (Def_Id, Parent (P));
end if;
else
@@ -15172,274 +15559,317 @@ package body Sem_Ch3 is
end if;
end Process_Subtype;
- -----------------------------
- -- Record_Type_Declaration --
- -----------------------------
+ ---------------------------------------
+ -- Check_Anonymous_Access_Components --
+ ---------------------------------------
- procedure Record_Type_Declaration
- (T : Entity_Id;
- N : Node_Id;
- Prev : Entity_Id)
+ procedure Check_Anonymous_Access_Components
+ (Typ_Decl : Node_Id;
+ Typ : Entity_Id;
+ Prev : Entity_Id;
+ Comp_List : Node_Id)
is
- Loc : constant Source_Ptr := Sloc (N);
- Def : constant Node_Id := Type_Definition (N);
- Inc_T : Entity_Id := Empty;
-
- Is_Tagged : Boolean;
- Tag_Comp : Entity_Id;
-
- procedure Check_Anonymous_Access_Types (Comp_List : Node_Id);
- -- Ada 2005 AI-382: an access component in a record declaration can
- -- refer to the enclosing record, in which case it denotes the type
- -- itself, and not the current instance of the type. We create an
- -- anonymous access type for the component, and flag it as an access
- -- to a component, so that accessibility checks are properly performed
- -- on it. The declaration of the access type is placed ahead of that
- -- of the record, to prevent circular order-of-elaboration issues in
- -- Gigi. We create an incomplete type for the record declaration, which
- -- is the designated type of the anonymous access.
-
- procedure Make_Incomplete_Type_Declaration;
+ Loc : constant Source_Ptr := Sloc (Typ_Decl);
+ Anon_Access : Entity_Id;
+ Acc_Def : Node_Id;
+ Comp : Node_Id;
+ Comp_Def : Node_Id;
+ Decl : Node_Id;
+ Type_Def : Node_Id;
+
+ procedure Build_Incomplete_Type_Declaration;
-- If the record type contains components that include an access to the
- -- current record, create an incomplete type declaration for the record,
- -- to be used as the designated type of the anonymous access. This is
- -- done only once, and only if there is no previous partial view of the
- -- type.
-
- ----------------------------------
- -- Check_Anonymous_Access_Types --
- ----------------------------------
+ -- current record, then create an incomplete type declaration for the
+ -- record, to be used as the designated type of the anonymous access.
+ -- This is done only once, and only if there is no previous partial
+ -- view of the type.
+
+ function Mentions_T (Acc_Def : Node_Id) return Boolean;
+ -- Check whether an access definition includes a reference to
+ -- the enclosing record type. The reference can be a subtype
+ -- mark in the access definition itself, or a 'Class attribute
+ -- reference, or recursively a reference appearing in a parameter
+ -- type in an access_to_subprogram definition.
- procedure Check_Anonymous_Access_Types (Comp_List : Node_Id) is
- Anon_Access : Entity_Id;
- Acc_Def : Node_Id;
- Comp : Node_Id;
- Comp_Def : Node_Id;
- Decl : Node_Id;
- Type_Def : Node_Id;
+ --------------------------------------
+ -- Build_Incomplete_Type_Declaration --
+ --------------------------------------
- function Mentions_T (Acc_Def : Node_Id) return Boolean;
- -- Check whether an access definition includes a reference to
- -- the enclosing record type. The reference can be a subtype
- -- mark in the access definition itself, or a 'Class attribute
- -- reference, or recursively a reference appearing in a parameter
- -- type in an access_to_subprogram definition.
+ procedure Build_Incomplete_Type_Declaration is
+ Decl : Node_Id;
+ Inc_T : Entity_Id;
+ H : Entity_Id;
- ----------------
- -- Mentions_T --
- ----------------
+ begin
+ -- If there is a previous partial view, no need to create a new one
+ -- If the partial view, given by Prev, is incomplete, If Prev is
+ -- a private declaration, full declaration is flagged accordingly.
- function Mentions_T (Acc_Def : Node_Id) return Boolean is
- Subt : Node_Id;
+ if Prev /= Typ then
+ if Tagged_Present (Type_Definition (Typ_Decl)) then
+ Make_Class_Wide_Type (Prev);
+ Set_Class_Wide_Type (Typ, Class_Wide_Type (Prev));
+ Set_Etype (Class_Wide_Type (Typ), Typ);
+ end if;
- begin
- if No (Access_To_Subprogram_Definition (Acc_Def)) then
- Subt := Subtype_Mark (Acc_Def);
+ return;
- if Nkind (Subt) = N_Identifier then
- return Chars (Subt) = Chars (T);
+ elsif Has_Private_Declaration (Typ) then
+ return;
- -- A reference to the current type may appear as the prefix
- -- of a 'Class attribute.
+ -- If there was a previous anonymous access type, the incomplete
+ -- type declaration will have been created already.
- elsif Nkind (Subt) = N_Attribute_Reference
- and then Attribute_Name (Subt) = Name_Class
- and then Is_Entity_Name (Prefix (Subt))
- then
- return (Chars (Prefix (Subt))) = Chars (T);
- else
- return False;
- end if;
+ elsif Present (Current_Entity (Typ))
+ and then Ekind (Current_Entity (Typ)) = E_Incomplete_Type
+ and then Full_View (Current_Entity (Typ)) = Typ
+ then
+ return;
- else
- -- Component is an access_to_subprogram: examine its formals
+ else
+ Inc_T := Make_Defining_Identifier (Loc, Chars (Typ));
+ Decl := Make_Incomplete_Type_Declaration (Loc, Inc_T);
- declare
- Param_Spec : Node_Id;
+ -- Type has already been inserted into the current scope.
+ -- Remove it, and add incomplete declaration for type, so
+ -- that subsequent anonymous access types can use it.
+ -- The entity is unchained from the homonym list and from
+ -- immediate visibility. After analysis, the entity in the
+ -- incomplete declaration becomes immediately visible in the
+ -- record declaration that follows.
- begin
- Param_Spec :=
- First
- (Parameter_Specifications
- (Access_To_Subprogram_Definition (Acc_Def)));
- while Present (Param_Spec) loop
- if Nkind (Parameter_Type (Param_Spec))
- = N_Access_Definition
- and then Mentions_T (Parameter_Type (Param_Spec))
- then
- return True;
- end if;
+ H := Current_Entity (Typ);
- Next (Param_Spec);
- end loop;
+ if H = Typ then
+ Set_Name_Entity_Id (Chars (Typ), Homonym (Typ));
+ else
+ while Present (H)
+ and then Homonym (H) /= Typ
+ loop
+ H := Homonym (Typ);
+ end loop;
- return False;
- end;
+ Set_Homonym (H, Homonym (Typ));
end if;
- end Mentions_T;
-
- -- Start of processing for Check_Anonymous_Access_Types
- begin
- if No (Comp_List) then
- return;
- end if;
+ Insert_Before (Typ_Decl, Decl);
+ Analyze (Decl);
+ Set_Full_View (Inc_T, Typ);
- Comp := First (Component_Items (Comp_List));
- while Present (Comp) loop
- if Nkind (Comp) = N_Component_Declaration
- and then Present
- (Access_Definition (Component_Definition (Comp)))
- and then
- Mentions_T (Access_Definition (Component_Definition (Comp)))
+ if (Nkind (Type_Definition (Typ_Decl)) = N_Derived_Type_Definition
+ and then
+ Present
+ (Record_Extension_Part (Type_Definition (Typ_Decl))))
+ or else Tagged_Present (Type_Definition (Typ_Decl))
then
- Comp_Def := Component_Definition (Comp);
- Acc_Def :=
- Access_To_Subprogram_Definition
- (Access_Definition (Comp_Def));
+ -- Create a common class-wide type for both views, and set
+ -- the etype of the class-wide type to the full view.
- Make_Incomplete_Type_Declaration;
- Anon_Access :=
- Make_Defining_Identifier (Loc,
- Chars => New_Internal_Name ('S'));
-
- -- Create a declaration for the anonymous access type: either
- -- an access_to_object or an access_to_subprogram.
-
- if Present (Acc_Def) then
- if Nkind (Acc_Def) = N_Access_Function_Definition then
- Type_Def :=
- Make_Access_Function_Definition (Loc,
- Parameter_Specifications =>
- Parameter_Specifications (Acc_Def),
- Result_Definition => Result_Definition (Acc_Def));
- else
- Type_Def :=
- Make_Access_Procedure_Definition (Loc,
- Parameter_Specifications =>
- Parameter_Specifications (Acc_Def));
- end if;
+ Make_Class_Wide_Type (Inc_T);
+ Set_Class_Wide_Type (Typ, Class_Wide_Type (Inc_T));
+ Set_Etype (Class_Wide_Type (Typ), Typ);
+ end if;
+ end if;
+ end Build_Incomplete_Type_Declaration;
- else
- Type_Def :=
- Make_Access_To_Object_Definition (Loc,
- Subtype_Indication =>
- Relocate_Node
- (Subtype_Mark
- (Access_Definition (Comp_Def))));
- end if;
+ ----------------
+ -- Mentions_T --
+ ----------------
- Decl := Make_Full_Type_Declaration (Loc,
- Defining_Identifier => Anon_Access,
- Type_Definition => Type_Def);
+ function Mentions_T (Acc_Def : Node_Id) return Boolean is
+ Subt : Node_Id;
+ Type_Id : constant Name_Id := Chars (Typ);
- Insert_Before (N, Decl);
- Analyze (Decl);
+ begin
+ if No (Access_To_Subprogram_Definition (Acc_Def)) then
+ Subt := Subtype_Mark (Acc_Def);
- -- If an access to object, Preserve entity of designated type,
- -- for ASIS use, before rewriting the component definition.
+ if Nkind (Subt) = N_Identifier then
+ return Chars (Subt) = Type_Id;
- if No (Acc_Def) then
- declare
- Desig : Entity_Id;
+ -- Reference can be through an expanded name which has not been
+ -- analyzed yet, and designates enclosing scopes.
- begin
- Desig := Entity (Subtype_Indication (Type_Def));
+ elsif Nkind (Subt) = N_Selected_Component then
+ Analyze (Prefix (Subt));
- -- If the access definition is to the current record,
- -- the visible entity at this point is an incomplete
- -- type. Retrieve the full view to simplify ASIS queries
+ if Chars (Selector_Name (Subt)) = Type_Id then
+ return Is_Entity_Name (Prefix (Subt))
+ and then Entity (Prefix (Subt)) = Current_Scope;
- if Ekind (Desig) = E_Incomplete_Type then
- Desig := Full_View (Desig);
- end if;
+ -- The access definition may name a subtype of the enclosing
+ -- type, if there is a previous incomplete declaration for it.
- Set_Entity
- (Subtype_Mark (Access_Definition (Comp_Def)), Desig);
- end;
+ else
+ Find_Selected_Component (Subt);
+ return
+ Is_Entity_Name (Subt)
+ and then Scope (Entity (Subt)) = Current_Scope
+ and then (Chars (Base_Type (Entity (Subt))) = Type_Id
+ or else
+ (Is_Class_Wide_Type (Entity (Subt))
+ and then
+ Chars (Etype (Base_Type (Entity (Subt))))
+ = Type_Id));
end if;
- Rewrite (Comp_Def,
- Make_Component_Definition (Loc,
- Subtype_Indication =>
- New_Occurrence_Of (Anon_Access, Loc)));
- Set_Ekind (Anon_Access, E_Anonymous_Access_Type);
- Set_Is_Local_Anonymous_Access (Anon_Access);
+ -- A reference to the current type may appear as the prefix of
+ -- a 'Class attribute.
+
+ elsif Nkind (Subt) = N_Attribute_Reference
+ and then Attribute_Name (Subt) = Name_Class
+ and then Is_Entity_Name (Prefix (Subt))
+ then
+ return (Chars (Prefix (Subt))) = Type_Id;
+ else
+ return False;
end if;
- Next (Comp);
- end loop;
+ else
+ -- Component is an access_to_subprogram: examine its formals
- if Present (Variant_Part (Comp_List)) then
declare
- V : Node_Id;
+ Param_Spec : Node_Id;
+
begin
- V := First_Non_Pragma (Variants (Variant_Part (Comp_List)));
- while Present (V) loop
- Check_Anonymous_Access_Types (Component_List (V));
- Next_Non_Pragma (V);
+ Param_Spec :=
+ First
+ (Parameter_Specifications
+ (Access_To_Subprogram_Definition (Acc_Def)));
+ while Present (Param_Spec) loop
+ if Nkind (Parameter_Type (Param_Spec))
+ = N_Access_Definition
+ and then Mentions_T (Parameter_Type (Param_Spec))
+ then
+ return True;
+ end if;
+
+ Next (Param_Spec);
end loop;
+
+ return False;
end;
end if;
- end Check_Anonymous_Access_Types;
+ end Mentions_T;
- --------------------------------------
- -- Make_Incomplete_Type_Declaration --
- --------------------------------------
+ -- Start of processing for Check_Anonymous_Access_Components
- procedure Make_Incomplete_Type_Declaration is
- Decl : Node_Id;
- H : Entity_Id;
-
- begin
- -- If there is a previous partial view, no need to create a new one
- -- If the partial view is incomplete, it is given by Prev. If it is
- -- a private declaration, full declaration is flagged accordingly.
+ begin
+ if No (Comp_List) then
+ return;
+ end if;
- if Prev /= T
- or else Has_Private_Declaration (T)
+ Comp := First (Component_Items (Comp_List));
+ while Present (Comp) loop
+ if Nkind (Comp) = N_Component_Declaration
+ and then Present
+ (Access_Definition (Component_Definition (Comp)))
+ and then
+ Mentions_T (Access_Definition (Component_Definition (Comp)))
then
- return;
+ Comp_Def := Component_Definition (Comp);
+ Acc_Def :=
+ Access_To_Subprogram_Definition
+ (Access_Definition (Comp_Def));
- elsif No (Inc_T) then
- Inc_T := Make_Defining_Identifier (Loc, Chars (T));
- Decl := Make_Incomplete_Type_Declaration (Loc, Inc_T);
+ Build_Incomplete_Type_Declaration;
+ Anon_Access :=
+ Make_Defining_Identifier (Loc,
+ Chars => New_Internal_Name ('S'));
- -- Type has already been inserted into the current scope.
- -- Remove it, and add incomplete declaration for type, so
- -- that subsequent anonymous access types can use it.
- -- The entity is unchained from the homonym list and from
- -- immediate visibility. After analysis, the entity in the
- -- incomplete declaration becomes immediately visible in the
- -- record declaration that follows.
+ -- Create a declaration for the anonymous access type: either
+ -- an access_to_object or an access_to_subprogram.
- H := Current_Entity (T);
+ if Present (Acc_Def) then
+ if Nkind (Acc_Def) = N_Access_Function_Definition then
+ Type_Def :=
+ Make_Access_Function_Definition (Loc,
+ Parameter_Specifications =>
+ Parameter_Specifications (Acc_Def),
+ Result_Definition => Result_Definition (Acc_Def));
+ else
+ Type_Def :=
+ Make_Access_Procedure_Definition (Loc,
+ Parameter_Specifications =>
+ Parameter_Specifications (Acc_Def));
+ end if;
- if H = T then
- Set_Name_Entity_Id (Chars (T), Homonym (T));
else
- while Present (H)
- and then Homonym (H) /= T
- loop
- H := Homonym (T);
- end loop;
-
- Set_Homonym (H, Homonym (T));
+ Type_Def :=
+ Make_Access_To_Object_Definition (Loc,
+ Subtype_Indication =>
+ Relocate_Node
+ (Subtype_Mark
+ (Access_Definition (Comp_Def))));
end if;
- Insert_Before (N, Decl);
+ Decl := Make_Full_Type_Declaration (Loc,
+ Defining_Identifier => Anon_Access,
+ Type_Definition => Type_Def);
+
+ Insert_Before (Typ_Decl, Decl);
Analyze (Decl);
- Set_Full_View (Inc_T, T);
- if Tagged_Present (Def) then
- Make_Class_Wide_Type (Inc_T);
- Set_Class_Wide_Type (T, Class_Wide_Type (Inc_T));
- Set_Etype (Class_Wide_Type (T), T);
+ -- If an access to object, Preserve entity of designated type,
+ -- for ASIS use, before rewriting the component definition.
+
+ if No (Acc_Def) then
+ declare
+ Desig : Entity_Id;
+
+ begin
+ Desig := Entity (Subtype_Indication (Type_Def));
+
+ -- If the access definition is to the current record,
+ -- the visible entity at this point is an incomplete
+ -- type. Retrieve the full view to simplify ASIS queries
+
+ if Ekind (Desig) = E_Incomplete_Type then
+ Desig := Full_View (Desig);
+ end if;
+
+ Set_Entity
+ (Subtype_Mark (Access_Definition (Comp_Def)), Desig);
+ end;
end if;
+
+ Rewrite (Comp_Def,
+ Make_Component_Definition (Loc,
+ Subtype_Indication =>
+ New_Occurrence_Of (Anon_Access, Loc)));
+ Set_Ekind (Anon_Access, E_Anonymous_Access_Type);
+ Set_Is_Local_Anonymous_Access (Anon_Access);
end if;
- end Make_Incomplete_Type_Declaration;
- -- Start of processing for Record_Type_Declaration
+ Next (Comp);
+ end loop;
+
+ if Present (Variant_Part (Comp_List)) then
+ declare
+ V : Node_Id;
+ begin
+ V := First_Non_Pragma (Variants (Variant_Part (Comp_List)));
+ while Present (V) loop
+ Check_Anonymous_Access_Components
+ (Typ_Decl, Typ, Prev, Component_List (V));
+ Next_Non_Pragma (V);
+ end loop;
+ end;
+ end if;
+ end Check_Anonymous_Access_Components;
+
+ -----------------------------
+ -- Record_Type_Declaration --
+ -----------------------------
+
+ procedure Record_Type_Declaration
+ (T : Entity_Id;
+ N : Node_Id;
+ Prev : Entity_Id)
+ is
+ Def : constant Node_Id := Type_Definition (N);
+ Is_Tagged : Boolean;
+ Tag_Comp : Entity_Id;
begin
-- These flags must be initialized before calling Process_Discriminants
@@ -15471,7 +15901,7 @@ package body Sem_Ch3 is
-- Type is abstract if full declaration carries keyword, or if
-- previous partial view did.
- Set_Is_Abstract (T, Is_Abstract (T)
+ Set_Is_Abstract_Type (T, Is_Abstract_Type (T)
or else Abstract_Present (Def));
else
@@ -15490,100 +15920,17 @@ package body Sem_Ch3 is
-- create the required anonymous access type declarations, and if
-- need be an incomplete type declaration for T itself.
- Check_Anonymous_Access_Types (Component_List (Def));
+ Check_Anonymous_Access_Components (N, T, Prev, Component_List (Def));
if Ada_Version >= Ada_05
and then Present (Interface_List (Def))
then
+ Check_Abstract_Interfaces (N, Def);
+
declare
- Iface : Node_Id;
- Iface_Def : Node_Id;
- Iface_Typ : Entity_Id;
Ifaces_List : Elist_Id;
begin
- Iface := First (Interface_List (Def));
- while Present (Iface) loop
- Iface_Typ := Find_Type_Of_Subtype_Indic (Iface);
- Iface_Def := Type_Definition (Parent (Iface_Typ));
-
- if not Is_Interface (Iface_Typ) then
- Error_Msg_NE ("(Ada 2005) & must be an interface",
- Iface, Iface_Typ);
-
- else
- -- "The declaration of a specific descendant of an
- -- interface type freezes the interface type" RM 13.14
-
- Freeze_Before (N, Iface_Typ);
-
- -- Ada 2005 (AI-345): Protected interfaces can only
- -- inherit from limited, synchronized or protected
- -- interfaces.
-
- if Protected_Present (Def) then
- if Limited_Present (Iface_Def)
- or else Synchronized_Present (Iface_Def)
- or else Protected_Present (Iface_Def)
- then
- null;
-
- elsif Task_Present (Iface_Def) then
- Error_Msg_N ("(Ada 2005) protected interface cannot"
- & " inherit from task interface", Iface);
-
- else
- Error_Msg_N ("(Ada 2005) protected interface cannot"
- & " inherit from non-limited interface", Iface);
- end if;
-
- -- Ada 2005 (AI-345): Synchronized interfaces can only
- -- inherit from limited and synchronized.
-
- elsif Synchronized_Present (Def) then
- if Limited_Present (Iface_Def)
- or else Synchronized_Present (Iface_Def)
- then
- null;
-
- elsif Protected_Present (Iface_Def) then
- Error_Msg_N ("(Ada 2005) synchronized interface " &
- "cannot inherit from protected interface", Iface);
-
- elsif Task_Present (Iface_Def) then
- Error_Msg_N ("(Ada 2005) synchronized interface " &
- "cannot inherit from task interface", Iface);
-
- else
- Error_Msg_N ("(Ada 2005) synchronized interface " &
- "cannot inherit from non-limited interface",
- Iface);
- end if;
-
- -- Ada 2005 (AI-345): Task interfaces can only inherit
- -- from limited, synchronized or task interfaces.
-
- elsif Task_Present (Def) then
- if Limited_Present (Iface_Def)
- or else Synchronized_Present (Iface_Def)
- or else Task_Present (Iface_Def)
- then
- null;
-
- elsif Protected_Present (Iface_Def) then
- Error_Msg_N ("(Ada 2005) task interface cannot" &
- " inherit from protected interface", Iface);
-
- else
- Error_Msg_N ("(Ada 2005) task interface cannot" &
- " inherit from non-limited interface", Iface);
- end if;
- end if;
- end if;
-
- Next (Iface);
- end loop;
-
-- Ada 2005 (AI-251): Collect the list of progenitors that are not
-- already in the parents.
@@ -15637,9 +15984,11 @@ package body Sem_Ch3 is
Init_Component_Location (Tag_Comp);
-- Ada 2005 (AI-251): Addition of the Tag corresponding to all the
- -- implemented interfaces
+ -- implemented interfaces.
- Add_Interface_Tag_Components (N, T);
+ if Has_Abstract_Interfaces (T) then
+ Add_Interface_Tag_Components (N, T);
+ end if;
end if;
Make_Class_Wide_Type (T);
@@ -15732,8 +16081,8 @@ package body Sem_Ch3 is
end if;
-- After completing the semantic analysis of the record definition,
- -- record components, both new and inherited, are accessible. Set
- -- their kind accordingly.
+ -- record components, both new and inherited, are accessible. Set their
+ -- kind accordingly.
Component := First_Entity (Current_Scope);
while Present (Component) loop
@@ -15762,8 +16111,8 @@ package body Sem_Ch3 is
Next_Entity (Component);
end loop;
- -- A type is Finalize_Storage_Only only if all its controlled
- -- components are so.
+ -- A Type is Finalize_Storage_Only only if all its controlled components
+ -- are also.
if Ctrl_Components then
Set_Finalize_Storage_Only (T, Final_Storage_Only);
@@ -15880,7 +16229,6 @@ package body Sem_Ch3 is
Make_Range (Loc,
Low_Bound => Make_Real_Literal (Loc, Lo),
High_Bound => Make_Real_Literal (Loc, Hi));
-
begin
Set_Scalar_Range (E, S);
Set_Parent (S, E);
@@ -15916,7 +16264,6 @@ package body Sem_Ch3 is
Set_Ekind (Def_Id, E_Void);
Process_Range_Expr_In_Decl (R, Subt);
Set_Ekind (Def_Id, Kind);
-
end Set_Scalar_Range_For_Subtype;
--------------------------------------------------------