From: Ronan Desplanques <[email protected]>
The expression "private component" is best reserved for components of
protected objects' private sections. This renames a function from
"Has_Private_Component" to a more explicit name because that function is
not about the protected object component case.
gcc/ada/ChangeLog:
* sem_util.ads (Has_Private_Component): Rename into...
(Is_Incompletely_Defined): ...this.
* sem_util.adb (Has_Private_Component): Rename into...
(Is_Incompletely_Defined): ...this.
(Check_Fully_Declared): Adapt to above renaming.
* exp_ch3.adb (Freeze_Type): Likewise.
* freeze.adb (Check_And_Freeze_Type): Likewise.
* sem_aggr.adb (Array_Aggr_Subtype): Likewise.
* sem_ch12.adb (Instantiate_Type): Likewise.
* sem_ch13.adb (Rep_Item_Too_Early): Likewise.
* sem_ch3.adb (Access_Definition, Analyze_Full_Type_Declaration,
Analyze_Subtype_Declaration, Build_Derived_Access_Type,
Copy_And_Build, Complete_Private_Subtype, Constrain_Access,
Constrain_Array, Build_Constrained_Access_Type, Constrain_Concurrent,
Constrain_Corresponding_Record, Copy_Array_Subtype_Attributes,
Derived_Type_Declaration): Likewise.
* sem_ch6.adb (Create_Extra_Formals): Likewise.
* sem_res.adb (Make_Call_Into_Operator): Likewise.
Tested on x86_64-pc-linux-gnu, committed on master.
---
gcc/ada/exp_ch3.adb | 4 +-
gcc/ada/freeze.adb | 2 +-
gcc/ada/sem_aggr.adb | 16 +++---
gcc/ada/sem_ch12.adb | 4 +-
gcc/ada/sem_ch13.adb | 4 +-
gcc/ada/sem_ch3.adb | 29 +++++-----
gcc/ada/sem_ch6.adb | 2 +-
gcc/ada/sem_res.adb | 2 +-
gcc/ada/sem_util.adb | 129 ++++++++++++++++++++++---------------------
gcc/ada/sem_util.ads | 9 +--
10 files changed, 102 insertions(+), 99 deletions(-)
diff --git a/gcc/ada/exp_ch3.adb b/gcc/ada/exp_ch3.adb
index e8bccb22872..38aafbf7578 100644
--- a/gcc/ada/exp_ch3.adb
+++ b/gcc/ada/exp_ch3.adb
@@ -10109,10 +10109,10 @@ package body Exp_Ch3 is
Build_Finalization_Collection (Def_Id);
-- Also create a finalization collection when the designated type
- -- contains a private component. It is assumed that the full view
+ -- is not completely defined. It is assumed that the full view
-- will be controlled.
- elsif Has_Private_Component (Desig_Type) then
+ elsif Is_Incompletely_Defined (Desig_Type) then
Build_Finalization_Collection
(Typ => Def_Id,
For_Private => True,
diff --git a/gcc/ada/freeze.adb b/gcc/ada/freeze.adb
index 13d3a7f2e34..2b9ef460c36 100644
--- a/gcc/ada/freeze.adb
+++ b/gcc/ada/freeze.adb
@@ -9419,7 +9419,7 @@ package body Freeze is
Check_Fully_Declared (Typ, N);
if Error_Posted (N) then
- if Has_Private_Component (Typ)
+ if Is_Incompletely_Defined (Typ)
and then not Is_Private_Type (Typ)
then
Error_Msg_NE ("\\type& has private component", N, Typ);
diff --git a/gcc/ada/sem_aggr.adb b/gcc/ada/sem_aggr.adb
index 5f6570f36f0..1d39bd7d845 100644
--- a/gcc/ada/sem_aggr.adb
+++ b/gcc/ada/sem_aggr.adb
@@ -735,14 +735,14 @@ package body Sem_Aggr is
Itype := Create_Itype (E_Array_Subtype, N);
- Set_First_Rep_Item (Itype, First_Rep_Item (Typ));
- Set_Convention (Itype, Convention (Typ));
- Set_Depends_On_Private (Itype, Has_Private_Component (Typ));
- Set_Etype (Itype, Base_Type (Typ));
- Set_Has_Alignment_Clause (Itype, Has_Alignment_Clause (Typ));
- Set_Is_Aliased (Itype, Is_Aliased (Typ));
- Set_Is_Independent (Itype, Is_Independent (Typ));
- Set_Depends_On_Private (Itype, Depends_On_Private (Typ));
+ Set_First_Rep_Item (Itype, First_Rep_Item (Typ));
+ Set_Convention (Itype, Convention (Typ));
+ Set_Depends_On_Private (Itype, Is_Incompletely_Defined (Typ));
+ Set_Etype (Itype, Base_Type (Typ));
+ Set_Has_Alignment_Clause (Itype, Has_Alignment_Clause (Typ));
+ Set_Is_Aliased (Itype, Is_Aliased (Typ));
+ Set_Is_Independent (Itype, Is_Independent (Typ));
+ Set_Depends_On_Private (Itype, Depends_On_Private (Typ));
Copy_Suppress_Status (Index_Check, Typ, Itype);
Copy_Suppress_Status (Length_Check, Typ, Itype);
diff --git a/gcc/ada/sem_ch12.adb b/gcc/ada/sem_ch12.adb
index ae9f76d3791..fb0d06e348c 100644
--- a/gcc/ada/sem_ch12.adb
+++ b/gcc/ada/sem_ch12.adb
@@ -15785,7 +15785,7 @@ package body Sem_Ch12 is
Act_T := Full_View (Act_T);
Set_Entity (Actual, Act_T);
- if Has_Private_Component (Act_T) then
+ if Is_Incompletely_Defined (Act_T) then
Error_Msg_N
("premature use of type with private component", Actual);
end if;
@@ -15803,7 +15803,7 @@ package body Sem_Ch12 is
then
Error_Msg_N ("premature use of private type", Actual);
- elsif Has_Private_Component (Act_T) then
+ elsif Is_Incompletely_Defined (Act_T) then
Error_Msg_N
("premature use of type with private component", Actual);
end if;
diff --git a/gcc/ada/sem_ch13.adb b/gcc/ada/sem_ch13.adb
index a6a25aefc86..773fa64a3e8 100644
--- a/gcc/ada/sem_ch13.adb
+++ b/gcc/ada/sem_ch13.adb
@@ -16783,10 +16783,10 @@ package body Sem_Ch13 is
("representation item must be after full type declaration", N);
return True;
- -- If the type has incomplete components, a representation clause is
+ -- If the type is not completely defined, a representation clause is
-- illegal but stream attributes and Convention pragmas are correct.
- elsif Has_Private_Component (T) then
+ elsif Is_Incompletely_Defined (T) then
if Nkind (N) = N_Pragma then
return False;
diff --git a/gcc/ada/sem_ch3.adb b/gcc/ada/sem_ch3.adb
index 7e28881aeb0..1cfe48db4d7 100644
--- a/gcc/ada/sem_ch3.adb
+++ b/gcc/ada/sem_ch3.adb
@@ -904,7 +904,7 @@ package body Sem_Ch3 is
-- set, as required by gigi. This is necessary in the case of the
-- Task_Body_Procedure.
- if not Has_Private_Component (Desig_Type) then
+ if not Is_Incompletely_Defined (Desig_Type) then
Layout_Type (Anon_Type);
end if;
@@ -3421,7 +3421,7 @@ package body Sem_Ch3 is
-- Some common processing for all types
- Set_Depends_On_Private (T, Has_Private_Component (T));
+ Set_Depends_On_Private (T, Is_Incompletely_Defined (T));
Check_Ops_From_Incomplete_Type;
-- Both the declared entity, and its anonymous base type if one was
@@ -6291,7 +6291,7 @@ package body Sem_Ch3 is
T := Etype (Id);
Set_Is_Immediately_Visible (Id, True);
- Set_Depends_On_Private (Id, Has_Private_Component (T));
+ Set_Depends_On_Private (Id, Is_Incompletely_Defined (T));
Set_Is_Descendant_Of_Address (Id, Is_Descendant_Of_Address (T));
if Is_Interface (T) then
@@ -7362,7 +7362,7 @@ package body Sem_Ch3 is
Set_Size_Info (Derived_Type, Parent_Type);
Copy_RM_Size (To => Derived_Type, From => Parent_Type);
Set_Depends_On_Private (Derived_Type,
- Has_Private_Component (Derived_Type));
+ Is_Incompletely_Defined (Derived_Type));
Conditional_Delay (Derived_Type, Subt);
if Is_Access_Subprogram_Type (Derived_Type)
@@ -8504,7 +8504,7 @@ package body Sem_Ch3 is
Set_Is_Frozen (Full_Der, False);
Set_Freeze_Node (Full_Der, Empty);
Set_Depends_On_Private
- (Full_Der, Has_Private_Component (Full_Der));
+ (Full_Der, Is_Incompletely_Defined (Full_Der));
Set_Is_Public (Full_Der, Is_Public (Derived_Type));
Set_Is_Implicit_Full_View (Full_Der);
@@ -13655,7 +13655,7 @@ package body Sem_Ch3 is
end if;
Set_First_Rep_Item (Full, First_Rep_Item (Full_Base));
- Set_Depends_On_Private (Full, Has_Private_Component (Full));
+ Set_Depends_On_Private (Full, Is_Incompletely_Defined (Full));
-- When prefixed calls are enabled for untagged types, the subtype
-- shares the primitive operations of its base type. Do this even
@@ -14324,7 +14324,8 @@ package body Sem_Ch3 is
Set_Size_Info (Def_Id, T);
Set_Is_Constrained (Def_Id, Constraint_OK);
Set_Directly_Designated_Type (Def_Id, Desig_Subtype);
- Set_Depends_On_Private (Def_Id, Has_Private_Component (Def_Id));
+ Set_Depends_On_Private
+ (Def_Id, Is_Incompletely_Defined (Def_Id));
Set_Is_Access_Constant (Def_Id, Is_Access_Constant (T));
Set_Can_Never_Be_Null (Def_Id, Can_Never_Be_Null (T));
@@ -14493,7 +14494,7 @@ package body Sem_Ch3 is
(Def_Id, Is_FLB_Array_Subtype);
Set_Is_Aliased (Def_Id, Is_Aliased (T));
Set_Is_Independent (Def_Id, Is_Independent (T));
- Set_Depends_On_Private (Def_Id, Has_Private_Component (Def_Id));
+ Set_Depends_On_Private (Def_Id, Is_Incompletely_Defined (Def_Id));
Set_Is_Private_Composite (Def_Id, Is_Private_Composite (T));
Set_Is_Limited_Composite (Def_Id, Is_Limited_Composite (T));
@@ -14618,7 +14619,7 @@ package body Sem_Ch3 is
Set_Etype (Itype, Base_Type (Old_Type));
Set_Size_Info (Itype, (Old_Type));
Set_Directly_Designated_Type (Itype, Desig_Subtype);
- Set_Depends_On_Private (Itype, Has_Private_Component
+ Set_Depends_On_Private (Itype, Is_Incompletely_Defined
(Old_Type));
Set_Is_Access_Constant (Itype, Is_Access_Constant
(Old_Type));
@@ -14958,7 +14959,7 @@ package body Sem_Ch3 is
Constrain_Discriminated_Type (Def_Id, SI, Related_Nod);
Set_First_Private_Entity (Def_Id, First_Private_Entity (T_Ent));
- Set_Depends_On_Private (Def_Id, Has_Private_Component (Def_Id));
+ Set_Depends_On_Private (Def_Id, Is_Incompletely_Defined (Def_Id));
Set_Corresponding_Record_Type (Def_Id,
Constrain_Corresponding_Record (Def_Id, T_Val, Related_Nod));
@@ -15011,7 +15012,7 @@ package body Sem_Ch3 is
(T_Sub, Related_Nod, Corr_Rec, Discriminant_Constraint (T_Sub));
end if;
- Set_Depends_On_Private (T_Sub, Has_Private_Component (T_Sub));
+ Set_Depends_On_Private (T_Sub, Is_Incompletely_Defined (T_Sub));
if Ekind (Scope (Prot_Subt)) /= E_Record_Type then
Conditional_Delay (T_Sub, Corr_Rec);
@@ -15838,7 +15839,7 @@ package body Sem_Ch3 is
Set_Is_Volatile_Full_Access (T1, Is_Volatile_Full_Access (T2));
Set_Treat_As_Volatile (T1, Treat_As_Volatile (T2));
Set_Is_Constrained (T1, Is_Constrained (T2));
- Set_Depends_On_Private (T1, Has_Private_Component (T2));
+ Set_Depends_On_Private (T1, Is_Incompletely_Defined (T2));
Inherit_Rep_Item_Chain (T1, T2);
Set_Convention (T1, Convention (T2));
Set_Is_Limited_Composite (T1, Is_Limited_Composite (T2));
@@ -18235,7 +18236,7 @@ package body Sem_Ch3 is
elsif (Is_Incomplete_Or_Private_Type (Parent_Type)
and then not Comes_From_Generic (Parent_Type))
- or else Has_Private_Component (Parent_Type)
+ or else Is_Incompletely_Defined (Parent_Type)
then
-- The ancestor type of a formal type can be incomplete, in which
-- case only the operations of the partial view are available in the
@@ -18247,7 +18248,7 @@ package body Sem_Ch3 is
null;
elsif No (Underlying_Type (Parent_Type))
- or else Has_Private_Component (Parent_Type)
+ or else Is_Incompletely_Defined (Parent_Type)
then
Error_Msg_N
("premature derivation of derived or private type", Indic);
diff --git a/gcc/ada/sem_ch6.adb b/gcc/ada/sem_ch6.adb
index 3016daf2c2f..568b7d46db6 100644
--- a/gcc/ada/sem_ch6.adb
+++ b/gcc/ada/sem_ch6.adb
@@ -9471,7 +9471,7 @@ package body Sem_Ch6 is
(Formal_Typ, Incomplete_View_From_Limited_With (Result_Subt));
Set_Etype (Formal_Typ, Formal_Typ);
Set_Depends_On_Private
- (Formal_Typ, Has_Private_Component (Formal_Typ));
+ (Formal_Typ, Is_Incompletely_Defined (Formal_Typ));
Set_Is_Public (Formal_Typ, Is_Public (Scope (Formal_Typ)));
Set_Is_Access_Constant (Formal_Typ, False);
diff --git a/gcc/ada/sem_res.adb b/gcc/ada/sem_res.adb
index 9a9ae4bc4ca..08d45ebca33 100644
--- a/gcc/ada/sem_res.adb
+++ b/gcc/ada/sem_res.adb
@@ -1821,7 +1821,7 @@ package body Sem_Res is
Orig_Type := Type_In_P (Is_Composite_Type'Access);
if Present (Orig_Type) then
- if Has_Private_Component (Orig_Type) then
+ if Is_Incompletely_Defined (Orig_Type) then
Orig_Type := Empty;
else
Set_Etype (Act1, Orig_Type);
diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb
index 9348bf87d7f..0f576a3941c 100644
--- a/gcc/ada/sem_util.adb
+++ b/gcc/ada/sem_util.adb
@@ -2612,12 +2612,11 @@ package body Sem_Util is
("premature usage of incomplete}", N, First_Subtype (T));
end if;
- -- The other case is a type with a private component (including itself)
- -- that has not yet received a full declaration. But we exclude formal
+ -- The other case is an incompletely defined type. But we exclude formal
-- types, as well as references in generic units to entities declared
-- outside of them, and all references in spec expressions.
- elsif Has_Private_Component (T)
+ elsif Is_Incompletely_Defined (T)
and then not Is_Generic_Type (Root_Type (T))
and then (not Is_Generic_Unit (Current_Scope)
or else Scope_Within_Or_Same (Scope (T), Current_Scope))
@@ -13750,67 +13749,6 @@ package body Sem_Util is
N_Slice;
end Has_Prefix;
- ---------------------------
- -- Has_Private_Component --
- ---------------------------
-
- function Has_Private_Component (Type_Id : Entity_Id) return Boolean is
- Btype : Entity_Id := Base_Type (Type_Id);
- Component : Entity_Id;
-
- begin
- if Error_Posted (Type_Id)
- or else Error_Posted (Btype)
- then
- return False;
- end if;
-
- if Is_Class_Wide_Type (Btype) then
- Btype := Root_Type (Btype);
- end if;
-
- if Is_Private_Type (Btype) then
- declare
- UT : constant Entity_Id := Underlying_Type (Btype);
- begin
- if No (UT) then
- if No (Full_View (Btype)) then
- return not Is_Generic_Type (Btype)
- and then
- not Is_Generic_Type (Root_Type (Btype));
- else
- return not Is_Generic_Type (Root_Type (Full_View (Btype)));
- end if;
- else
- return not Is_Frozen (UT) and then Has_Private_Component (UT);
- end if;
- end;
-
- elsif Is_Array_Type (Btype) then
- return Has_Private_Component (Component_Type (Btype));
-
- elsif Is_Record_Type (Btype) then
- Component := First_Component (Btype);
- while Present (Component) loop
- if Has_Private_Component (Etype (Component)) then
- return True;
- end if;
-
- Next_Component (Component);
- end loop;
-
- return False;
-
- elsif Is_Protected_Type (Btype)
- and then Present (Corresponding_Record_Type (Btype))
- then
- return Has_Private_Component (Corresponding_Record_Type (Btype));
-
- else
- return False;
- end if;
- end Has_Private_Component;
-
--------------------------------
-- Has_Relaxed_Initialization --
--------------------------------
@@ -18676,6 +18614,69 @@ package body Sem_Util is
return False;
end Is_In_Context_Clause;
+ -----------------------------
+ -- Is_Incompletely_Defined --
+ -----------------------------
+
+ function Is_Incompletely_Defined (Type_Id : Entity_Id) return Boolean is
+ Btype : Entity_Id := Base_Type (Type_Id);
+ Component : Entity_Id;
+
+ begin
+ if Error_Posted (Type_Id)
+ or else Error_Posted (Btype)
+ then
+ return False;
+ end if;
+
+ if Is_Class_Wide_Type (Btype) then
+ Btype := Root_Type (Btype);
+ end if;
+
+ if Is_Private_Type (Btype) then
+ declare
+ UT : constant Entity_Id := Underlying_Type (Btype);
+ begin
+ if No (UT) then
+ if No (Full_View (Btype)) then
+ return not Is_Generic_Type (Btype)
+ and then
+ not Is_Generic_Type (Root_Type (Btype));
+ else
+ return not Is_Generic_Type (Root_Type (Full_View (Btype)));
+ end if;
+ else
+ return
+ not Is_Frozen (UT) and then Is_Incompletely_Defined (UT);
+ end if;
+ end;
+
+ elsif Is_Array_Type (Btype) then
+ return Is_Incompletely_Defined (Component_Type (Btype));
+
+ elsif Is_Record_Type (Btype) then
+ Component := First_Component (Btype);
+ while Present (Component) loop
+ if Is_Incompletely_Defined (Etype (Component)) then
+ return True;
+ end if;
+
+ Next_Component (Component);
+ end loop;
+
+ return False;
+
+ elsif Is_Protected_Type (Btype)
+ and then Present (Corresponding_Record_Type (Btype))
+ then
+ return
+ Is_Incompletely_Defined (Corresponding_Record_Type (Btype));
+
+ else
+ return False;
+ end if;
+ end Is_Incompletely_Defined;
+
---------------------------
-- Is_Independent_Object --
---------------------------
diff --git a/gcc/ada/sem_util.ads b/gcc/ada/sem_util.ads
index 9913e941036..98a7ae8be51 100644
--- a/gcc/ada/sem_util.ads
+++ b/gcc/ada/sem_util.ads
@@ -1621,10 +1621,6 @@ package Sem_Util is
function Has_Prefix (N : Node_Id) return Boolean;
-- Return True if N has attribute Prefix
- function Has_Private_Component (Type_Id : Entity_Id) return Boolean;
- -- Check if a type has a (sub)component of a private type that has not
- -- yet received a full declaration.
-
function Has_Relaxed_Initialization (E : Entity_Id) return Boolean;
-- Returns True iff entity E is subject to the Relaxed_Initialization
-- aspect. Entity E can be either type, variable, constant, subprogram or
@@ -2259,6 +2255,11 @@ package Sem_Util is
-- Returns True if N appears within the context clause of a unit, and False
-- for any other placement.
+ function Is_Incompletely_Defined (Type_Id : Entity_Id) return Boolean;
+ -- Returns True iff Type_Id is incompletely defined. See RM 3.11.1 (8) for
+ -- the definition of "completely defined". Note that "incompletely defined"
+ -- is also used in the Ada RM, for example in RM 12.5.1 (1/5).
+
function Is_Independent_Object (N : Node_Id) return Boolean;
-- Determine whether arbitrary node N denotes a reference to an independent
-- object as per RM C.6(8).
--
2.53.0