function Build_Predicate_Function_Declaration
(Typ : Entity_Id) return Node_Id;
-- Build the declaration for a predicate function. The declaration is built
- -- at the end of the declarative part containing the type definition, which
- -- may be before the freeze point of the type. The predicate expression is
- -- preanalyzed at this point, to catch visibility errors.
+ -- at the same time as the body but inserted before, as explained below.
procedure Build_Predicate_Function (Typ : Entity_Id; N : Node_Id);
-- If Typ has predicates (indicated by Has_Predicates being set for Typ),
--------------------------
procedure Add_Block_Identifier
- (N : Node_Id;
- Id : out Entity_Id;
- Scope : Entity_Id := Current_Scope)
+ (N : Node_Id;
+ Id : out Entity_Id;
+ Scope : Entity_Id := Current_Scope)
is
Loc : constant Source_Ptr := Sloc (N);
+
begin
pragma Assert (Nkind (N) = N_Block_Statement);
Id := New_Internal_Entity (E_Block, Scope, Loc, 'B');
Set_Etype (Id, Standard_Void_Type);
Set_Parent (Id, N);
-
Set_Identifier (N, New_Occurrence_Of (Id, Loc));
Set_Block_Node (Id, Identifier (N));
end if;
return S;
end Current_Scope_No_Loops;
+ --------------------------------------
+ -- Current_Scope_No_Loops_No_Blocks --
+ --------------------------------------
+
+ function Current_Scope_No_Loops_No_Blocks return Entity_Id is
+ S : Entity_Id;
+
+ begin
+ -- Examine the scope stack starting from the current scope and skip any
+ -- internally generated loops and blocks.
+
+ S := Current_Scope;
+ while Present (S) and then S /= Standard_Standard loop
+ if Ekind (S) in E_Loop | E_Block
+ and then not Comes_From_Source (S)
+ then
+ S := Scope (S);
+ else
+ exit;
+ end if;
+ end loop;
+
+ return S;
+ end Current_Scope_No_Loops_No_Blocks;
+
------------------------
-- Current_Subprogram --
------------------------
-----------------------
procedure Set_Public_Status (Id : Entity_Id) is
- S : constant Entity_Id := Current_Scope;
+ S : constant Entity_Id := Current_Scope_No_Loops_No_Blocks;
function Within_HSS_Or_If (E : Entity_Id) return Boolean;
-- Determines if E is defined within handled statement sequence or
function Current_Scope return Entity_Id;
-- Get entity representing current scope
+ function Current_Scope_No_Loops return Entity_Id;
+ -- Return the current scope ignoring internally generated loops
+
+ function Current_Scope_No_Loops_No_Blocks return Entity_Id;
+ -- Return the current scope ignoring internally generated loops and blocks
+
procedure Add_Block_Identifier
- (N : Node_Id;
- Id : out Entity_Id;
- Scope : Entity_Id := Current_Scope);
+ (N : Node_Id;
+ Id : out Entity_Id;
+ Scope : Entity_Id := Current_Scope);
-- Given a block statement N, generate an internal E_Block label and make
-- it the identifier of the block. Scope denotes the scope in which the
-- generated entity Id is created and defaults to the current scope. If the
-- block already has an identifier, Id returns the entity of its label.
- function Current_Scope_No_Loops return Entity_Id;
- -- Return the current scope ignoring internally generated loops
-
function Current_Subprogram return Entity_Id;
-- Returns current enclosing subprogram. If Current_Scope is a subprogram,
-- then that is what is returned, otherwise the Enclosing_Subprogram of the