aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/sem_util.adb
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/ada/sem_util.adb')
-rw-r--r--gcc/ada/sem_util.adb163
1 files changed, 118 insertions, 45 deletions
diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb
index a8984c8..cacf29c 100644
--- a/gcc/ada/sem_util.adb
+++ b/gcc/ada/sem_util.adb
@@ -6332,6 +6332,26 @@ package body Sem_Util is
end Conditional_Delay;
--------------------------------------
+ -- Direct_Attribute_Definition_Name --
+ --------------------------------------
+
+ function Direct_Attribute_Definition_Name
+ (Prefix : Entity_Id; Att_Name : Name_Id) return Name_Id is
+ begin
+ if Nkind (Prefix) = N_Attribute_Reference then
+ Error_Msg_N ("attribute streams not supported in "
+ & "direct attribute definitions",
+ Prefix);
+ end if;
+
+ pragma Assert (Is_Attribute_Name (Att_Name));
+ return New_External_Name
+ (Related_Id => Chars (Prefix),
+ Suffix => "_" & Get_Name_String (Att_Name) & "_Att",
+ Prefix => 'D');
+ end Direct_Attribute_Definition_Name;
+
+ --------------------------------------
-- Copy_Assertion_Policy_Attributes --
--------------------------------------
@@ -6832,30 +6852,6 @@ package body Sem_Util is
return Is_Class_Wide_Type (Typ) or else Needs_Finalization (Typ);
end CW_Or_Needs_Finalization;
- -------------------------
- -- Default_Constructor --
- -------------------------
-
- function Default_Constructor (Typ : Entity_Id) return Entity_Id is
- Construct : Elmt_Id;
- begin
- pragma Assert (Is_Type (Typ));
- if No (Constructor_Name (Typ)) or else No (Constructor_List (Typ)) then
- return Empty;
- end if;
-
- Construct := First_Elmt (Constructor_List (Typ));
- while Present (Construct) loop
- if Parameter_Count (Elists.Node (Construct)) = 1 then
- return Elists.Node (Construct);
- end if;
-
- Next_Elmt (Construct);
- end loop;
-
- return Empty;
- end Default_Constructor;
-
---------------------
-- Defining_Entity --
---------------------
@@ -11850,6 +11846,35 @@ package body Sem_Util is
(First_Discriminant (Typ)));
end Has_Defaulted_Discriminants;
+ -----------------------------
+ -- Has_Default_Constructor --
+ -----------------------------
+
+ function Has_Default_Constructor (Typ : Entity_Id) return Boolean is
+ Cursor : Entity_Id;
+ begin
+ pragma Assert (Is_Type (Typ));
+ if not Needs_Construction (Typ) then
+ return False;
+ end if;
+
+ -- Iterate through all homonyms to find the default constructor
+
+ Cursor := Get_Name_Entity_Id
+ (Direct_Attribute_Definition_Name (Typ, Name_Constructor));
+ while Present (Cursor) loop
+ if Is_Constructor_Procedure (Cursor)
+ and then No (Next_Formal (First_Formal (Cursor)))
+ then
+ return True;
+ end if;
+
+ Cursor := Homonym (Cursor);
+ end loop;
+
+ return False;
+ end Has_Default_Constructor;
+
-------------------
-- Has_Denormals --
-------------------
@@ -16249,6 +16274,17 @@ package body Sem_Util is
and then Attribute_Name (N) = Name_Result;
end Is_Attribute_Result;
+ -----------------------------------
+ -- Is_Direct_Attribute_Subp_Spec --
+ -----------------------------------
+
+ function Is_Direct_Attribute_Subp_Spec (N : Node_Id) return Boolean is
+ begin
+ return Nkind (N) in N_Subprogram_Specification
+ and then Nkind (Defining_Unit_Name (Original_Node (N)))
+ = N_Attribute_Reference;
+ end Is_Direct_Attribute_Subp_Spec;
+
-------------------------
-- Is_Attribute_Update --
-------------------------
@@ -16684,6 +16720,28 @@ package body Sem_Util is
end if;
end Is_Constant_Bound;
+ ------------------------------
+ -- Is_Constructor_Procedure --
+ ------------------------------
+
+ function Is_Constructor_Procedure (Subp : Entity_Id) return Boolean is
+ First_Param : Entity_Id;
+ begin
+ if not (Present (First_Formal (Subp))
+ and then Ekind (First_Formal (Subp)) = E_In_Out_Parameter
+ and then Is_Direct_Attribute_Subp_Spec (Parent (Subp))
+ and then Attribute_Name (Defining_Unit_Name
+ (Original_Node (Parent (Subp))))
+ = Name_Constructor)
+ then
+ return False;
+ end if;
+
+ First_Param := Implementation_Base_Type (Etype (First_Formal (Subp)));
+ return Scope (Subp) = Scope (First_Param)
+ and then Needs_Construction (First_Param);
+ end Is_Constructor_Procedure;
+
---------------------------
-- Is_Container_Element --
---------------------------
@@ -24817,10 +24875,20 @@ package body Sem_Util is
-- Scalar_Range
if Is_Discrete_Type (Id) then
+
+ -- The scalar range of the source entity had a parent, so the
+ -- scalar range of the newly created entity should also have a
+ -- parent, so that the AST structure is the same.
+
+ pragma Assert (Present (Parent (Scalar_Range (Id))));
+
Set_Scalar_Range (Id, Node_Id (
Copy_Field_With_Replacement
(Field => Union_Id (Scalar_Range (Id)),
Semantic => True)));
+
+ pragma Assert (No (Parent (Scalar_Range (Id))));
+ Set_Parent (Scalar_Range (Id), Id);
end if;
-- Scope
@@ -26669,24 +26737,6 @@ package body Sem_Util is
return Empty;
end Param_Entity;
- ---------------------
- -- Parameter_Count --
- ---------------------
-
- function Parameter_Count (Subp : Entity_Id) return Nat is
- Result : Nat := 0;
- Param : Entity_Id;
- begin
- Param := First_Entity (Subp);
- while Present (Param) loop
- Result := Result + 1;
-
- Param := Next_Entity (Param);
- end loop;
-
- return Result;
- end Parameter_Count;
-
----------------------
-- Policy_In_Effect --
----------------------
@@ -27097,6 +27147,11 @@ package body Sem_Util is
-- the case where Ent is a child unit. This procedure generates an
-- appropriate cross-reference entry. E is the corresponding entity.
+ procedure Get_Attribute_Reference_Name_String (N : Node_Id);
+ -- This procedure append to the Global_Name_Buffer the decoded string
+ -- name of the attribute reference N, including apostrophes and multiple
+ -- prefixes.
+
-------------------------
-- Generate_Parent_Ref --
-------------------------
@@ -27118,6 +27173,21 @@ package body Sem_Util is
end if;
end Generate_Parent_Ref;
+ -----------------------------------------
+ -- Get_Attribute_Reference_Name_String --
+ -----------------------------------------
+
+ procedure Get_Attribute_Reference_Name_String (N : Node_Id) is
+ begin
+ if Nkind (N) /= N_Attribute_Reference then
+ Get_Decoded_Name_String (Chars (N));
+ else
+ Get_Attribute_Reference_Name_String (Prefix (N));
+ Append (Global_Name_Buffer, ''');
+ Get_Decoded_Name_String (Attribute_Name (N));
+ end if;
+ end Get_Attribute_Reference_Name_String;
+
-- Start of processing for Process_End_Label
begin
@@ -27198,9 +27268,12 @@ package body Sem_Util is
-- If the end label is not for the given entity, then either we have
-- some previous error, or this is a generic instantiation for which
-- we do not need to make a cross-reference in this case anyway. In
- -- either case we simply ignore the call.
+ -- either case we simply ignore the call. Matching label for direct
+ -- attribute definitions are checked elsewhere.
- if Chars (Ent) /= Chars (Endl) then
+ if Nkind (Endl) /= N_Attribute_Reference
+ and then Chars (Ent) /= Chars (Endl)
+ then
return;
end if;
@@ -27227,7 +27300,7 @@ package body Sem_Util is
-- mean the semicolon immediately following the label). This is
-- done for the sake of the 'e' or 't' entry generated below.
- Get_Decoded_Name_String (Chars (Endl));
+ Get_Attribute_Reference_Name_String (Endl);
Set_Sloc (Endl, Sloc (Endl) + Source_Ptr (Name_Len));
end if;