@@ -177,10 +177,8 @@ package body Comperr is
-- Output target name, deleting junk final reverse slash
- if Target_Name.all (Target_Name.all'Last) = '\'
- or else Target_Name.all (Target_Name.all'Last) = '/'
- then
- Write_Str (Target_Name.all (1 .. Target_Name.all'Last - 1));
+ if Target_Name (Target_Name'Last) in '/' | '\' then
+ Write_Str (Target_Name (1 .. Target_Name'Last - 1));
else
Write_Str (Target_Name.all);
end if;
@@ -1784,6 +1784,7 @@ package body CStand is
Set_Is_Immediately_Visible (Ident_Node, True);
Set_Is_Intrinsic_Subprogram (Ident_Node, True);
+ Set_Is_Past_Self_Hiding_Point (Ident_Node);
Set_Name_Entity_Id (Op, Ident_Node);
Append_Entity (Ident_Node, Standard_Standard);
@@ -1806,9 +1807,10 @@ package body CStand is
Set_Is_Public (E);
-- All standard entity names are analyzed manually, and are thus
- -- frozen as soon as they are created.
+ -- frozen and not self-hidden as soon as they are created.
Set_Is_Frozen (E);
+ Set_Is_Past_Self_Hiding_Point (E);
-- Set debug information required for all standard types
@@ -41,7 +41,7 @@ package body Debug is
-- dh Generate listing showing loading of name table hash chains
-- di Generate messages for visibility linking/delinking
-- dj Suppress "junk null check" for access parameter values
- -- dk Generate GNATBUG message on abort, even if previous errors
+ -- dk Generate "GNAT BUG" message on abort, even if previous errors
-- dl Generate unit load trace messages
-- dm Prevent special frontend inlining in GNATprove mode
-- dn Generate messages for node/list allocation
@@ -113,7 +113,7 @@ package body Debug is
-- d.z Restore previous support for frontend handling of Inline_Always
-- d.A Enable statistics printing in Atree
- -- d.B Generate a bug box on abort_statement
+ -- d.B Generate a "GNAT BUG" message on abort_statement
-- d.C Generate concatenation call, do not generate inline code
-- d.D Disable errors on use of overriding keyword in Ada 95 mode
-- d.E Turn selected errors into warnings
@@ -486,9 +486,12 @@ package body Debug is
-- GNAT before 3.10, so this switch can ease the transition process.
-- dk Immediate kill on abort. Normally on an abort (i.e. a call to
- -- Comperr.Compiler_Abort), the GNATBUG message is not given if
- -- there is a previous error. This debug switch bypasses this test
- -- and gives the message unconditionally (useful for debugging).
+ -- Comperr.Compiler_Abort), the "GNAT BUG" message is not given if
+ -- there is a previous error. Instead, the message "compilation
+ -- abandoned due to previous error" is given. This debug switch
+ -- bypasses this test and gives the "GNAT BUG" message unconditionally
+ -- (useful for debugging). Use -gnatdO in addition to see the previous
+ -- errors.
-- dl Generate unit load trace messages. A line of traceback output is
-- generated each time a request is made to the library manager to
@@ -835,12 +838,12 @@ package body Debug is
-- with -gnatd.A. You might want to apply "sort -nr" to parts of the
-- output.
- -- d.B Generate a bug box when we see an abort_statement, even though
- -- there is no bug. Useful for testing Comperr.Compiler_Abort: write
- -- some code containing an abort_statement, and compile it with
+ -- d.B Generate a "GNAT BUG" message when we see an abort_statement, even
+ -- though there is no bug. Useful for testing Comperr.Compiler_Abort:
+ -- write some code containing an abort_statement, and compile it with
-- -gnatd.B. There is nothing special about abort_statements; it just
- -- provides a way to control where the bug box is generated. See "when
- -- N_Abort_Statement" in package body Expander.
+ -- provides a way to control where the bug box is generated. See the
+ -- "when N_Abort_Statement" in package body Expander.
-- d.C Generate call to System.Concat_n.Str_Concat_n routines in cases
-- where we would normally generate inline concatenation code.
@@ -3104,6 +3104,18 @@ package Einfo is
-- procedure which verifies the invariants of the partial view of a
-- private type or private extension.
+-- Is_Past_Self_Hiding_Point
+-- Defined in all entities. Roughly speaking, this is False if the
+-- declaration of the entity is hidden from all visibility because
+-- we are within its declaration, as defined by 8.3(16-18). When
+-- we reach the end of the declaration or other place defined by
+-- 8.3(16-18), this is set to True. However, this flag is not used
+-- for most overloaded declarations (but is used for enumeration
+-- literals), and is also used for other cases of premature usage
+-- such as defined in 3.8(10) for record components and the like.
+-- In addition, there are cases involving discriminants where we
+-- set this True, then temporarily False again.
+
-- Is_Potentially_Use_Visible
-- Defined in all entities. Set if entity is potentially use visible,
-- i.e. it is defined in a package that appears in a currently active
@@ -4945,6 +4957,7 @@ package Einfo is
-- Is_Obsolescent
-- Is_Package_Body_Entity
-- Is_Packed_Array_Impl_Type
+ -- Is_Past_Self_Hiding_Point
-- Is_Potentially_Use_Visible
-- Is_Preelaborated
-- Is_Primitive_Wrapper
@@ -2057,6 +2057,7 @@ package body Exp_Aggr is
Set_Etype (L_J, Any_Type);
Mutate_Ekind (L_J, E_Variable);
+ Set_Is_Past_Self_Hiding_Point (L_J);
Set_Scope (L_J, Ent);
else
L_J := Make_Temporary (Loc, 'J', L);
@@ -752,6 +752,7 @@ package Gen_IL.Fields is
Is_Package_Body_Entity,
Is_Packed,
Is_Packed_Array_Impl_Type,
+ Is_Past_Self_Hiding_Point,
Is_Param_Block_Component_Type,
Is_Partial_Invariant_Procedure,
Is_Potentially_Use_Visible,
@@ -177,6 +177,7 @@ begin -- Gen_IL.Gen.Gen_Entities
Sm (Is_Package_Body_Entity, Flag),
Sm (Is_Packed, Flag, Impl_Base_Type_Only),
Sm (Is_Packed_Array_Impl_Type, Flag),
+ Sm (Is_Past_Self_Hiding_Point, Flag),
Sm (Is_Potentially_Use_Visible, Flag),
Sm (Is_Preelaborated, Flag),
Sm (Is_Private_Descendant, Flag),
@@ -760,6 +760,29 @@ package body Sem is
Debug_A_Exit ("analyzing ", N, " (done)");
+ -- Set Is_Past_Self_Hiding_Point flag. RM-8.3(16) says a declaration
+ -- is no longer hidden from all visibility after "the end of the
+ -- declaration", so we set the flag here (in addition to setting it
+ -- elsewhere to handle the "except..." cases of 8.3(16)). However,
+ -- we implement 3.8(10) using the same flag, so in that case we
+ -- need to defer the setting until the end of the record.
+
+ declare
+ E : constant Entity_Id := Defining_Entity_Or_Empty (N);
+ begin
+ if Present (E) then
+ if Ekind (E) = E_Void
+ and then Nkind (N) = N_Component_Declaration
+ and then Present (Scope (E))
+ and then Ekind (Scope (E)) = E_Record_Type
+ then
+ null; -- Set it later, in Analyze_Component_Declaration
+ elsif not Is_Past_Self_Hiding_Point (E) then
+ Set_Is_Past_Self_Hiding_Point (E);
+ end if;
+ end if;
+ end;
+
-- Mark relevant use-type and use-package clauses as effective
-- preferring the original node over the analyzed one in the case that
-- constant folding has occurred and removed references that need to be
@@ -1844,6 +1844,7 @@ package body Sem_Aggr is
Set_Etype (Id, Index_Typ);
Mutate_Ekind (Id, E_Variable);
+ Set_Is_Past_Self_Hiding_Point (Id);
Set_Scope (Id, Scop);
end if;
@@ -3132,6 +3133,7 @@ package body Sem_Aggr is
end if;
Mutate_Ekind (Id, E_Variable);
+ Set_Is_Past_Self_Hiding_Point (Id);
Set_Scope (Id, Ent);
Set_Referenced (Id);
@@ -3504,6 +3506,7 @@ package body Sem_Aggr is
if No (Scope (Id)) then
Set_Etype (Id, Index_Type);
Mutate_Ekind (Id, E_Variable);
+ Set_Is_Past_Self_Hiding_Point (Id);
Set_Scope (Id, Ent);
end if;
Enter_Name (Id);
@@ -234,6 +234,7 @@ package body Sem_Ch11 is
Enter_Name (Choice);
Mutate_Ekind (Choice, E_Variable);
+ Set_Is_Past_Self_Hiding_Point (Choice);
if RTE_Available (RE_Exception_Occurrence) then
Set_Etype (Choice, RTE (RE_Exception_Occurrence));
@@ -3186,6 +3186,7 @@ package body Sem_Ch12 is
Renaming_In_Par :=
Make_Defining_Identifier (Loc, Chars (Gen_Unit));
Mutate_Ekind (Renaming_In_Par, E_Package);
+ Set_Is_Past_Self_Hiding_Point (Renaming_In_Par);
Set_Etype (Renaming_In_Par, Standard_Void_Type);
Set_Scope (Renaming_In_Par, Parent_Instance);
Set_Parent (Renaming_In_Par, Parent (Formal));
@@ -3846,6 +3847,7 @@ package body Sem_Ch12 is
Enter_Name (Id);
Mutate_Ekind (Id, E_Generic_Package);
+ Set_Is_Past_Self_Hiding_Point (Id);
Set_Etype (Id, Standard_Void_Type);
-- Set SPARK_Mode from context
@@ -4093,6 +4095,8 @@ package body Sem_Ch12 is
Set_Etype (Id, Standard_Void_Type);
end if;
+ Set_Is_Past_Self_Hiding_Point (Id);
+
-- Analyze the aspects of the generic copy to ensure that all generated
-- pragmas (if any) perform their semantic effects.
@@ -4336,6 +4340,7 @@ package body Sem_Ch12 is
Generate_Definition (Act_Decl_Id);
Mutate_Ekind (Act_Decl_Id, E_Package);
+ Set_Is_Past_Self_Hiding_Point (Act_Decl_Id);
-- Initialize list of incomplete actuals before analysis
@@ -2374,6 +2374,7 @@ package body Sem_Ch5 is
-- iterator name.
Mutate_Ekind (Def_Id, E_Variable);
+ Set_Is_Past_Self_Hiding_Point (Def_Id);
-- Provide a link between the iterator variable and the container, for
-- subsequent use in cross-reference and modification information.
@@ -2652,6 +2653,7 @@ package body Sem_Ch5 is
else
Mutate_Ekind (Def_Id, E_Loop_Parameter);
+ Set_Is_Past_Self_Hiding_Point (Def_Id);
Error_Msg_Ada_2012_Feature ("container iterator", Sloc (N));
-- OF present
@@ -2705,6 +2707,7 @@ package body Sem_Ch5 is
if Has_Aspect (Typ, Aspect_Variable_Indexing) then
Mutate_Ekind (Def_Id, E_Variable);
+ Set_Is_Past_Self_Hiding_Point (Def_Id);
end if;
-- If the container is a constant, iterating over it
@@ -3329,6 +3332,7 @@ package body Sem_Ch5 is
end if;
Mutate_Ekind (Id, E_Loop_Parameter);
+ Set_Is_Past_Self_Hiding_Point (Id);
-- A quantified expression which appears in a pre- or post-condition may
-- be analyzed multiple times. The analysis of the range creates several
@@ -226,6 +226,10 @@ package body Sem_Ch6 is
-- Preanalysis of default expressions of subprogram formals. N is the
-- expression to be analyzed and T is the expected type.
+ procedure Set_Formal_Mode (Formal_Id : Entity_Id);
+ -- Set proper Ekind to reflect formal mode (in, out, in out), and set
+ -- miscellaneous other attributes.
+
procedure Set_Formal_Validity (Formal_Id : Entity_Id);
-- Formal_Id is an formal parameter entity. This procedure deals with
-- setting the proper validity status for this entity, which depends on
@@ -5241,6 +5245,8 @@ package body Sem_Ch6 is
Set_Etype (Designator, Standard_Void_Type);
end if;
+ Set_Is_Past_Self_Hiding_Point (Designator);
+
-- Flag Is_Inlined_Always is True by default, and reversed to False for
-- those subprograms which could be inlined in GNATprove mode (because
-- Body_To_Inline is non-Empty) but should not be inlined.
@@ -13421,6 +13427,8 @@ package body Sem_Ch6 is
Mutate_Ekind (Formal_Id, E_In_Parameter);
end if;
+ Set_Is_Past_Self_Hiding_Point (Formal_Id);
+
-- Set Is_Known_Non_Null for access parameters since the language
-- guarantees that access parameters are always non-null. We also set
-- Can_Never_Be_Null, since there is no way to change the value.
@@ -282,9 +282,6 @@ package Sem_Ch6 is
-- during execution of the subprogram. By setting the actual subtype
-- once, we avoid recomputing it unnecessarily.
- procedure Set_Formal_Mode (Formal_Id : Entity_Id);
- -- Set proper Ekind to reflect formal mode (in, out, in out)
-
function Subtype_Conformant
(New_Id : Entity_Id;
Old_Id : Entity_Id;
@@ -1187,6 +1187,8 @@ package body Sem_Ch7 is
Generate_Definition (Id);
Enter_Name (Id);
Mutate_Ekind (Id, E_Package);
+ Set_Is_Past_Self_Hiding_Point (Id);
+ -- Needed early because of Set_Categorization_From_Pragmas below
Set_Etype (Id, Standard_Void_Type);
-- Set SPARK_Mode from context
@@ -2727,10 +2729,11 @@ package body Sem_Ch7 is
Mutate_Ekind (Id, E_Private_Type);
end if;
- Set_Etype (Id, Id);
+ Set_Is_Past_Self_Hiding_Point (Id);
+ Set_Etype (Id, Id);
Set_Has_Delayed_Freeze (Id);
- Set_Is_First_Subtype (Id);
- Reinit_Size_Align (Id);
+ Set_Is_First_Subtype (Id);
+ Reinit_Size_Align (Id);
Set_Is_Constrained (Id,
No (Discriminant_Specifications (N))
@@ -12202,10 +12202,11 @@ package body Sem_Prag is
-- Null states never come from source
- Set_Comes_From_Source (State_Id, not Is_Null);
- Set_Parent (State_Id, State);
- Mutate_Ekind (State_Id, E_Abstract_State);
- Set_Etype (State_Id, Standard_Void_Type);
+ Set_Comes_From_Source (State_Id, not Is_Null);
+ Set_Parent (State_Id, State);
+ Mutate_Ekind (State_Id, E_Abstract_State);
+ Set_Is_Past_Self_Hiding_Point (State_Id);
+ Set_Etype (State_Id, Standard_Void_Type);
Set_Encapsulating_State (State_Id, Empty);
-- Set the SPARK mode from the current context