aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ada/sem_ch3.adb157
1 files changed, 95 insertions, 62 deletions
diff --git a/gcc/ada/sem_ch3.adb b/gcc/ada/sem_ch3.adb
index 7779d65..5b66982 100644
--- a/gcc/ada/sem_ch3.adb
+++ b/gcc/ada/sem_ch3.adb
@@ -4148,9 +4148,9 @@ package body Sem_Ch3 is
end;
end if;
- -- Create a concatenation operator for the new type. Internal
- -- array types created for packed entities do not need such, they
- -- are compatible with the user-defined type.
+ -- Create a concatenation operator for the new type. Internal array
+ -- types created for packed entities do not need such, they are
+ -- compatible with the user-defined type.
if Number_Dimensions (T) = 1
and then not Is_Packed_Array_Type (T)
@@ -4158,9 +4158,9 @@ package body Sem_Ch3 is
New_Concatenation_Op (T);
end if;
- -- In the case of an unconstrained array the parser has already
- -- verified that all the indices are unconstrained but we still
- -- need to make sure that the element type is constrained.
+ -- In the case of an unconstrained array the parser has already verified
+ -- that all the indices are unconstrained but we still need to make sure
+ -- that the element type is constrained.
if Is_Indefinite_Subtype (Element_Type) then
Error_Msg_N
@@ -4180,7 +4180,7 @@ package body Sem_Ch3 is
------------------------------------------------------
function Replace_Anonymous_Access_To_Protected_Subprogram
- (N : Node_Id) return Entity_Id
+ (N : Node_Id) return Entity_Id
is
Loc : constant Source_Ptr := Sloc (N);
@@ -4311,9 +4311,9 @@ package body Sem_Ch3 is
Subt : Entity_Id;
begin
- -- Set the designated type so it is available in case this is
- -- an access to a self-referential type, e.g. a standard list
- -- type with a next pointer. Will be reset after subtype is built.
+ -- Set the designated type so it is available in case this is an access
+ -- to a self-referential type, e.g. a standard list type with a next
+ -- pointer. Will be reset after subtype is built.
Set_Directly_Designated_Type
(Derived_Type, Designated_Type (Parent_Type));
@@ -4370,8 +4370,8 @@ package body Sem_Ch3 is
Set_Can_Never_Be_Null (Derived_Type);
end if;
- -- Note: we do not copy the Storage_Size_Variable, since
- -- we always go to the root type for this information.
+ -- Note: we do not copy the Storage_Size_Variable, since we always go to
+ -- the root type for this information.
-- Apply range checks to discriminants for derived record case
-- ??? THIS CODE SHOULD NOT BE HERE REALLY.
@@ -4411,8 +4411,8 @@ package body Sem_Ch3 is
New_Indic : Node_Id;
procedure Make_Implicit_Base;
- -- If the parent subtype is constrained, the derived type is a
- -- subtype of an implicit base type derived from the parent base.
+ -- If the parent subtype is constrained, the derived type is a subtype
+ -- of an implicit base type derived from the parent base.
------------------------
-- Make_Implicit_Base --
@@ -4720,13 +4720,12 @@ package body Sem_Ch3 is
Analyze (High_Bound (Range_Expression (Constraint (Indic))));
end if;
- -- Introduce an implicit base type for the derived type even
- -- if there is no constraint attached to it, since this seems
- -- closer to the Ada semantics. Build a full type declaration
- -- tree for the derived type using the implicit base type as
- -- the defining identifier. The build a subtype declaration
- -- tree which applies the constraint (if any) have it replace
- -- the derived type declaration.
+ -- Introduce an implicit base type for the derived type even if there
+ -- is no constraint attached to it, since this seems closer to the
+ -- Ada semantics. Build a full type declaration tree for the derived
+ -- type using the implicit base type as the defining identifier. The
+ -- build a subtype declaration tree which applies the constraint (if
+ -- any) have it replace the derived type declaration.
Literal := First_Literal (Parent_Type);
Literals_List := New_List;
@@ -4762,10 +4761,10 @@ package body Sem_Ch3 is
Make_Defining_Identifier (Sloc (Derived_Type),
New_External_Name (Chars (Derived_Type), 'B'));
- -- Indicate the proper nature of the derived type. This must
- -- be done before analysis of the literals, to recognize cases
- -- when a literal may be hidden by a previous explicit function
- -- definition (cf. c83031a).
+ -- Indicate the proper nature of the derived type. This must be done
+ -- before analysis of the literals, to recognize cases when a literal
+ -- may be hidden by a previous explicit function definition (cf.
+ -- c83031a).
Set_Ekind (Derived_Type, E_Enumeration_Subtype);
Set_Etype (Derived_Type, Implicit_Base);
@@ -4796,9 +4795,9 @@ package body Sem_Ch3 is
(Parent_Type));
Set_Has_Delayed_Freeze (Implicit_Base);
- -- Process the subtype indication including a validation check
- -- on the constraint, if any. If a constraint is given, its bounds
- -- must be implicitly converted to the new type.
+ -- Process the subtype indication including a validation check on the
+ -- constraint, if any. If a constraint is given, its bounds must be
+ -- implicitly converted to the new type.
if Nkind (Indic) = N_Subtype_Indication then
declare
@@ -4813,9 +4812,9 @@ package body Sem_Ch3 is
(Low_Bound (R), Parent_Type, Implicit_Base);
else
- -- Constraint is a Range attribute. Replace with the
- -- explicit mention of the bounds of the prefix, which must
- -- be a subtype.
+ -- Constraint is a Range attribute. Replace with explicit
+ -- mention of the bounds of the prefix, which must be a
+ -- subtype.
Analyze (Prefix (R));
Hi :=
@@ -4872,8 +4871,8 @@ package body Sem_Ch3 is
Analyze (N);
- -- If pragma Discard_Names applies on the first subtype of the
- -- parent type, then it must be applied on this subtype as well.
+ -- If pragma Discard_Names applies on the first subtype of the parent
+ -- type, then it must be applied on this subtype as well.
if Einfo.Discard_Names (First_Subtype (Parent_Type)) then
Set_Discard_Names (Derived_Type);
@@ -5916,15 +5915,15 @@ package body Sem_Ch3 is
Last_Discrim : Entity_Id;
Constrs : Elist_Id;
- Discs : Elist_Id := New_Elmt_List;
+ Discs : Elist_Id := New_Elmt_List;
-- An empty Discs list means that there were no constraints in the
-- subtype indication or that there was an error processing it.
- Assoc_List : Elist_Id;
- New_Discrs : Elist_Id;
- New_Base : Entity_Id;
- New_Decl : Node_Id;
- New_Indic : Node_Id;
+ Assoc_List : Elist_Id;
+ New_Discrs : Elist_Id;
+ New_Base : Entity_Id;
+ New_Decl : Node_Id;
+ New_Indic : Node_Id;
Is_Tagged : constant Boolean := Is_Tagged_Type (Parent_Type);
Discriminant_Specs : constant Boolean :=
@@ -5932,11 +5931,11 @@ package body Sem_Ch3 is
Private_Extension : constant Boolean :=
(Nkind (N) = N_Private_Extension_Declaration);
- Constraint_Present : Boolean;
- Inherit_Discrims : Boolean := False;
- Save_Etype : Entity_Id;
- Save_Discr_Constr : Elist_Id;
- Save_Next_Entity : Entity_Id;
+ Constraint_Present : Boolean;
+ Inherit_Discrims : Boolean := False;
+ Save_Etype : Entity_Id;
+ Save_Discr_Constr : Elist_Id;
+ Save_Next_Entity : Entity_Id;
begin
if Ekind (Parent_Type) = E_Record_Type_With_Private
@@ -5982,7 +5981,7 @@ package body Sem_Ch3 is
else
Type_Def := Type_Definition (N);
- -- Ekind (Parent_Base) in not necessarily E_Record_Type since
+ -- Ekind (Parent_Base) is not necessarily E_Record_Type since
-- Parent_Base can be a private type or private extension. However,
-- for tagged types with an extension the newly added fields are
-- visible and hence the Derived_Type is always an E_Record_Type.
@@ -6527,13 +6526,13 @@ package body Sem_Ch3 is
-- Fields inherited from the Parent_Type
Set_Discard_Names
- (Derived_Type, Einfo.Discard_Names (Parent_Type));
+ (Derived_Type, Einfo.Discard_Names (Parent_Type));
Set_Has_Specified_Layout
- (Derived_Type, Has_Specified_Layout (Parent_Type));
+ (Derived_Type, Has_Specified_Layout (Parent_Type));
Set_Is_Limited_Composite
- (Derived_Type, Is_Limited_Composite (Parent_Type));
+ (Derived_Type, Is_Limited_Composite (Parent_Type));
Set_Is_Private_Composite
- (Derived_Type, Is_Private_Composite (Parent_Type));
+ (Derived_Type, Is_Private_Composite (Parent_Type));
-- Fields inherited from the Parent_Base
@@ -6544,9 +6543,16 @@ package body Sem_Ch3 is
Set_Has_Primitive_Operations
(Derived_Type, Has_Primitive_Operations (Parent_Base));
+ -- For non-private case, we also inherit Has_Complex_Representation
+
+ if Ekind (Derived_Type) = E_Record_Type then
+ Set_Has_Complex_Representation
+ (Derived_Type, Has_Complex_Representation (Parent_Base));
+ end if;
+
-- Direct controlled types do not inherit Finalize_Storage_Only flag
- if not Is_Controlled (Parent_Type) then
+ if not Is_Controlled (Parent_Type) then
Set_Finalize_Storage_Only
(Derived_Type, Finalize_Storage_Only (Parent_Type));
end if;
@@ -6608,7 +6614,27 @@ package body Sem_Ch3 is
if Ada_Version >= Ada_05 then
declare
Ifaces_List : Elist_Id;
+
begin
+ -- Checks rules 3.9.4 (13/2 and 14/2)
+
+ if Comes_From_Source (Derived_Type)
+ and then not Is_Private_Type (Derived_Type)
+ and then Is_Interface (Parent_Type)
+ and then not Is_Interface (Derived_Type)
+ then
+ if Is_Task_Interface (Parent_Type) then
+ Error_Msg_N
+ ("(Ada 2005) task type required (RM 3.9.4 (13.2))",
+ Derived_Type);
+
+ elsif Is_Protected_Interface (Parent_Type) then
+ Error_Msg_N
+ ("(Ada 2005) protected type required (RM 3.9.4 (14.2))",
+ Derived_Type);
+ end if;
+ end if;
+
-- 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);
@@ -6820,16 +6846,16 @@ package body Sem_Ch3 is
begin
-- Set common attributes
- Set_Scope (Derived_Type, Current_Scope);
+ Set_Scope (Derived_Type, Current_Scope);
- Set_Ekind (Derived_Type, Ekind (Parent_Base));
- Set_Etype (Derived_Type, Parent_Base);
- Set_Has_Task (Derived_Type, Has_Task (Parent_Base));
+ Set_Ekind (Derived_Type, Ekind (Parent_Base));
+ Set_Etype (Derived_Type, Parent_Base);
+ Set_Has_Task (Derived_Type, Has_Task (Parent_Base));
- Set_Size_Info (Derived_Type, Parent_Type);
- Set_RM_Size (Derived_Type, RM_Size (Parent_Type));
- Set_Convention (Derived_Type, Convention (Parent_Type));
- Set_Is_Controlled (Derived_Type, Is_Controlled (Parent_Type));
+ Set_Size_Info (Derived_Type, Parent_Type);
+ Set_RM_Size (Derived_Type, RM_Size (Parent_Type));
+ Set_Convention (Derived_Type, Convention (Parent_Type));
+ Set_Is_Controlled (Derived_Type, Is_Controlled (Parent_Type));
-- The derived type inherits the representation clauses of the parent.
-- However, for a private type that is completed by a derivation, there
@@ -14200,9 +14226,9 @@ package body Sem_Ch3 is
return True;
end if;
- -- Ada 2005 (AI-287, AI-318): Relax the strictness of the front-end in
- -- case of limited aggregates (including extension aggregates),
- -- and function calls. The function call may have been give in prefixed
+ -- Ada 2005 (AI-287, AI-318): Relax the strictness of the front end in
+ -- case of limited aggregates (including extension aggregates), and
+ -- function calls. The function call may have been give in prefixed
-- notation, in which case the original node is an indexed component.
case Nkind (Original_Node (Exp)) is
@@ -14210,7 +14236,7 @@ package body Sem_Ch3 is
return True;
-- Ada 2005 (AI-251): If a class-wide interface object is initialized
- -- with a function call, the expander has rewriten the call into an
+ -- with a function call, the expander has rewritten the call into an
-- N_Type_Conversion node to force displacement of the pointer to
-- reference the component containing the secondary dispatch table.
@@ -14221,6 +14247,13 @@ package body Sem_Ch3 is
when N_Indexed_Component | N_Selected_Component =>
return Nkind (Exp) = N_Function_Call;
+ -- A use of 'Input is a function call, hence allowed. Normally the
+ -- attribute will be changed to a call, but the attribute by itself
+ -- can occur with -gnatc.
+
+ when N_Attribute_Reference =>
+ return Attribute_Name (Original_Node (Exp)) = Name_Input;
+
when others =>
return False;
end case;