1 ------------------------------------------------------------------------------
3 -- GNAT COMPILER COMPONENTS --
9 -- Copyright (C) 1992-2021, Free Software Foundation, Inc. --
11 -- GNAT is free software; you can redistribute it and/or modify it under --
12 -- terms of the GNU General Public License as published by the Free Soft- --
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
16 -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
17 -- for more details. You should have received a copy of the GNU General --
18 -- Public License distributed with GNAT; see file COPYING3. If not, go to --
19 -- http://www.gnu.org/licenses for a complete copy of the license. --
21 -- GNAT was originally developed by the GNAT team at New York University. --
22 -- Extensive contributions were provided by Ada Core Technologies Inc. --
24 ------------------------------------------------------------------------------
26 with Atree; use Atree;
27 with Einfo; use Einfo;
28 with Einfo.Entities; use Einfo.Entities;
29 with Einfo.Utils; use Einfo.Utils;
30 with Nlists; use Nlists;
31 with Sinfo; use Sinfo;
32 with Sinfo.Nodes; use Sinfo.Nodes;
33 with Sinfo.Utils; use Sinfo.Utils;
34 with Snames; use Snames;
35 with Stand; use Stand;
36 with Uintp; use Uintp;
38 package body Sem_Aux is
40 ----------------------
41 -- Ancestor_Subtype --
42 ----------------------
44 function Ancestor_Subtype (Typ : Entity_Id) return Entity_Id is
46 -- If this is first subtype, or is a base type, then there is no
47 -- ancestor subtype, so we return Empty to indicate this fact.
49 if Is_First_Subtype (Typ) or else Is_Base_Type (Typ) then
54 D : constant Node_Id := Declaration_Node (Typ);
57 -- If we have a subtype declaration, get the ancestor subtype
59 if Nkind (D) = N_Subtype_Declaration then
60 if Nkind (Subtype_Indication (D)) = N_Subtype_Indication then
61 return Entity (Subtype_Mark (Subtype_Indication (D)));
63 return Entity (Subtype_Indication (D));
66 -- If not, then no subtype indication is available
78 function Available_View (Ent : Entity_Id) return Entity_Id is
80 -- Obtain the non-limited view (if available)
82 if Has_Non_Limited_View (Ent) then
83 return Get_Full_View (Non_Limited_View (Ent));
85 -- In all other cases, return entity unchanged
96 function Constant_Value (Ent : Entity_Id) return Node_Id is
97 D : constant Node_Id := Declaration_Node (Ent);
101 -- If we have no declaration node, then return no constant value. Not
102 -- clear how this can happen, but it does sometimes and this is the
108 -- Normal case where a declaration node is present
110 elsif Nkind (D) = N_Object_Renaming_Declaration then
111 return Renamed_Object (Ent);
113 -- If this is a component declaration whose entity is a constant, it is
114 -- a prival within a protected function (and so has no constant value).
116 elsif Nkind (D) = N_Component_Declaration then
119 -- If there is an expression, return it
121 elsif Present (Expression (D)) then
122 return Expression (D);
124 -- For a constant, see if we have a full view
126 elsif Ekind (Ent) = E_Constant
127 and then Present (Full_View (Ent))
129 Full_D := Parent (Full_View (Ent));
131 -- The full view may have been rewritten as an object renaming
133 if Nkind (Full_D) = N_Object_Renaming_Declaration then
134 return Name (Full_D);
136 return Expression (Full_D);
139 -- Otherwise we have no expression to return
146 ---------------------------------
147 -- Corresponding_Unsigned_Type --
148 ---------------------------------
150 function Corresponding_Unsigned_Type (Typ : Entity_Id) return Entity_Id is
151 pragma Assert (Is_Signed_Integer_Type (Typ));
152 Siz : constant Uint := Esize (Base_Type (Typ));
154 if Siz = Esize (Standard_Short_Short_Integer) then
155 return Standard_Short_Short_Unsigned;
156 elsif Siz = Esize (Standard_Short_Integer) then
157 return Standard_Short_Unsigned;
158 elsif Siz = Esize (Standard_Unsigned) then
159 return Standard_Unsigned;
160 elsif Siz = Esize (Standard_Long_Integer) then
161 return Standard_Long_Unsigned;
162 elsif Siz = Esize (Standard_Long_Long_Integer) then
163 return Standard_Long_Long_Unsigned;
164 elsif Siz = Esize (Standard_Long_Long_Long_Integer) then
165 return Standard_Long_Long_Long_Unsigned;
169 end Corresponding_Unsigned_Type;
171 -----------------------------
172 -- Enclosing_Dynamic_Scope --
173 -----------------------------
175 function Enclosing_Dynamic_Scope (Ent : Entity_Id) return Entity_Id is
179 -- The following test is an error defense against some syntax errors
180 -- that can leave scopes very messed up.
182 if Ent = Standard_Standard then
186 -- Normal case, search enclosing scopes
188 -- Note: the test for Present (S) should not be required, it defends
189 -- against an ill-formed tree.
193 -- If we somehow got an empty value for Scope, the tree must be
194 -- malformed. Rather than blow up we return Standard in this case.
197 return Standard_Standard;
199 -- Quit if we get to standard or a dynamic scope. We must also
200 -- handle enclosing scopes that have a full view; required to
201 -- locate enclosing scopes that are synchronized private types
202 -- whose full view is a task type.
204 elsif S = Standard_Standard
205 or else Is_Dynamic_Scope (S)
206 or else (Is_Private_Type (S)
207 and then Present (Full_View (S))
208 and then Is_Dynamic_Scope (Full_View (S)))
212 -- Otherwise keep climbing
218 end Enclosing_Dynamic_Scope;
220 ------------------------
221 -- First_Discriminant --
222 ------------------------
224 function First_Discriminant (Typ : Entity_Id) return Entity_Id is
229 (Has_Discriminants (Typ) or else Has_Unknown_Discriminants (Typ));
231 Ent := First_Entity (Typ);
233 -- The discriminants are not necessarily contiguous, because access
234 -- discriminants will generate itypes. They are not the first entities
235 -- either because the tag must be ahead of them.
237 if Chars (Ent) = Name_uTag then
241 -- Skip all hidden stored discriminants if any
243 while Present (Ent) loop
244 exit when Ekind (Ent) = E_Discriminant
245 and then not Is_Completely_Hidden (Ent);
250 -- Call may be on a private type with unknown discriminants, in which
251 -- case Ent is Empty, and as per the spec, we return Empty in this case.
253 -- Historical note: The assertion in previous versions that Ent is a
254 -- discriminant was overly cautious and prevented convenient application
255 -- of this function in the gnatprove context.
258 end First_Discriminant;
260 -------------------------------
261 -- First_Stored_Discriminant --
262 -------------------------------
264 function First_Stored_Discriminant (Typ : Entity_Id) return Entity_Id is
267 function Has_Completely_Hidden_Discriminant
268 (Typ : Entity_Id) return Boolean;
269 -- Scans the Discriminants to see whether any are Completely_Hidden
270 -- (the mechanism for describing non-specified stored discriminants)
271 -- Note that the entity list for the type may contain anonymous access
272 -- types created by expressions that constrain access discriminants.
274 ----------------------------------------
275 -- Has_Completely_Hidden_Discriminant --
276 ----------------------------------------
278 function Has_Completely_Hidden_Discriminant
279 (Typ : Entity_Id) return Boolean
284 pragma Assert (Ekind (Typ) = E_Discriminant);
287 while Present (Ent) loop
289 -- Skip anonymous types that may be created by expressions
290 -- used as discriminant constraints on inherited discriminants.
292 if Is_Itype (Ent) then
295 elsif Ekind (Ent) = E_Discriminant
296 and then Is_Completely_Hidden (Ent)
305 end Has_Completely_Hidden_Discriminant;
307 -- Start of processing for First_Stored_Discriminant
311 (Has_Discriminants (Typ)
312 or else Has_Unknown_Discriminants (Typ));
314 Ent := First_Entity (Typ);
316 if Chars (Ent) = Name_uTag then
320 if Has_Completely_Hidden_Discriminant (Ent) then
321 while Present (Ent) loop
322 exit when Ekind (Ent) = E_Discriminant
323 and then Is_Completely_Hidden (Ent);
328 pragma Assert (Ekind (Ent) = E_Discriminant);
331 end First_Stored_Discriminant;
337 function First_Subtype (Typ : Entity_Id) return Entity_Id is
338 B : constant Entity_Id := Base_Type (Typ);
339 F : constant Node_Id := Freeze_Node (B);
343 -- If the base type has no freeze node, it is a type in Standard, and
344 -- always acts as its own first subtype, except where it is one of the
345 -- predefined integer types. If the type is formal, it is also a first
346 -- subtype, and its base type has no freeze node. On the other hand, a
347 -- subtype of a generic formal is not its own first subtype. Its base
348 -- type, if anonymous, is attached to the formal type declaration from
349 -- which the first subtype is obtained.
352 if B = Base_Type (Standard_Integer) then
353 return Standard_Integer;
355 elsif B = Base_Type (Standard_Long_Integer) then
356 return Standard_Long_Integer;
358 elsif B = Base_Type (Standard_Short_Short_Integer) then
359 return Standard_Short_Short_Integer;
361 elsif B = Base_Type (Standard_Short_Integer) then
362 return Standard_Short_Integer;
364 elsif B = Base_Type (Standard_Long_Long_Integer) then
365 return Standard_Long_Long_Integer;
367 elsif B = Base_Type (Standard_Long_Long_Long_Integer) then
368 return Standard_Long_Long_Long_Integer;
370 elsif Is_Generic_Type (Typ) then
371 if Present (Parent (B)) then
372 return Defining_Identifier (Parent (B));
374 return Defining_Identifier (Associated_Node_For_Itype (B));
381 -- Otherwise we check the freeze node, if it has a First_Subtype_Link
382 -- then we use that link, otherwise (happens with some Itypes), we use
383 -- the base type itself.
386 Ent := First_Subtype_Link (F);
388 if Present (Ent) then
396 -------------------------
397 -- First_Tag_Component --
398 -------------------------
400 function First_Tag_Component (Typ : Entity_Id) return Entity_Id is
406 pragma Assert (Is_Tagged_Type (Ctyp));
408 if Is_Class_Wide_Type (Ctyp) then
409 Ctyp := Root_Type (Ctyp);
412 if Is_Private_Type (Ctyp) then
413 Ctyp := Underlying_Type (Ctyp);
415 -- If the underlying type is missing then the source program has
416 -- errors and there is nothing else to do (the full-type declaration
417 -- associated with the private type declaration is missing).
424 Comp := First_Entity (Ctyp);
425 while Present (Comp) loop
426 if Is_Tag (Comp) then
433 -- No tag component found
436 end First_Tag_Component;
438 -----------------------
439 -- Get_Called_Entity --
440 -----------------------
442 function Get_Called_Entity (Call : Node_Id) return Entity_Id is
443 Nam : constant Node_Id := Name (Call);
447 if Nkind (Nam) = N_Explicit_Dereference then
449 pragma Assert (Ekind (Id) = E_Subprogram_Type);
451 elsif Nkind (Nam) = N_Selected_Component then
452 Id := Entity (Selector_Name (Nam));
454 elsif Nkind (Nam) = N_Indexed_Component then
455 Id := Entity (Selector_Name (Prefix (Nam)));
462 end Get_Called_Entity;
468 function Get_Rep_Item
471 Check_Parents : Boolean := True) return Node_Id
476 N := First_Rep_Item (E);
477 while Present (N) loop
479 -- Only one of Priority / Interrupt_Priority can be specified, so
480 -- return whichever one is present to catch illegal duplication.
482 if Nkind (N) = N_Pragma
484 (Pragma_Name_Unmapped (N) = Nam
485 or else (Nam = Name_Priority
486 and then Pragma_Name (N) =
487 Name_Interrupt_Priority)
488 or else (Nam = Name_Interrupt_Priority
489 and then Pragma_Name (N) = Name_Priority))
491 if Check_Parents then
494 -- If Check_Parents is False, return N if the pragma doesn't
495 -- appear in the Rep_Item chain of the parent.
499 Par : constant Entity_Id := Nearest_Ancestor (E);
500 -- This node represents the parent type of type E (if any)
506 elsif not Present_In_Rep_Item (Par, N) then
512 elsif Nkind (N) = N_Attribute_Definition_Clause
515 or else (Nam = Name_Priority
516 and then Chars (N) = Name_Interrupt_Priority))
518 if Check_Parents or else Entity (N) = E then
522 elsif Nkind (N) = N_Aspect_Specification
524 (Chars (Identifier (N)) = Nam
527 and then Chars (Identifier (N)) = Name_Interrupt_Priority))
529 if Check_Parents then
532 elsif Entity (N) = E then
536 -- A Ghost-related aspect, if disabled, may have been replaced by a
539 elsif Nkind (N) = N_Null_Statement then
540 N := Original_Node (N);
549 function Get_Rep_Item
553 Check_Parents : Boolean := True) return Node_Id
555 Nam1_Item : constant Node_Id := Get_Rep_Item (E, Nam1, Check_Parents);
556 Nam2_Item : constant Node_Id := Get_Rep_Item (E, Nam2, Check_Parents);
561 -- Check both Nam1_Item and Nam2_Item are present
563 if No (Nam1_Item) then
565 elsif No (Nam2_Item) then
569 -- Return the first node encountered in the list
571 N := First_Rep_Item (E);
572 while Present (N) loop
573 if N = Nam1_Item or else N = Nam2_Item then
587 function Get_Rep_Pragma
590 Check_Parents : Boolean := True) return Node_Id
592 N : constant Node_Id := Get_Rep_Item (E, Nam, Check_Parents);
595 if Present (N) and then Nkind (N) = N_Pragma then
602 function Get_Rep_Pragma
606 Check_Parents : Boolean := True) return Node_Id
608 Nam1_Item : constant Node_Id := Get_Rep_Pragma (E, Nam1, Check_Parents);
609 Nam2_Item : constant Node_Id := Get_Rep_Pragma (E, Nam2, Check_Parents);
614 -- Check both Nam1_Item and Nam2_Item are present
616 if No (Nam1_Item) then
618 elsif No (Nam2_Item) then
622 -- Return the first node encountered in the list
624 N := First_Rep_Item (E);
625 while Present (N) loop
626 if N = Nam1_Item or else N = Nam2_Item then
636 ---------------------------------
637 -- Has_External_Tag_Rep_Clause --
638 ---------------------------------
640 function Has_External_Tag_Rep_Clause (T : Entity_Id) return Boolean is
642 pragma Assert (Is_Tagged_Type (T));
643 return Has_Rep_Item (T, Name_External_Tag, Check_Parents => False);
644 end Has_External_Tag_Rep_Clause;
650 function Has_Rep_Item
653 Check_Parents : Boolean := True) return Boolean
656 return Present (Get_Rep_Item (E, Nam, Check_Parents));
659 function Has_Rep_Item
663 Check_Parents : Boolean := True) return Boolean
666 return Present (Get_Rep_Item (E, Nam1, Nam2, Check_Parents));
673 function Has_Rep_Pragma
676 Check_Parents : Boolean := True) return Boolean
679 return Present (Get_Rep_Pragma (E, Nam, Check_Parents));
682 function Has_Rep_Pragma
686 Check_Parents : Boolean := True) return Boolean
689 return Present (Get_Rep_Pragma (E, Nam1, Nam2, Check_Parents));
692 --------------------------------
693 -- Has_Unconstrained_Elements --
694 --------------------------------
696 function Has_Unconstrained_Elements (T : Entity_Id) return Boolean is
697 U_T : constant Entity_Id := Underlying_Type (T);
701 elsif Is_Record_Type (U_T) then
702 return Has_Discriminants (U_T) and then not Is_Constrained (U_T);
703 elsif Is_Array_Type (U_T) then
704 return Has_Unconstrained_Elements (Component_Type (U_T));
708 end Has_Unconstrained_Elements;
710 ----------------------
711 -- Has_Variant_Part --
712 ----------------------
714 function Has_Variant_Part (Typ : Entity_Id) return Boolean is
721 if not Is_Type (Typ) then
725 FSTyp := First_Subtype (Typ);
727 if not Has_Discriminants (FSTyp) then
731 -- Proceed with cautious checks here, return False if tree is not
732 -- as expected (may be caused by prior errors).
734 Decl := Declaration_Node (FSTyp);
736 if Nkind (Decl) /= N_Full_Type_Declaration then
740 TDef := Type_Definition (Decl);
742 if Nkind (TDef) /= N_Record_Definition then
746 CList := Component_List (TDef);
748 if Nkind (CList) /= N_Component_List then
751 return Present (Variant_Part (CList));
753 end Has_Variant_Part;
755 ---------------------
756 -- In_Generic_Body --
757 ---------------------
759 function In_Generic_Body (Id : Entity_Id) return Boolean is
763 -- Climb scopes looking for generic body
766 while Present (S) and then S /= Standard_Standard loop
768 -- Generic package body
770 if Ekind (S) = E_Generic_Package
771 and then In_Package_Body (S)
775 -- Generic subprogram body
777 elsif Is_Subprogram (S)
778 and then Nkind (Unit_Declaration_Node (S)) =
779 N_Generic_Subprogram_Declaration
787 -- False if top of scope stack without finding a generic body
792 -------------------------------
793 -- Initialization_Suppressed --
794 -------------------------------
796 function Initialization_Suppressed (Typ : Entity_Id) return Boolean is
798 return Suppress_Initialization (Typ)
799 or else Suppress_Initialization (Base_Type (Typ));
800 end Initialization_Suppressed;
806 procedure Initialize is
808 Obsolescent_Warnings.Init;
815 function Is_Body (N : Node_Id) return Boolean is
818 N_Body_Stub | N_Entry_Body | N_Package_Body | N_Protected_Body |
819 N_Subprogram_Body | N_Task_Body;
822 ---------------------
823 -- Is_By_Copy_Type --
824 ---------------------
826 function Is_By_Copy_Type (Ent : Entity_Id) return Boolean is
828 -- If Id is a private type whose full declaration has not been seen,
829 -- we assume for now that it is not a By_Copy type. Clearly this
830 -- attribute should not be used before the type is frozen, but it is
831 -- needed to build the associated record of a protected type. Another
832 -- place where some lookahead for a full view is needed ???
835 Is_Elementary_Type (Ent)
836 or else (Is_Private_Type (Ent)
837 and then Present (Underlying_Type (Ent))
838 and then Is_Elementary_Type (Underlying_Type (Ent)));
841 --------------------------
842 -- Is_By_Reference_Type --
843 --------------------------
845 function Is_By_Reference_Type (Ent : Entity_Id) return Boolean is
846 Btype : constant Entity_Id := Base_Type (Ent);
849 if Error_Posted (Ent) or else Error_Posted (Btype) then
852 elsif Is_Private_Type (Btype) then
854 Utyp : constant Entity_Id := Underlying_Type (Btype);
859 return Is_By_Reference_Type (Utyp);
863 elsif Is_Incomplete_Type (Btype) then
865 Ftyp : constant Entity_Id := Full_View (Btype);
867 -- Return true for a tagged incomplete type built as a shadow
868 -- entity in Build_Limited_Views. It can appear in the profile
869 -- of a thunk and the back end needs to know how it is passed.
872 return Is_Tagged_Type (Btype);
874 return Is_By_Reference_Type (Ftyp);
878 elsif Is_Concurrent_Type (Btype) then
881 elsif Is_Record_Type (Btype) then
882 if Is_Limited_Record (Btype)
883 or else Is_Tagged_Type (Btype)
884 or else Is_Volatile (Btype)
893 C := First_Component (Btype);
894 while Present (C) loop
896 -- For each component, test if its type is a by reference
897 -- type and if its type is volatile. Also test the component
898 -- itself for being volatile. This happens for example when
899 -- a Volatile aspect is added to a component.
901 if Is_By_Reference_Type (Etype (C))
902 or else Is_Volatile (Etype (C))
903 or else Is_Volatile (C)
915 elsif Is_Array_Type (Btype) then
918 or else Is_By_Reference_Type (Component_Type (Btype))
919 or else Is_Volatile (Component_Type (Btype))
920 or else Has_Volatile_Components (Btype);
925 end Is_By_Reference_Type;
927 -------------------------
928 -- Is_Definite_Subtype --
929 -------------------------
931 function Is_Definite_Subtype (T : Entity_Id) return Boolean is
932 pragma Assert (Is_Type (T));
933 K : constant Entity_Kind := Ekind (T);
936 if Is_Constrained (T) then
939 elsif K in Array_Kind
940 or else K in Class_Wide_Kind
941 or else Has_Unknown_Discriminants (T)
945 -- Known discriminants: definite if there are default values. Note that
946 -- if any discriminant has a default, they all do.
948 elsif Has_Discriminants (T) then
949 return Present (Discriminant_Default_Value (First_Discriminant (T)));
954 end Is_Definite_Subtype;
956 ---------------------
957 -- Is_Derived_Type --
958 ---------------------
960 function Is_Derived_Type (Ent : E) return B is
965 and then Base_Type (Ent) /= Root_Type (Ent)
966 and then not Is_Class_Wide_Type (Ent)
968 -- An access_to_subprogram whose result type is a limited view can
969 -- appear in a return statement, without the full view of the result
970 -- type being available. Do not interpret this as a derived type.
972 and then Ekind (Ent) /= E_Subprogram_Type
974 if not Is_Numeric_Type (Root_Type (Ent)) then
978 Par := Parent (First_Subtype (Ent));
981 and then Nkind (Par) = N_Full_Type_Declaration
982 and then Nkind (Type_Definition (Par)) =
983 N_Derived_Type_Definition;
991 -----------------------
992 -- Is_Generic_Formal --
993 -----------------------
995 function Is_Generic_Formal (E : Entity_Id) return Boolean is
1002 -- Formal derived types are rewritten as private extensions, so
1003 -- examine original node.
1005 Kind := Nkind (Original_Node (Parent (E)));
1008 Kind in N_Formal_Object_Declaration | N_Formal_Type_Declaration
1009 or else Is_Formal_Subprogram (E)
1011 (Ekind (E) = E_Package
1012 and then Nkind (Original_Node (Unit_Declaration_Node (E))) =
1013 N_Formal_Package_Declaration);
1015 end Is_Generic_Formal;
1017 -------------------------------
1018 -- Is_Immutably_Limited_Type --
1019 -------------------------------
1021 function Is_Immutably_Limited_Type (Ent : Entity_Id) return Boolean is
1022 Btype : constant Entity_Id := Available_View (Base_Type (Ent));
1025 if Is_Limited_Record (Btype) then
1028 elsif Ekind (Btype) = E_Limited_Private_Type
1029 and then Nkind (Parent (Btype)) = N_Formal_Type_Declaration
1031 return not In_Package_Body (Scope ((Btype)));
1033 elsif Is_Private_Type (Btype) then
1035 -- AI05-0063: A type derived from a limited private formal type is
1036 -- not immutably limited in a generic body.
1038 if Is_Derived_Type (Btype)
1039 and then Is_Generic_Type (Etype (Btype))
1041 if not Is_Limited_Type (Etype (Btype)) then
1044 -- A descendant of a limited formal type is not immutably limited
1045 -- in the generic body, or in the body of a generic child.
1047 elsif Ekind (Scope (Etype (Btype))) = E_Generic_Package then
1048 return not In_Package_Body (Scope (Btype));
1056 Utyp : constant Entity_Id := Underlying_Type (Btype);
1061 return Is_Immutably_Limited_Type (Utyp);
1066 elsif Is_Concurrent_Type (Btype) then
1072 end Is_Immutably_Limited_Type;
1074 ---------------------
1075 -- Is_Limited_Type --
1076 ---------------------
1078 function Is_Limited_Type (Ent : Entity_Id) return Boolean is
1083 if not Is_Type (Ent) then
1087 Btype := Base_Type (Ent);
1088 Rtype := Root_Type (Btype);
1090 if Ekind (Btype) = E_Limited_Private_Type
1091 or else Is_Limited_Composite (Btype)
1095 elsif Is_Concurrent_Type (Btype) then
1098 -- The Is_Limited_Record flag normally indicates that the type is
1099 -- limited. The exception is that a type does not inherit limitedness
1100 -- from its interface ancestor. So the type may be derived from a
1101 -- limited interface, but is not limited.
1103 elsif Is_Limited_Record (Ent)
1104 and then not Is_Interface (Ent)
1108 -- Otherwise we will look around to see if there is some other reason
1109 -- for it to be limited, except that if an error was posted on the
1110 -- entity, then just assume it is non-limited, because it can cause
1111 -- trouble to recurse into a murky entity resulting from other errors.
1113 elsif Error_Posted (Ent) then
1116 elsif Is_Record_Type (Btype) then
1118 if Is_Limited_Interface (Ent) then
1121 -- AI-419: limitedness is not inherited from a limited interface
1123 elsif Is_Limited_Record (Rtype) then
1124 return not Is_Interface (Rtype)
1125 or else Is_Protected_Interface (Rtype)
1126 or else Is_Synchronized_Interface (Rtype)
1127 or else Is_Task_Interface (Rtype);
1129 elsif Is_Class_Wide_Type (Btype) then
1130 return Is_Limited_Type (Rtype);
1137 C := First_Component (Btype);
1138 while Present (C) loop
1139 if Is_Limited_Type (Etype (C)) then
1150 elsif Is_Array_Type (Btype) then
1151 return Is_Limited_Type (Component_Type (Btype));
1156 end Is_Limited_Type;
1158 ---------------------
1159 -- Is_Limited_View --
1160 ---------------------
1162 function Is_Limited_View (Ent : Entity_Id) return Boolean is
1163 Btype : constant Entity_Id := Available_View (Base_Type (Ent));
1166 if Is_Limited_Record (Btype) then
1169 elsif Ekind (Btype) = E_Limited_Private_Type
1170 and then Nkind (Parent (Btype)) = N_Formal_Type_Declaration
1172 return not In_Package_Body (Scope ((Btype)));
1174 elsif Is_Private_Type (Btype) then
1176 -- AI05-0063: A type derived from a limited private formal type is
1177 -- not immutably limited in a generic body.
1179 if Is_Derived_Type (Btype)
1180 and then Is_Generic_Type (Etype (Btype))
1182 if not Is_Limited_Type (Etype (Btype)) then
1185 -- A descendant of a limited formal type is not immutably limited
1186 -- in the generic body, or in the body of a generic child.
1188 elsif Ekind (Scope (Etype (Btype))) = E_Generic_Package then
1189 return not In_Package_Body (Scope (Btype));
1197 Utyp : constant Entity_Id := Underlying_Type (Btype);
1202 return Is_Limited_View (Utyp);
1207 elsif Is_Concurrent_Type (Btype) then
1210 elsif Is_Record_Type (Btype) then
1212 -- Note that we return True for all limited interfaces, even though
1213 -- (unsynchronized) limited interfaces can have descendants that are
1214 -- nonlimited, because this is a predicate on the type itself, and
1215 -- things like functions with limited interface results need to be
1216 -- handled as build in place even though they might return objects
1217 -- of a type that is not inherently limited.
1219 if Is_Class_Wide_Type (Btype) then
1220 return Is_Limited_View (Root_Type (Btype));
1227 C := First_Component (Btype);
1228 while Present (C) loop
1230 -- Don't consider components with interface types (which can
1231 -- only occur in the case of a _parent component anyway).
1232 -- They don't have any components, plus it would cause this
1233 -- function to return true for nonlimited types derived from
1234 -- limited interfaces.
1236 if not Is_Interface (Etype (C))
1237 and then Is_Limited_View (Etype (C))
1249 elsif Is_Array_Type (Btype) then
1250 return Is_Limited_View (Component_Type (Btype));
1255 end Is_Limited_View;
1257 -------------------------------
1258 -- Is_Record_Or_Limited_Type --
1259 -------------------------------
1261 function Is_Record_Or_Limited_Type (Typ : Entity_Id) return Boolean is
1263 return Is_Record_Type (Typ) or else Is_Limited_Type (Typ);
1264 end Is_Record_Or_Limited_Type;
1266 ----------------------
1267 -- Nearest_Ancestor --
1268 ----------------------
1270 function Nearest_Ancestor (Typ : Entity_Id) return Entity_Id is
1271 D : constant Node_Id := Original_Node (Declaration_Node (Typ));
1272 -- We use the original node of the declaration, because derived
1273 -- types from record subtypes are rewritten as record declarations,
1274 -- and it is the original declaration that carries the ancestor.
1277 -- If we have a subtype declaration, get the ancestor subtype
1279 if Nkind (D) = N_Subtype_Declaration then
1280 if Nkind (Subtype_Indication (D)) = N_Subtype_Indication then
1281 return Entity (Subtype_Mark (Subtype_Indication (D)));
1283 return Entity (Subtype_Indication (D));
1286 -- If derived type declaration, find who we are derived from
1288 elsif Nkind (D) = N_Full_Type_Declaration
1289 and then Nkind (Type_Definition (D)) = N_Derived_Type_Definition
1292 DTD : constant Entity_Id := Type_Definition (D);
1293 SI : constant Entity_Id := Subtype_Indication (DTD);
1295 if Is_Entity_Name (SI) then
1298 return Entity (Subtype_Mark (SI));
1302 -- If this is a concurrent declaration with a nonempty interface list,
1303 -- get the first progenitor. Account for case of a record type created
1304 -- for a concurrent type (which is the only case that seems to occur
1307 elsif Nkind (D) = N_Full_Type_Declaration
1308 and then (Is_Concurrent_Type (Defining_Identifier (D))
1309 or else Is_Concurrent_Record_Type (Defining_Identifier (D)))
1310 and then Is_Non_Empty_List (Interface_List (Type_Definition (D)))
1312 return Entity (First (Interface_List (Type_Definition (D))));
1314 -- If derived type and private type, get the full view to find who we
1315 -- are derived from.
1317 elsif Is_Derived_Type (Typ)
1318 and then Is_Private_Type (Typ)
1319 and then Present (Full_View (Typ))
1321 return Nearest_Ancestor (Full_View (Typ));
1323 -- Otherwise, nothing useful to return, return Empty
1328 end Nearest_Ancestor;
1330 ---------------------------
1331 -- Nearest_Dynamic_Scope --
1332 ---------------------------
1334 function Nearest_Dynamic_Scope (Ent : Entity_Id) return Entity_Id is
1336 if Is_Dynamic_Scope (Ent) then
1339 return Enclosing_Dynamic_Scope (Ent);
1341 end Nearest_Dynamic_Scope;
1343 ------------------------
1344 -- Next_Tag_Component --
1345 ------------------------
1347 function Next_Tag_Component (Tag : Entity_Id) return Entity_Id is
1351 pragma Assert (Is_Tag (Tag));
1353 -- Loop to look for next tag component
1355 Comp := Next_Entity (Tag);
1356 while Present (Comp) loop
1357 if Is_Tag (Comp) then
1358 pragma Assert (Chars (Comp) /= Name_uTag);
1365 -- No tag component found
1368 end Next_Tag_Component;
1370 --------------------------
1371 -- Number_Discriminants --
1372 --------------------------
1374 function Number_Discriminants (Typ : Entity_Id) return Pos is
1376 Discr : Entity_Id := First_Discriminant (Typ);
1379 while Present (Discr) loop
1381 Next_Discriminant (Discr);
1385 end Number_Discriminants;
1387 ----------------------------------------------
1388 -- Object_Type_Has_Constrained_Partial_View --
1389 ----------------------------------------------
1391 function Object_Type_Has_Constrained_Partial_View
1393 Scop : Entity_Id) return Boolean
1396 return Has_Constrained_Partial_View (Typ)
1397 or else (In_Generic_Body (Scop)
1398 and then Is_Generic_Type (Base_Type (Typ))
1399 and then (Is_Private_Type (Base_Type (Typ))
1400 or else Is_Derived_Type (Base_Type (Typ)))
1401 and then not Is_Tagged_Type (Typ)
1402 and then not (Is_Array_Type (Typ)
1403 and then not Is_Constrained (Typ))
1404 and then Has_Discriminants (Typ));
1405 end Object_Type_Has_Constrained_Partial_View;
1411 function Package_Spec (E : Entity_Id) return Node_Id is
1413 return Parent (Package_Specification (E));
1416 ---------------------------
1417 -- Package_Specification --
1418 ---------------------------
1420 function Package_Specification (E : Entity_Id) return Node_Id is
1424 pragma Assert (Is_Package_Or_Generic_Package (E));
1428 if Nkind (N) = N_Defining_Program_Unit_Name then
1432 pragma Assert (Nkind (N) = N_Package_Specification);
1435 end Package_Specification;
1437 ---------------------
1438 -- Subprogram_Body --
1439 ---------------------
1441 function Subprogram_Body (E : Entity_Id) return Node_Id is
1442 Body_E : constant Entity_Id := Subprogram_Body_Entity (E);
1448 return Parent (Subprogram_Specification (Body_E));
1450 end Subprogram_Body;
1452 ----------------------------
1453 -- Subprogram_Body_Entity --
1454 ----------------------------
1456 function Subprogram_Body_Entity (E : Entity_Id) return Entity_Id is
1457 N : constant Node_Id := Parent (Subprogram_Specification (E));
1458 -- Declaration for E
1461 -- If this declaration is not a subprogram body, then it must be a
1462 -- subprogram declaration or body stub, from which we can retrieve the
1463 -- entity for the corresponding subprogram body if any, or an abstract
1464 -- subprogram declaration, for which we return Empty.
1467 when N_Subprogram_Body =>
1470 when N_Subprogram_Body_Stub
1471 | N_Subprogram_Declaration
1473 return Corresponding_Body (N);
1478 end Subprogram_Body_Entity;
1480 ---------------------
1481 -- Subprogram_Spec --
1482 ---------------------
1484 function Subprogram_Spec (E : Entity_Id) return Node_Id is
1485 N : constant Node_Id := Parent (Subprogram_Specification (E));
1486 -- Declaration for E
1489 -- This declaration is either subprogram declaration or a subprogram
1490 -- body, in which case return Empty.
1492 if Nkind (N) = N_Subprogram_Declaration then
1497 end Subprogram_Spec;
1499 ------------------------------
1500 -- Subprogram_Specification --
1501 ------------------------------
1503 function Subprogram_Specification (E : Entity_Id) return Node_Id is
1509 if Nkind (N) = N_Defining_Program_Unit_Name then
1513 -- If the Parent pointer of E is not a subprogram specification node
1514 -- (going through an intermediate N_Defining_Program_Unit_Name node
1515 -- for subprogram units), then E is an inherited operation. Its parent
1516 -- points to the type derivation that produces the inheritance: that's
1517 -- the node that generates the subprogram specification. Its alias
1518 -- is the parent subprogram, and that one points to a subprogram
1519 -- declaration, or to another type declaration if this is a hierarchy
1522 if Nkind (N) not in N_Subprogram_Specification then
1523 pragma Assert (Present (Alias (E)));
1524 N := Subprogram_Specification (Alias (E));
1528 end Subprogram_Specification;
1530 --------------------
1531 -- Ultimate_Alias --
1532 --------------------
1534 function Ultimate_Alias (Prim : Entity_Id) return Entity_Id is
1535 E : Entity_Id := Prim;
1538 while Present (Alias (E)) loop
1539 pragma Assert (Alias (E) /= E);
1546 --------------------------
1547 -- Unit_Declaration_Node --
1548 --------------------------
1550 function Unit_Declaration_Node (Unit_Id : Entity_Id) return Node_Id is
1551 N : Node_Id := Parent (Unit_Id);
1554 -- Predefined operators do not have a full function declaration
1556 if Ekind (Unit_Id) = E_Operator then
1560 -- Isn't there some better way to express the following ???
1562 while Nkind (N) /= N_Abstract_Subprogram_Declaration
1563 and then Nkind (N) /= N_Entry_Body
1564 and then Nkind (N) /= N_Entry_Declaration
1565 and then Nkind (N) /= N_Formal_Package_Declaration
1566 and then Nkind (N) /= N_Function_Instantiation
1567 and then Nkind (N) /= N_Generic_Package_Declaration
1568 and then Nkind (N) /= N_Generic_Subprogram_Declaration
1569 and then Nkind (N) /= N_Package_Declaration
1570 and then Nkind (N) /= N_Package_Body
1571 and then Nkind (N) /= N_Package_Instantiation
1572 and then Nkind (N) /= N_Package_Renaming_Declaration
1573 and then Nkind (N) /= N_Procedure_Instantiation
1574 and then Nkind (N) /= N_Protected_Body
1575 and then Nkind (N) /= N_Protected_Type_Declaration
1576 and then Nkind (N) /= N_Subprogram_Declaration
1577 and then Nkind (N) /= N_Subprogram_Body
1578 and then Nkind (N) /= N_Subprogram_Body_Stub
1579 and then Nkind (N) /= N_Subprogram_Renaming_Declaration
1580 and then Nkind (N) /= N_Task_Body
1581 and then Nkind (N) /= N_Task_Type_Declaration
1582 and then Nkind (N) not in N_Formal_Subprogram_Declaration
1583 and then Nkind (N) not in N_Generic_Renaming_Declaration
1587 -- We don't use Assert here, because that causes an infinite loop
1588 -- when assertions are turned off. Better to crash.
1591 raise Program_Error;
1596 end Unit_Declaration_Node;