1 |
706 |
jeremybenn |
------------------------------------------------------------------------------
|
2 |
|
|
-- --
|
3 |
|
|
-- GNAT COMPILER COMPONENTS --
|
4 |
|
|
-- --
|
5 |
|
|
-- S E M _ A U X --
|
6 |
|
|
-- --
|
7 |
|
|
-- S p e c --
|
8 |
|
|
-- --
|
9 |
|
|
-- Copyright (C) 1992-2011, Free Software Foundation, Inc. --
|
10 |
|
|
-- --
|
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. --
|
20 |
|
|
-- --
|
21 |
|
|
-- As a special exception, if other files instantiate generics from this --
|
22 |
|
|
-- unit, or you link this unit with other files to produce an executable, --
|
23 |
|
|
-- this unit does not by itself cause the resulting executable to be --
|
24 |
|
|
-- covered by the GNU General Public License. This exception does not --
|
25 |
|
|
-- however invalidate any other reasons why the executable file might be --
|
26 |
|
|
-- covered by the GNU Public License. --
|
27 |
|
|
-- --
|
28 |
|
|
-- GNAT was originally developed by the GNAT team at New York University. --
|
29 |
|
|
-- Extensive contributions were provided by Ada Core Technologies Inc. --
|
30 |
|
|
-- --
|
31 |
|
|
------------------------------------------------------------------------------
|
32 |
|
|
|
33 |
|
|
-- Package containing utility procedures used throughout the compiler,
|
34 |
|
|
-- and also by ASIS so dependencies are limited to ASIS included packages.
|
35 |
|
|
|
36 |
|
|
-- Historical note. Many of the routines here were originally in Einfo, but
|
37 |
|
|
-- Einfo is supposed to be a relatively low level package dealing with the
|
38 |
|
|
-- content of entities in the tree, so this package is used for routines that
|
39 |
|
|
-- require more than minimal semantic knowledge.
|
40 |
|
|
|
41 |
|
|
with Alloc; use Alloc;
|
42 |
|
|
with Table;
|
43 |
|
|
with Types; use Types;
|
44 |
|
|
|
45 |
|
|
package Sem_Aux is
|
46 |
|
|
|
47 |
|
|
--------------------------------
|
48 |
|
|
-- Obsolescent Warnings Table --
|
49 |
|
|
--------------------------------
|
50 |
|
|
|
51 |
|
|
-- This table records entities for which a pragma Obsolescent with a
|
52 |
|
|
-- message argument has been processed.
|
53 |
|
|
|
54 |
|
|
type OWT_Record is record
|
55 |
|
|
Ent : Entity_Id;
|
56 |
|
|
-- The entity to which the pragma applies
|
57 |
|
|
|
58 |
|
|
Msg : String_Id;
|
59 |
|
|
-- The string containing the message
|
60 |
|
|
end record;
|
61 |
|
|
|
62 |
|
|
package Obsolescent_Warnings is new Table.Table (
|
63 |
|
|
Table_Component_Type => OWT_Record,
|
64 |
|
|
Table_Index_Type => Int,
|
65 |
|
|
Table_Low_Bound => 0,
|
66 |
|
|
Table_Initial => Alloc.Obsolescent_Warnings_Initial,
|
67 |
|
|
Table_Increment => Alloc.Obsolescent_Warnings_Increment,
|
68 |
|
|
Table_Name => "Obsolescent_Warnings");
|
69 |
|
|
|
70 |
|
|
procedure Initialize;
|
71 |
|
|
-- Called at the start of compilation of each new main source file to
|
72 |
|
|
-- initialize the allocation of the Obsolescent_Warnings table. Note that
|
73 |
|
|
-- Initialize must not be called if Tree_Read is used.
|
74 |
|
|
|
75 |
|
|
procedure Tree_Read;
|
76 |
|
|
-- Initializes Obsolescent_Warnings table from current tree file using the
|
77 |
|
|
-- relevant Table.Tree_Read routine.
|
78 |
|
|
|
79 |
|
|
procedure Tree_Write;
|
80 |
|
|
-- Writes out Obsolescent_Warnings table to current tree file using the
|
81 |
|
|
-- relevant Table.Tree_Write routine.
|
82 |
|
|
|
83 |
|
|
-----------------
|
84 |
|
|
-- Subprograms --
|
85 |
|
|
-----------------
|
86 |
|
|
|
87 |
|
|
function Ancestor_Subtype (Typ : Entity_Id) return Entity_Id;
|
88 |
|
|
-- The argument Id is a type or subtype entity. If the argument is a
|
89 |
|
|
-- subtype then it returns the subtype or type from which the subtype was
|
90 |
|
|
-- obtained, otherwise it returns Empty.
|
91 |
|
|
|
92 |
|
|
function Available_View (Typ : Entity_Id) return Entity_Id;
|
93 |
|
|
-- Typ is typically a type that has the With_Type flag set. Returns the
|
94 |
|
|
-- non-limited view of the type, if available, otherwise the type itself.
|
95 |
|
|
-- For class-wide types, there is no direct link in the tree, so we have
|
96 |
|
|
-- to retrieve the class-wide type of the non-limited view of the Etype.
|
97 |
|
|
-- Returns the argument unchanged if it is not one of these cases.
|
98 |
|
|
|
99 |
|
|
function Constant_Value (Ent : Entity_Id) return Node_Id;
|
100 |
|
|
-- Ent is a variable, constant, named integer, or named real entity. This
|
101 |
|
|
-- call obtains the initialization expression for the entity. Will return
|
102 |
|
|
-- Empty for for a deferred constant whose full view is not available or
|
103 |
|
|
-- in some other cases of internal entities, which cannot be treated as
|
104 |
|
|
-- constants from the point of view of constant folding. Empty is also
|
105 |
|
|
-- returned for variables with no initialization expression.
|
106 |
|
|
|
107 |
|
|
function Effectively_Has_Constrained_Partial_View
|
108 |
|
|
(Typ : Entity_Id;
|
109 |
|
|
Scop : Entity_Id) return Boolean;
|
110 |
|
|
-- Return True if Typ has attribute Has_Constrained_Partial_View set to
|
111 |
|
|
-- True; in addition, within a generic body, return True if a subtype is
|
112 |
|
|
-- a descendant of an untagged generic formal private or derived type, and
|
113 |
|
|
-- the subtype is not an unconstrained array subtype (RM 3.3(23.10/3)).
|
114 |
|
|
|
115 |
|
|
function Enclosing_Dynamic_Scope (Ent : Entity_Id) return Entity_Id;
|
116 |
|
|
-- For any entity, Ent, returns the closest dynamic scope in which the
|
117 |
|
|
-- entity is declared or Standard_Standard for library-level entities.
|
118 |
|
|
|
119 |
|
|
function First_Discriminant (Typ : Entity_Id) return Entity_Id;
|
120 |
|
|
-- Typ is a type with discriminants. The discriminants are the first
|
121 |
|
|
-- entities declared in the type, so normally this is equivalent to
|
122 |
|
|
-- First_Entity. The exception arises for tagged types, where the tag
|
123 |
|
|
-- itself is prepended to the front of the entity chain, so the
|
124 |
|
|
-- First_Discriminant function steps past the tag if it is present.
|
125 |
|
|
|
126 |
|
|
function First_Stored_Discriminant (Typ : Entity_Id) return Entity_Id;
|
127 |
|
|
-- Typ is a type with discriminants. Gives the first discriminant stored
|
128 |
|
|
-- in an object of this type. In many cases, these are the same as the
|
129 |
|
|
-- normal visible discriminants for the type, but in the case of renamed
|
130 |
|
|
-- discriminants, this is not always the case.
|
131 |
|
|
--
|
132 |
|
|
-- For tagged types, and untagged types which are root types or derived
|
133 |
|
|
-- types but which do not rename discriminants in their root type, the
|
134 |
|
|
-- stored discriminants are the same as the actual discriminants of the
|
135 |
|
|
-- type, and hence this function is the same as First_Discriminant.
|
136 |
|
|
--
|
137 |
|
|
-- For derived non-tagged types that rename discriminants in the root type
|
138 |
|
|
-- this is the first of the discriminants that occur in the root type. To
|
139 |
|
|
-- be precise, in this case stored discriminants are entities attached to
|
140 |
|
|
-- the entity chain of the derived type which are a copy of the
|
141 |
|
|
-- discriminants of the root type. Furthermore their Is_Completely_Hidden
|
142 |
|
|
-- flag is set since although they are actually stored in the object, they
|
143 |
|
|
-- are not in the set of discriminants that is visible in the type.
|
144 |
|
|
--
|
145 |
|
|
-- For derived untagged types, the set of stored discriminants are the real
|
146 |
|
|
-- discriminants from Gigi's standpoint, i.e. those that will be stored in
|
147 |
|
|
-- actual objects of the type.
|
148 |
|
|
|
149 |
|
|
function First_Subtype (Typ : Entity_Id) return Entity_Id;
|
150 |
|
|
-- Applies to all types and subtypes. For types, yields the first subtype
|
151 |
|
|
-- of the type. For subtypes, yields the first subtype of the base type of
|
152 |
|
|
-- the subtype.
|
153 |
|
|
|
154 |
|
|
function First_Tag_Component (Typ : Entity_Id) return Entity_Id;
|
155 |
|
|
-- Typ must be a tagged record type. This function returns the Entity for
|
156 |
|
|
-- the first _Tag field in the record type.
|
157 |
|
|
|
158 |
|
|
function In_Generic_Body (Id : Entity_Id) return Boolean;
|
159 |
|
|
-- Determine whether entity Id appears inside a generic body
|
160 |
|
|
|
161 |
|
|
function Is_By_Copy_Type (Ent : Entity_Id) return Boolean;
|
162 |
|
|
-- Ent is any entity. Returns True if Ent is a type entity where the type
|
163 |
|
|
-- is required to be passed by copy, as defined in (RM 6.2(3)).
|
164 |
|
|
|
165 |
|
|
function Is_By_Reference_Type (Ent : Entity_Id) return Boolean;
|
166 |
|
|
-- Ent is any entity. Returns True if Ent is a type entity where the type
|
167 |
|
|
-- is required to be passed by reference, as defined in (RM 6.2(4-9)).
|
168 |
|
|
|
169 |
|
|
function Is_Derived_Type (Ent : Entity_Id) return Boolean;
|
170 |
|
|
-- Determines if the given entity Ent is a derived type. Result is always
|
171 |
|
|
-- false if argument is not a type.
|
172 |
|
|
|
173 |
|
|
function Is_Generic_Formal (E : Entity_Id) return Boolean;
|
174 |
|
|
-- Determine whether E is a generic formal parameter. In particular this is
|
175 |
|
|
-- used to set the visibility of generic formals of a generic package
|
176 |
|
|
-- declared with a box or with partial parametrization.
|
177 |
|
|
|
178 |
|
|
function Is_Indefinite_Subtype (Ent : Entity_Id) return Boolean;
|
179 |
|
|
-- Ent is any entity. Determines if given entity is an unconstrained array
|
180 |
|
|
-- type or subtype, a discriminated record type or subtype with no initial
|
181 |
|
|
-- discriminant values or a class wide type or subtype and returns True if
|
182 |
|
|
-- so. False for other type entities, or any entities that are not types.
|
183 |
|
|
|
184 |
|
|
function Is_Immutably_Limited_Type (Ent : Entity_Id) return Boolean;
|
185 |
|
|
-- Ent is any entity. True for a type that is "inherently" limited (i.e.
|
186 |
|
|
-- cannot become nonlimited). From the Ada 2005 RM-7.5(8.1/2), "a type with
|
187 |
|
|
-- a part that is of a task, protected, or explicitly limited record type".
|
188 |
|
|
-- These are the types that are defined as return-by-reference types in Ada
|
189 |
|
|
-- 95 (see RM95-6.5(11-16)). In Ada 2005, these are the types that require
|
190 |
|
|
-- build-in-place for function calls. Note that build-in-place is allowed
|
191 |
|
|
-- for other types, too. This is also used for identifying pure procedures
|
192 |
|
|
-- whose calls should not be eliminated (RM 10.2.1(18/2)).
|
193 |
|
|
|
194 |
|
|
function Is_Limited_Type (Ent : Entity_Id) return Boolean;
|
195 |
|
|
-- Ent is any entity. Returns true if Ent is a limited type (limited
|
196 |
|
|
-- private type, limited interface type, task type, protected type,
|
197 |
|
|
-- composite containing a limited component, or a subtype of any of
|
198 |
|
|
-- these types).
|
199 |
|
|
|
200 |
|
|
function Nearest_Ancestor (Typ : Entity_Id) return Entity_Id;
|
201 |
|
|
-- Given a subtype Typ, this function finds out the nearest ancestor from
|
202 |
|
|
-- which constraints and predicates are inherited. There is no simple link
|
203 |
|
|
-- for doing this, consider:
|
204 |
|
|
--
|
205 |
|
|
-- subtype R is Integer range 1 .. 10;
|
206 |
|
|
-- type T is new R;
|
207 |
|
|
--
|
208 |
|
|
-- In this case the nearest ancestor is R, but the Etype of T'Base will
|
209 |
|
|
-- point to R'Base, so we have to go rummaging in the declarations to get
|
210 |
|
|
-- this information. It is used for making sure we freeze this before we
|
211 |
|
|
-- freeze Typ, and also for retrieving inherited predicate information.
|
212 |
|
|
-- For the case of base types or first subtypes, there is no useful entity
|
213 |
|
|
-- to return, so Empty is returned.
|
214 |
|
|
--
|
215 |
|
|
-- Note: this is similar to Ancestor_Subtype except that it also deals
|
216 |
|
|
-- with the case of derived types.
|
217 |
|
|
|
218 |
|
|
function Nearest_Dynamic_Scope (Ent : Entity_Id) return Entity_Id;
|
219 |
|
|
-- This is similar to Enclosing_Dynamic_Scope except that if Ent is itself
|
220 |
|
|
-- a dynamic scope, then it is returned. Otherwise the result is the same
|
221 |
|
|
-- as that returned by Enclosing_Dynamic_Scope.
|
222 |
|
|
|
223 |
|
|
function Next_Tag_Component (Tag : Entity_Id) return Entity_Id;
|
224 |
|
|
-- Tag must be an entity representing a _Tag field of a tagged record.
|
225 |
|
|
-- The result returned is the next _Tag field in this record, or Empty
|
226 |
|
|
-- if this is the last such field.
|
227 |
|
|
|
228 |
|
|
function Number_Discriminants (Typ : Entity_Id) return Pos;
|
229 |
|
|
-- Typ is a type with discriminants, yields number of discriminants in type
|
230 |
|
|
|
231 |
|
|
function Initialization_Suppressed (Typ : Entity_Id) return Boolean;
|
232 |
|
|
pragma Inline (Initialization_Suppressed);
|
233 |
|
|
-- Returns True if initialization should be suppressed for the given type
|
234 |
|
|
-- or subtype. This is true if Suppress_Initialization is set either for
|
235 |
|
|
-- the subtype itself, or for the corresponding base type.
|
236 |
|
|
|
237 |
|
|
function Ultimate_Alias (Prim : Entity_Id) return Entity_Id;
|
238 |
|
|
pragma Inline (Ultimate_Alias);
|
239 |
|
|
-- Return the last entity in the chain of aliased entities of Prim. If Prim
|
240 |
|
|
-- has no alias return Prim.
|
241 |
|
|
|
242 |
|
|
function Unit_Declaration_Node (Unit_Id : Entity_Id) return Node_Id;
|
243 |
|
|
-- Unit_Id is the simple name of a program unit, this function returns the
|
244 |
|
|
-- corresponding xxx_Declaration node for the entity. Also applies to the
|
245 |
|
|
-- body entities for subprograms, tasks and protected units, in which case
|
246 |
|
|
-- it returns the subprogram, task or protected body node for it. The unit
|
247 |
|
|
-- may be a child unit with any number of ancestors.
|
248 |
|
|
|
249 |
|
|
end Sem_Aux;
|