sem_util.ads, [...] (May_Be_Lvalue): A prefix of an attribute reference acts as an lvalue when...
2007-04-20 Hristian Kirtchev <kirtchev@adacore.com> Gary Dismukes <dismukes@adacore.com> Robert Dewar <dewar@adacore.com> Javier Miranda <miranda@adacore.com> * sem_util.ads, sem_util.adb (May_Be_Lvalue): A prefix of an attribute reference acts as an lvalue when the attribute name modifies the prefix (Is_Coextension_Root): New routine. (Mark_Static_Coextensions): New routine. (Type_Access_Level): Revise code for checking the level of the anonymous access type of a return object. (Safe_To_Capture_Value): Not safe to capture if Address_Taken (Matches_Prefixed_View_Profile): Remove the no longer necessary retrieval of the corresponding controlling record type. (Find_Overridden_Synchronized_Primitive): Code cleanup. Add handling of concurrent types declared within a generic as well as class wide types. Emit a mode incompatibility error whenever a protected entry or routine override an interface routine whose first parameter is not of mode "out", "in out" or access to variable. (Overrides_Synchronized_Primitive): Rename to Find_Overridden_Synchronized_Primitive. (Collect_Interface_Components): New subprogram that collects all the components of a tagged record containing tags of secondary dispatch tables. (Add_Global_Declaration): New procedure (Abstract_Interface_List): Handle properly the case of a subtype of a private extension. (Type_Access_Level): In the case of a type whose parent scope is a return statement, call Type_Access_Level recursively on the enclosing function's result type to determine the level of the return object's type. (Build_Elaboration_Entity): Build name of elaboration entity from the scope chain of the entity, rather than the unit name of the file name. (Check_Nested_Access): New procedure. (Has_Up_Level_Access, Set_Has_Up_Level_Access): New procedures. (Find_Direct_Name, Note_Possible_Modification): Use Check_Nested_Access. (Get_Renamed_Entity): Utility routine for performing common operation of chasing the Renamed_Entity field of an entity. From-SVN: r125453
This commit is contained in:
parent
495d6dd6da
commit
f377c995c3
2 changed files with 773 additions and 363 deletions
1069
gcc/ada/sem_util.adb
1069
gcc/ada/sem_util.adb
File diff suppressed because it is too large
Load diff
|
@ -6,7 +6,7 @@
|
|||
-- --
|
||||
-- S p e c --
|
||||
-- --
|
||||
-- Copyright (C) 1992-2006, Free Software Foundation, Inc. --
|
||||
-- Copyright (C) 1992-2007, Free Software Foundation, Inc. --
|
||||
-- --
|
||||
-- GNAT is free software; you can redistribute it and/or modify it under --
|
||||
-- terms of the GNU General Public License as published by the Free Soft- --
|
||||
|
@ -27,6 +27,7 @@
|
|||
-- Package containing utility procedures used throughout the semantics
|
||||
|
||||
with Einfo; use Einfo;
|
||||
with Namet; use Namet;
|
||||
with Types; use Types;
|
||||
with Uintp; use Uintp;
|
||||
with Urealp; use Urealp;
|
||||
|
@ -41,6 +42,14 @@ package Sem_Util is
|
|||
-- Add A to the list of access types to process when expanding the
|
||||
-- freeze node of E.
|
||||
|
||||
procedure Add_Global_Declaration (N : Node_Id);
|
||||
-- These procedures adds a declaration N at the library level, to be
|
||||
-- elaborated before any other code in the unit. It is used for example
|
||||
-- for the entity that marks whether a unit has been elaborated. The
|
||||
-- declaration is added to the Declarations list of the Aux_Decls_Node
|
||||
-- for the current unit. The declarations are added in the current scope,
|
||||
-- so the caller should push a new scope as required before the call.
|
||||
|
||||
function Alignment_In_Bits (E : Entity_Id) return Uint;
|
||||
-- If the alignment of the type or object E is currently known to the
|
||||
-- compiler, then this function returns the alignment value in bits.
|
||||
|
@ -120,6 +129,11 @@ package Sem_Util is
|
|||
-- place error message on node N. Used in object declarations, type
|
||||
-- conversions, qualified expressions.
|
||||
|
||||
procedure Check_Nested_Access (Ent : Entity_Id);
|
||||
-- Check whether Ent denotes an entity declared in an uplevel scope, which
|
||||
-- is accessed inside a nested procedure, and set Has_Up_Level_Access flag
|
||||
-- accordingly. This is currently only enabled for VM_Target /= No_VM.
|
||||
|
||||
procedure Check_Potentially_Blocking_Operation (N : Node_Id);
|
||||
-- N is one of the statement forms that is a potentially blocking
|
||||
-- operation. If it appears within a protected action, emit warning.
|
||||
|
@ -138,6 +152,12 @@ package Sem_Util is
|
|||
-- directly or indirectly implemented by T. Exclude_Parent_Interfaces is
|
||||
-- used to avoid addition of inherited interfaces to the generated list.
|
||||
|
||||
procedure Collect_Interface_Components
|
||||
(Tagged_Type : Entity_Id;
|
||||
Components_List : out Elist_Id);
|
||||
-- Ada 2005 (AI-251): Collect all the tag components associated with the
|
||||
-- secondary dispatch tables of a tagged type.
|
||||
|
||||
function Collect_Primitive_Operations (T : Entity_Id) return Elist_Id;
|
||||
-- Called upon type derivation and extension. We scan the declarative
|
||||
-- part in which the type appears, and collect subprograms that have
|
||||
|
@ -258,6 +278,18 @@ package Sem_Util is
|
|||
-- denotes when analyzed. Subsequent uses of this id on a different
|
||||
-- type denote the discriminant at the same position in this new type.
|
||||
|
||||
function Find_Overridden_Synchronized_Primitive
|
||||
(Def_Id : Entity_Id;
|
||||
First_Hom : Entity_Id;
|
||||
Ifaces_List : Elist_Id;
|
||||
In_Scope : Boolean := True) return Entity_Id;
|
||||
-- Determine whether entry or subprogram Def_Id overrides a primitive
|
||||
-- operation that belongs to one of the interfaces in Ifaces_List. A
|
||||
-- specific homonym chain can be specified by setting First_Hom. Flag
|
||||
-- In_Scope is used to designate whether the entry or subprogram was
|
||||
-- declared inside the scope of the synchronized type or after. Return
|
||||
-- the overridden entity or Empty.
|
||||
|
||||
function First_Actual (Node : Node_Id) return Node_Id;
|
||||
-- Node is an N_Function_Call or N_Procedure_Call_Statement node. The
|
||||
-- result returned is the first actual parameter in declaration order
|
||||
|
@ -371,6 +403,12 @@ package Sem_Util is
|
|||
-- which is the innermost visible entity with the given name. See the
|
||||
-- body of Sem_Ch8 for further details on handling of entity visibility.
|
||||
|
||||
function Get_Renamed_Entity (E : Entity_Id) return Entity_Id;
|
||||
-- Given an entity for an exception, package, subprogram or generic unit,
|
||||
-- returns the ultimately renamed entity if this is a renaming. If this is
|
||||
-- not a renamed entity, returns its argument. It is an error to call this
|
||||
-- with any any other kind of entity.
|
||||
|
||||
function Get_Subprogram_Entity (Nod : Node_Id) return Entity_Id;
|
||||
-- Nod is either a procedure call statement, or a function call, or
|
||||
-- an accept statement node. This procedure finds the Entity_Id of the
|
||||
|
@ -524,6 +562,10 @@ package Sem_Util is
|
|||
-- Determines if the given node denotes an atomic object in the sense
|
||||
-- of the legality checks described in RM C.6(12).
|
||||
|
||||
function Is_Coextension_Root (N : Node_Id) return Boolean;
|
||||
-- Determine whether node N is an allocator which acts as a coextension
|
||||
-- root.
|
||||
|
||||
function Is_Controlling_Limited_Procedure
|
||||
(Proc_Nam : Entity_Id) return Boolean;
|
||||
-- Ada 2005 (AI-345): Determine whether Proc_Nam is a primitive procedure
|
||||
|
@ -657,6 +699,12 @@ package Sem_Util is
|
|||
-- Boolean operand (i.e. is either 0 for False, or 1 for True). This
|
||||
-- function simply tests if it is True (i.e. non-zero)
|
||||
|
||||
function Is_Value_Type (T : Entity_Id) return Boolean;
|
||||
-- Returns true if type T represents a value type. This is only relevant to
|
||||
-- CIL, will always return false for other targets.
|
||||
-- What is a "value type", since this is not an Ada term, it should be
|
||||
-- defined here ???
|
||||
|
||||
function Is_Variable (N : Node_Id) return Boolean;
|
||||
-- Determines if the tree referenced by N represents a variable, i.e.
|
||||
-- can appear on the left side of an assignment. There is one situation,
|
||||
|
@ -705,6 +753,11 @@ package Sem_Util is
|
|||
-- direction. Cases which may possibly be assignments but are not known to
|
||||
-- be may return True from May_Be_Lvalue, but False from this function.
|
||||
|
||||
procedure Mark_Static_Coextensions (Root_Node : Node_Id);
|
||||
-- Perform a tree traversal starting from Root_Node while marking every
|
||||
-- allocator as a static coextension. Cleanup for this action is performed
|
||||
-- in Resolve_Allocator.
|
||||
|
||||
function May_Be_Lvalue (N : Node_Id) return Boolean;
|
||||
-- Determines if N could be an lvalue (e.g. an assignment left hand side).
|
||||
-- An lvalue is defined as any expression which appears in a context where
|
||||
|
@ -783,18 +836,6 @@ package Sem_Util is
|
|||
-- For convenience, qualified expressions applied to object names
|
||||
-- are also allowed as actuals for this function.
|
||||
|
||||
function Overrides_Synchronized_Primitive
|
||||
(Def_Id : Entity_Id;
|
||||
First_Hom : Entity_Id;
|
||||
Ifaces_List : Elist_Id;
|
||||
In_Scope : Boolean := True) return Entity_Id;
|
||||
-- Determine whether entry or subprogram Def_Id overrides a primitive
|
||||
-- operation that belongs to one of the interfaces in Ifaces_List. A
|
||||
-- specific homonym chain can be specified by setting First_Hom. Flag
|
||||
-- In_Scope is used to designate whether the entry or subprogram was
|
||||
-- declared inside the scope of the synchronized type or after. Return
|
||||
-- the overriden entity or Empty.
|
||||
|
||||
function Private_Component (Type_Id : Entity_Id) return Entity_Id;
|
||||
-- Returns some private component (if any) of the given Type_Id.
|
||||
-- Used to enforce the rules on visibility of operations on composite
|
||||
|
|
Loading…
Add table
Reference in a new issue