annotate gcc/ada/par-ch12.adb @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 ------------------------------------------------------------------------------
kono
parents:
diff changeset
2 -- --
kono
parents:
diff changeset
3 -- GNAT COMPILER COMPONENTS --
kono
parents:
diff changeset
4 -- --
kono
parents:
diff changeset
5 -- P A R . C H 1 2 --
kono
parents:
diff changeset
6 -- --
kono
parents:
diff changeset
7 -- B o d y --
kono
parents:
diff changeset
8 -- --
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
9 -- Copyright (C) 1992-2019, Free Software Foundation, Inc. --
111
kono
parents:
diff changeset
10 -- --
kono
parents:
diff changeset
11 -- GNAT is free software; you can redistribute it and/or modify it under --
kono
parents:
diff changeset
12 -- terms of the GNU General Public License as published by the Free Soft- --
kono
parents:
diff changeset
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
kono
parents:
diff changeset
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
kono
parents:
diff changeset
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
kono
parents:
diff changeset
16 -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
kono
parents:
diff changeset
17 -- for more details. You should have received a copy of the GNU General --
kono
parents:
diff changeset
18 -- Public License distributed with GNAT; see file COPYING3. If not, go to --
kono
parents:
diff changeset
19 -- http://www.gnu.org/licenses for a complete copy of the license. --
kono
parents:
diff changeset
20 -- --
kono
parents:
diff changeset
21 -- GNAT was originally developed by the GNAT team at New York University. --
kono
parents:
diff changeset
22 -- Extensive contributions were provided by Ada Core Technologies Inc. --
kono
parents:
diff changeset
23 -- --
kono
parents:
diff changeset
24 ------------------------------------------------------------------------------
kono
parents:
diff changeset
25
kono
parents:
diff changeset
26 pragma Style_Checks (All_Checks);
kono
parents:
diff changeset
27 -- Turn off subprogram body ordering check. Subprograms are in order
kono
parents:
diff changeset
28 -- by RM section rather than alphabetical
kono
parents:
diff changeset
29
kono
parents:
diff changeset
30 separate (Par)
kono
parents:
diff changeset
31 package body Ch12 is
kono
parents:
diff changeset
32
kono
parents:
diff changeset
33 -- Local functions, used only in this chapter
kono
parents:
diff changeset
34
kono
parents:
diff changeset
35 function P_Formal_Derived_Type_Definition return Node_Id;
kono
parents:
diff changeset
36 function P_Formal_Discrete_Type_Definition return Node_Id;
kono
parents:
diff changeset
37 function P_Formal_Fixed_Point_Definition return Node_Id;
kono
parents:
diff changeset
38 function P_Formal_Floating_Point_Definition return Node_Id;
kono
parents:
diff changeset
39 function P_Formal_Modular_Type_Definition return Node_Id;
kono
parents:
diff changeset
40 function P_Formal_Package_Declaration return Node_Id;
kono
parents:
diff changeset
41 function P_Formal_Private_Type_Definition return Node_Id;
kono
parents:
diff changeset
42 function P_Formal_Signed_Integer_Type_Definition return Node_Id;
kono
parents:
diff changeset
43 function P_Formal_Subprogram_Declaration return Node_Id;
kono
parents:
diff changeset
44 function P_Formal_Type_Declaration return Node_Id;
kono
parents:
diff changeset
45 function P_Formal_Type_Definition return Node_Id;
kono
parents:
diff changeset
46 function P_Generic_Association return Node_Id;
kono
parents:
diff changeset
47
kono
parents:
diff changeset
48 procedure P_Formal_Object_Declarations (Decls : List_Id);
kono
parents:
diff changeset
49 -- Scans one or more formal object declarations and appends them to
kono
parents:
diff changeset
50 -- Decls. Scans more than one declaration only in the case where the
kono
parents:
diff changeset
51 -- source has a declaration with multiple defining identifiers.
kono
parents:
diff changeset
52
kono
parents:
diff changeset
53 --------------------------------
kono
parents:
diff changeset
54 -- 12.1 Generic (also 8.5.5) --
kono
parents:
diff changeset
55 --------------------------------
kono
parents:
diff changeset
56
kono
parents:
diff changeset
57 -- This routine parses either one of the forms of a generic declaration
kono
parents:
diff changeset
58 -- or a generic renaming declaration.
kono
parents:
diff changeset
59
kono
parents:
diff changeset
60 -- GENERIC_DECLARATION ::=
kono
parents:
diff changeset
61 -- GENERIC_SUBPROGRAM_DECLARATION | GENERIC_PACKAGE_DECLARATION
kono
parents:
diff changeset
62
kono
parents:
diff changeset
63 -- GENERIC_SUBPROGRAM_DECLARATION ::=
kono
parents:
diff changeset
64 -- GENERIC_FORMAL_PART SUBPROGRAM_SPECIFICATION
kono
parents:
diff changeset
65 -- [ASPECT_SPECIFICATIONS];
kono
parents:
diff changeset
66
kono
parents:
diff changeset
67 -- GENERIC_PACKAGE_DECLARATION ::=
kono
parents:
diff changeset
68 -- GENERIC_FORMAL_PART PACKAGE_SPECIFICATION
kono
parents:
diff changeset
69 -- [ASPECT_SPECIFICATIONS];
kono
parents:
diff changeset
70
kono
parents:
diff changeset
71 -- GENERIC_FORMAL_PART ::=
kono
parents:
diff changeset
72 -- generic {GENERIC_FORMAL_PARAMETER_DECLARATION | USE_CLAUSE}
kono
parents:
diff changeset
73
kono
parents:
diff changeset
74 -- GENERIC_RENAMING_DECLARATION ::=
kono
parents:
diff changeset
75 -- generic package DEFINING_PROGRAM_UNIT_NAME
kono
parents:
diff changeset
76 -- renames generic_package_NAME
kono
parents:
diff changeset
77 -- [ASPECT_SPECIFICATIONS];
kono
parents:
diff changeset
78 -- | generic procedure DEFINING_PROGRAM_UNIT_NAME
kono
parents:
diff changeset
79 -- renames generic_procedure_NAME
kono
parents:
diff changeset
80 -- [ASPECT_SPECIFICATIONS];
kono
parents:
diff changeset
81 -- | generic function DEFINING_PROGRAM_UNIT_NAME
kono
parents:
diff changeset
82 -- renames generic_function_NAME
kono
parents:
diff changeset
83 -- [ASPECT_SPECIFICATIONS];
kono
parents:
diff changeset
84
kono
parents:
diff changeset
85 -- GENERIC_FORMAL_PARAMETER_DECLARATION ::=
kono
parents:
diff changeset
86 -- FORMAL_OBJECT_DECLARATION
kono
parents:
diff changeset
87 -- | FORMAL_TYPE_DECLARATION
kono
parents:
diff changeset
88 -- | FORMAL_SUBPROGRAM_DECLARATION
kono
parents:
diff changeset
89 -- | FORMAL_PACKAGE_DECLARATION
kono
parents:
diff changeset
90
kono
parents:
diff changeset
91 -- The caller has checked that the initial token is GENERIC
kono
parents:
diff changeset
92
kono
parents:
diff changeset
93 -- Error recovery: can raise Error_Resync
kono
parents:
diff changeset
94
kono
parents:
diff changeset
95 function P_Generic return Node_Id is
kono
parents:
diff changeset
96 Gen_Sloc : constant Source_Ptr := Token_Ptr;
kono
parents:
diff changeset
97 Gen_Decl : Node_Id;
kono
parents:
diff changeset
98 Decl_Node : Node_Id;
kono
parents:
diff changeset
99 Decls : List_Id;
kono
parents:
diff changeset
100 Def_Unit : Node_Id;
kono
parents:
diff changeset
101 Ren_Token : Token_Type;
kono
parents:
diff changeset
102 Scan_State : Saved_Scan_State;
kono
parents:
diff changeset
103
kono
parents:
diff changeset
104 begin
kono
parents:
diff changeset
105 Scan; -- past GENERIC
kono
parents:
diff changeset
106
kono
parents:
diff changeset
107 if Token = Tok_Private then
kono
parents:
diff changeset
108 Error_Msg_SC -- CODEFIX
kono
parents:
diff changeset
109 ("PRIVATE goes before GENERIC, not after");
kono
parents:
diff changeset
110 Scan; -- past junk PRIVATE token
kono
parents:
diff changeset
111 end if;
kono
parents:
diff changeset
112
kono
parents:
diff changeset
113 Save_Scan_State (Scan_State); -- at token past GENERIC
kono
parents:
diff changeset
114
kono
parents:
diff changeset
115 -- Check for generic renaming declaration case
kono
parents:
diff changeset
116
kono
parents:
diff changeset
117 if Token = Tok_Package
kono
parents:
diff changeset
118 or else Token = Tok_Function
kono
parents:
diff changeset
119 or else Token = Tok_Procedure
kono
parents:
diff changeset
120 then
kono
parents:
diff changeset
121 Ren_Token := Token;
kono
parents:
diff changeset
122 Scan; -- scan past PACKAGE, FUNCTION or PROCEDURE
kono
parents:
diff changeset
123
kono
parents:
diff changeset
124 if Token = Tok_Identifier then
kono
parents:
diff changeset
125 Def_Unit := P_Defining_Program_Unit_Name;
kono
parents:
diff changeset
126
kono
parents:
diff changeset
127 Check_Misspelling_Of (Tok_Renames);
kono
parents:
diff changeset
128
kono
parents:
diff changeset
129 if Token = Tok_Renames then
kono
parents:
diff changeset
130 if Ren_Token = Tok_Package then
kono
parents:
diff changeset
131 Decl_Node := New_Node
kono
parents:
diff changeset
132 (N_Generic_Package_Renaming_Declaration, Gen_Sloc);
kono
parents:
diff changeset
133
kono
parents:
diff changeset
134 elsif Ren_Token = Tok_Procedure then
kono
parents:
diff changeset
135 Decl_Node := New_Node
kono
parents:
diff changeset
136 (N_Generic_Procedure_Renaming_Declaration, Gen_Sloc);
kono
parents:
diff changeset
137
kono
parents:
diff changeset
138 else -- Ren_Token = Tok_Function then
kono
parents:
diff changeset
139 Decl_Node := New_Node
kono
parents:
diff changeset
140 (N_Generic_Function_Renaming_Declaration, Gen_Sloc);
kono
parents:
diff changeset
141 end if;
kono
parents:
diff changeset
142
kono
parents:
diff changeset
143 Scan; -- past RENAMES
kono
parents:
diff changeset
144 Set_Defining_Unit_Name (Decl_Node, Def_Unit);
kono
parents:
diff changeset
145 Set_Name (Decl_Node, P_Name);
kono
parents:
diff changeset
146
kono
parents:
diff changeset
147 P_Aspect_Specifications (Decl_Node, Semicolon => False);
kono
parents:
diff changeset
148 TF_Semicolon;
kono
parents:
diff changeset
149 return Decl_Node;
kono
parents:
diff changeset
150 end if;
kono
parents:
diff changeset
151 end if;
kono
parents:
diff changeset
152 end if;
kono
parents:
diff changeset
153
kono
parents:
diff changeset
154 -- Fall through if this is *not* a generic renaming declaration
kono
parents:
diff changeset
155
kono
parents:
diff changeset
156 Restore_Scan_State (Scan_State);
kono
parents:
diff changeset
157 Decls := New_List;
kono
parents:
diff changeset
158
kono
parents:
diff changeset
159 -- Loop through generic parameter declarations and use clauses
kono
parents:
diff changeset
160
kono
parents:
diff changeset
161 Decl_Loop : loop
kono
parents:
diff changeset
162 P_Pragmas_Opt (Decls);
kono
parents:
diff changeset
163
kono
parents:
diff changeset
164 if Token = Tok_Private then
kono
parents:
diff changeset
165 Error_Msg_S ("generic private child packages not permitted");
kono
parents:
diff changeset
166 Scan; -- past PRIVATE
kono
parents:
diff changeset
167 end if;
kono
parents:
diff changeset
168
kono
parents:
diff changeset
169 if Token = Tok_Use then
kono
parents:
diff changeset
170 P_Use_Clause (Decls);
kono
parents:
diff changeset
171
kono
parents:
diff changeset
172 else
kono
parents:
diff changeset
173 -- Parse a generic parameter declaration
kono
parents:
diff changeset
174
kono
parents:
diff changeset
175 if Token = Tok_Identifier then
kono
parents:
diff changeset
176 P_Formal_Object_Declarations (Decls);
kono
parents:
diff changeset
177
kono
parents:
diff changeset
178 elsif Token = Tok_Type then
kono
parents:
diff changeset
179 Append (P_Formal_Type_Declaration, Decls);
kono
parents:
diff changeset
180
kono
parents:
diff changeset
181 elsif Token = Tok_With then
kono
parents:
diff changeset
182 Scan; -- past WITH
kono
parents:
diff changeset
183
kono
parents:
diff changeset
184 if Token = Tok_Package then
kono
parents:
diff changeset
185 Append (P_Formal_Package_Declaration, Decls);
kono
parents:
diff changeset
186
kono
parents:
diff changeset
187 elsif Token = Tok_Procedure or Token = Tok_Function then
kono
parents:
diff changeset
188 Append (P_Formal_Subprogram_Declaration, Decls);
kono
parents:
diff changeset
189
kono
parents:
diff changeset
190 else
kono
parents:
diff changeset
191 Error_Msg_BC -- CODEFIX
kono
parents:
diff changeset
192 ("FUNCTION, PROCEDURE or PACKAGE expected here");
kono
parents:
diff changeset
193 Resync_Past_Semicolon;
kono
parents:
diff changeset
194 end if;
kono
parents:
diff changeset
195
kono
parents:
diff changeset
196 elsif Token = Tok_Subtype then
kono
parents:
diff changeset
197 Error_Msg_SC ("subtype declaration not allowed " &
kono
parents:
diff changeset
198 "as generic parameter declaration!");
kono
parents:
diff changeset
199 Resync_Past_Semicolon;
kono
parents:
diff changeset
200
kono
parents:
diff changeset
201 else
kono
parents:
diff changeset
202 exit Decl_Loop;
kono
parents:
diff changeset
203 end if;
kono
parents:
diff changeset
204 end if;
kono
parents:
diff changeset
205 end loop Decl_Loop;
kono
parents:
diff changeset
206
kono
parents:
diff changeset
207 -- Generic formal part is scanned, scan out subprogram or package spec
kono
parents:
diff changeset
208
kono
parents:
diff changeset
209 if Token = Tok_Package then
kono
parents:
diff changeset
210 Gen_Decl := New_Node (N_Generic_Package_Declaration, Gen_Sloc);
kono
parents:
diff changeset
211 Set_Specification (Gen_Decl, P_Package (Pf_Spcn));
kono
parents:
diff changeset
212
kono
parents:
diff changeset
213 -- Aspects have been parsed by the package spec. Move them to the
kono
parents:
diff changeset
214 -- generic declaration where they belong.
kono
parents:
diff changeset
215
kono
parents:
diff changeset
216 Move_Aspects (Specification (Gen_Decl), Gen_Decl);
kono
parents:
diff changeset
217
kono
parents:
diff changeset
218 else
kono
parents:
diff changeset
219 Gen_Decl := New_Node (N_Generic_Subprogram_Declaration, Gen_Sloc);
kono
parents:
diff changeset
220 Set_Specification (Gen_Decl, P_Subprogram_Specification);
kono
parents:
diff changeset
221
kono
parents:
diff changeset
222 if Nkind (Defining_Unit_Name (Specification (Gen_Decl))) =
kono
parents:
diff changeset
223 N_Defining_Program_Unit_Name
kono
parents:
diff changeset
224 and then Scope.Last > 0
kono
parents:
diff changeset
225 then
kono
parents:
diff changeset
226 Error_Msg_SP ("child unit allowed only at library level");
kono
parents:
diff changeset
227 end if;
kono
parents:
diff changeset
228
kono
parents:
diff changeset
229 P_Aspect_Specifications (Gen_Decl);
kono
parents:
diff changeset
230 end if;
kono
parents:
diff changeset
231
kono
parents:
diff changeset
232 Set_Generic_Formal_Declarations (Gen_Decl, Decls);
kono
parents:
diff changeset
233 return Gen_Decl;
kono
parents:
diff changeset
234 end P_Generic;
kono
parents:
diff changeset
235
kono
parents:
diff changeset
236 -------------------------------
kono
parents:
diff changeset
237 -- 12.1 Generic Declaration --
kono
parents:
diff changeset
238 -------------------------------
kono
parents:
diff changeset
239
kono
parents:
diff changeset
240 -- Parsed by P_Generic (12.1)
kono
parents:
diff changeset
241
kono
parents:
diff changeset
242 ------------------------------------------
kono
parents:
diff changeset
243 -- 12.1 Generic Subprogram Declaration --
kono
parents:
diff changeset
244 ------------------------------------------
kono
parents:
diff changeset
245
kono
parents:
diff changeset
246 -- Parsed by P_Generic (12.1)
kono
parents:
diff changeset
247
kono
parents:
diff changeset
248 ---------------------------------------
kono
parents:
diff changeset
249 -- 12.1 Generic Package Declaration --
kono
parents:
diff changeset
250 ---------------------------------------
kono
parents:
diff changeset
251
kono
parents:
diff changeset
252 -- Parsed by P_Generic (12.1)
kono
parents:
diff changeset
253
kono
parents:
diff changeset
254 -------------------------------
kono
parents:
diff changeset
255 -- 12.1 Generic Formal Part --
kono
parents:
diff changeset
256 -------------------------------
kono
parents:
diff changeset
257
kono
parents:
diff changeset
258 -- Parsed by P_Generic (12.1)
kono
parents:
diff changeset
259
kono
parents:
diff changeset
260 -------------------------------------------------
kono
parents:
diff changeset
261 -- 12.1 Generic Formal Parameter Declaration --
kono
parents:
diff changeset
262 -------------------------------------------------
kono
parents:
diff changeset
263
kono
parents:
diff changeset
264 -- Parsed by P_Generic (12.1)
kono
parents:
diff changeset
265
kono
parents:
diff changeset
266 ---------------------------------
kono
parents:
diff changeset
267 -- 12.3 Generic Instantiation --
kono
parents:
diff changeset
268 ---------------------------------
kono
parents:
diff changeset
269
kono
parents:
diff changeset
270 -- Generic package instantiation parsed by P_Package (7.1)
kono
parents:
diff changeset
271 -- Generic procedure instantiation parsed by P_Subprogram (6.1)
kono
parents:
diff changeset
272 -- Generic function instantiation parsed by P_Subprogram (6.1)
kono
parents:
diff changeset
273
kono
parents:
diff changeset
274 -------------------------------
kono
parents:
diff changeset
275 -- 12.3 Generic Actual Part --
kono
parents:
diff changeset
276 -------------------------------
kono
parents:
diff changeset
277
kono
parents:
diff changeset
278 -- GENERIC_ACTUAL_PART ::=
kono
parents:
diff changeset
279 -- (GENERIC_ASSOCIATION {, GENERIC_ASSOCIATION})
kono
parents:
diff changeset
280
kono
parents:
diff changeset
281 -- Returns a list of generic associations, or Empty if none are present
kono
parents:
diff changeset
282
kono
parents:
diff changeset
283 -- Error recovery: cannot raise Error_Resync
kono
parents:
diff changeset
284
kono
parents:
diff changeset
285 function P_Generic_Actual_Part_Opt return List_Id is
kono
parents:
diff changeset
286 Association_List : List_Id;
kono
parents:
diff changeset
287
kono
parents:
diff changeset
288 begin
kono
parents:
diff changeset
289 -- Figure out if a generic actual part operation is present. Clearly
kono
parents:
diff changeset
290 -- there is no generic actual part if the current token is semicolon
kono
parents:
diff changeset
291 -- or if we have aspect specifications present.
kono
parents:
diff changeset
292
kono
parents:
diff changeset
293 if Token = Tok_Semicolon or else Aspect_Specifications_Present then
kono
parents:
diff changeset
294 return No_List;
kono
parents:
diff changeset
295
kono
parents:
diff changeset
296 -- If we don't have a left paren, then we have an error, and the job
kono
parents:
diff changeset
297 -- is to figure out whether a left paren or semicolon was intended.
kono
parents:
diff changeset
298 -- We assume a missing left paren (and hence a generic actual part
kono
parents:
diff changeset
299 -- present) if the current token is not on a new line, or if it is
kono
parents:
diff changeset
300 -- indented from the subprogram token. Otherwise assume missing
kono
parents:
diff changeset
301 -- semicolon (which will be diagnosed by caller) and no generic part
kono
parents:
diff changeset
302
kono
parents:
diff changeset
303 elsif Token /= Tok_Left_Paren
kono
parents:
diff changeset
304 and then Token_Is_At_Start_Of_Line
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
305 and then Start_Column <= Scopes (Scope.Last).Ecol
111
kono
parents:
diff changeset
306 then
kono
parents:
diff changeset
307 return No_List;
kono
parents:
diff changeset
308
kono
parents:
diff changeset
309 -- Otherwise we have a generic actual part (either a left paren is
kono
parents:
diff changeset
310 -- present, or we have decided that there must be a missing left paren)
kono
parents:
diff changeset
311
kono
parents:
diff changeset
312 else
kono
parents:
diff changeset
313 Association_List := New_List;
kono
parents:
diff changeset
314 T_Left_Paren;
kono
parents:
diff changeset
315
kono
parents:
diff changeset
316 loop
kono
parents:
diff changeset
317 Append (P_Generic_Association, Association_List);
kono
parents:
diff changeset
318 exit when not Comma_Present;
kono
parents:
diff changeset
319 end loop;
kono
parents:
diff changeset
320
kono
parents:
diff changeset
321 T_Right_Paren;
kono
parents:
diff changeset
322 return Association_List;
kono
parents:
diff changeset
323 end if;
kono
parents:
diff changeset
324
kono
parents:
diff changeset
325 end P_Generic_Actual_Part_Opt;
kono
parents:
diff changeset
326
kono
parents:
diff changeset
327 -------------------------------
kono
parents:
diff changeset
328 -- 12.3 Generic Association --
kono
parents:
diff changeset
329 -------------------------------
kono
parents:
diff changeset
330
kono
parents:
diff changeset
331 -- GENERIC_ASSOCIATION ::=
kono
parents:
diff changeset
332 -- [generic_formal_parameter_SELECTOR_NAME =>]
kono
parents:
diff changeset
333 -- EXPLICIT_GENERIC_ACTUAL_PARAMETER
kono
parents:
diff changeset
334
kono
parents:
diff changeset
335 -- EXPLICIT_GENERIC_ACTUAL_PARAMETER ::=
kono
parents:
diff changeset
336 -- EXPRESSION | variable_NAME | subprogram_NAME
kono
parents:
diff changeset
337 -- | entry_NAME | SUBTYPE_MARK | package_instance_NAME
kono
parents:
diff changeset
338
kono
parents:
diff changeset
339 -- Error recovery: cannot raise Error_Resync
kono
parents:
diff changeset
340
kono
parents:
diff changeset
341 function P_Generic_Association return Node_Id is
kono
parents:
diff changeset
342 Scan_State : Saved_Scan_State;
kono
parents:
diff changeset
343 Param_Name_Node : Node_Id;
kono
parents:
diff changeset
344 Generic_Assoc_Node : Node_Id;
kono
parents:
diff changeset
345
kono
parents:
diff changeset
346 begin
kono
parents:
diff changeset
347 Generic_Assoc_Node := New_Node (N_Generic_Association, Token_Ptr);
kono
parents:
diff changeset
348
kono
parents:
diff changeset
349 -- Ada 2005: an association can be given by: others => <>
kono
parents:
diff changeset
350
kono
parents:
diff changeset
351 if Token = Tok_Others then
kono
parents:
diff changeset
352 if Ada_Version < Ada_2005 then
kono
parents:
diff changeset
353 Error_Msg_SP
kono
parents:
diff changeset
354 ("partial parameterization of formal packages"
kono
parents:
diff changeset
355 & " is an Ada 2005 extension");
kono
parents:
diff changeset
356 Error_Msg_SP
kono
parents:
diff changeset
357 ("\unit must be compiled with -gnat05 switch");
kono
parents:
diff changeset
358 end if;
kono
parents:
diff changeset
359
kono
parents:
diff changeset
360 Scan; -- past OTHERS
kono
parents:
diff changeset
361
kono
parents:
diff changeset
362 if Token /= Tok_Arrow then
kono
parents:
diff changeset
363 Error_Msg_BC ("expect arrow after others");
kono
parents:
diff changeset
364 else
kono
parents:
diff changeset
365 Scan; -- past arrow
kono
parents:
diff changeset
366 end if;
kono
parents:
diff changeset
367
kono
parents:
diff changeset
368 if Token /= Tok_Box then
kono
parents:
diff changeset
369 Error_Msg_BC ("expect Box after arrow");
kono
parents:
diff changeset
370 else
kono
parents:
diff changeset
371 Scan; -- past box
kono
parents:
diff changeset
372 end if;
kono
parents:
diff changeset
373
kono
parents:
diff changeset
374 -- Source position of the others choice is beginning of construct
kono
parents:
diff changeset
375
kono
parents:
diff changeset
376 return New_Node (N_Others_Choice, Sloc (Generic_Assoc_Node));
kono
parents:
diff changeset
377 end if;
kono
parents:
diff changeset
378
kono
parents:
diff changeset
379 if Token in Token_Class_Desig then
kono
parents:
diff changeset
380 Param_Name_Node := Token_Node;
kono
parents:
diff changeset
381 Save_Scan_State (Scan_State); -- at designator
kono
parents:
diff changeset
382 Scan; -- past simple name or operator symbol
kono
parents:
diff changeset
383
kono
parents:
diff changeset
384 if Token = Tok_Arrow then
kono
parents:
diff changeset
385 Scan; -- past arrow
kono
parents:
diff changeset
386 Set_Selector_Name (Generic_Assoc_Node, Param_Name_Node);
kono
parents:
diff changeset
387 else
kono
parents:
diff changeset
388 Restore_Scan_State (Scan_State); -- to designator
kono
parents:
diff changeset
389 end if;
kono
parents:
diff changeset
390 end if;
kono
parents:
diff changeset
391
kono
parents:
diff changeset
392 -- In Ada 2005 the actual can be a box
kono
parents:
diff changeset
393
kono
parents:
diff changeset
394 if Token = Tok_Box then
kono
parents:
diff changeset
395 Scan;
kono
parents:
diff changeset
396 Set_Box_Present (Generic_Assoc_Node);
kono
parents:
diff changeset
397 Set_Explicit_Generic_Actual_Parameter (Generic_Assoc_Node, Empty);
kono
parents:
diff changeset
398
kono
parents:
diff changeset
399 else
kono
parents:
diff changeset
400 Set_Explicit_Generic_Actual_Parameter
kono
parents:
diff changeset
401 (Generic_Assoc_Node, P_Expression);
kono
parents:
diff changeset
402 end if;
kono
parents:
diff changeset
403
kono
parents:
diff changeset
404 return Generic_Assoc_Node;
kono
parents:
diff changeset
405 end P_Generic_Association;
kono
parents:
diff changeset
406
kono
parents:
diff changeset
407 ---------------------------------------------
kono
parents:
diff changeset
408 -- 12.3 Explicit Generic Actual Parameter --
kono
parents:
diff changeset
409 ---------------------------------------------
kono
parents:
diff changeset
410
kono
parents:
diff changeset
411 -- Parsed by P_Generic_Association (12.3)
kono
parents:
diff changeset
412
kono
parents:
diff changeset
413 --------------------------------------
kono
parents:
diff changeset
414 -- 12.4 Formal Object Declarations --
kono
parents:
diff changeset
415 --------------------------------------
kono
parents:
diff changeset
416
kono
parents:
diff changeset
417 -- FORMAL_OBJECT_DECLARATION ::=
kono
parents:
diff changeset
418 -- DEFINING_IDENTIFIER_LIST :
kono
parents:
diff changeset
419 -- MODE [NULL_EXCLUSION] SUBTYPE_MARK [:= DEFAULT_EXPRESSION]
kono
parents:
diff changeset
420 -- [ASPECT_SPECIFICATIONS];
kono
parents:
diff changeset
421 -- | DEFINING_IDENTIFIER_LIST :
kono
parents:
diff changeset
422 -- MODE ACCESS_DEFINITION [:= DEFAULT_EXPRESSION];
kono
parents:
diff changeset
423 -- [ASPECT_SPECIFICATIONS];
kono
parents:
diff changeset
424
kono
parents:
diff changeset
425 -- The caller has checked that the initial token is an identifier
kono
parents:
diff changeset
426
kono
parents:
diff changeset
427 -- Error recovery: cannot raise Error_Resync
kono
parents:
diff changeset
428
kono
parents:
diff changeset
429 procedure P_Formal_Object_Declarations (Decls : List_Id) is
kono
parents:
diff changeset
430 Decl_Node : Node_Id;
kono
parents:
diff changeset
431 Ident : Nat;
kono
parents:
diff changeset
432 Not_Null_Present : Boolean := False;
kono
parents:
diff changeset
433 Num_Idents : Nat;
kono
parents:
diff changeset
434 Scan_State : Saved_Scan_State;
kono
parents:
diff changeset
435
kono
parents:
diff changeset
436 Idents : array (Int range 1 .. 4096) of Entity_Id;
kono
parents:
diff changeset
437 -- This array holds the list of defining identifiers. The upper bound
kono
parents:
diff changeset
438 -- of 4096 is intended to be essentially infinite, and we do not even
kono
parents:
diff changeset
439 -- bother to check for it being exceeded.
kono
parents:
diff changeset
440
kono
parents:
diff changeset
441 begin
kono
parents:
diff changeset
442 Idents (1) := P_Defining_Identifier (C_Comma_Colon);
kono
parents:
diff changeset
443 Num_Idents := 1;
kono
parents:
diff changeset
444 while Comma_Present loop
kono
parents:
diff changeset
445 Num_Idents := Num_Idents + 1;
kono
parents:
diff changeset
446 Idents (Num_Idents) := P_Defining_Identifier (C_Comma_Colon);
kono
parents:
diff changeset
447 end loop;
kono
parents:
diff changeset
448
kono
parents:
diff changeset
449 T_Colon;
kono
parents:
diff changeset
450
kono
parents:
diff changeset
451 -- If there are multiple identifiers, we repeatedly scan the
kono
parents:
diff changeset
452 -- type and initialization expression information by resetting
kono
parents:
diff changeset
453 -- the scan pointer (so that we get completely separate trees
kono
parents:
diff changeset
454 -- for each occurrence).
kono
parents:
diff changeset
455
kono
parents:
diff changeset
456 if Num_Idents > 1 then
kono
parents:
diff changeset
457 Save_Scan_State (Scan_State);
kono
parents:
diff changeset
458 end if;
kono
parents:
diff changeset
459
kono
parents:
diff changeset
460 -- Loop through defining identifiers in list
kono
parents:
diff changeset
461
kono
parents:
diff changeset
462 Ident := 1;
kono
parents:
diff changeset
463 Ident_Loop : loop
kono
parents:
diff changeset
464 Decl_Node := New_Node (N_Formal_Object_Declaration, Token_Ptr);
kono
parents:
diff changeset
465 Set_Defining_Identifier (Decl_Node, Idents (Ident));
kono
parents:
diff changeset
466 P_Mode (Decl_Node);
kono
parents:
diff changeset
467
kono
parents:
diff changeset
468 Not_Null_Present := P_Null_Exclusion; -- Ada 2005 (AI-423)
kono
parents:
diff changeset
469
kono
parents:
diff changeset
470 -- Ada 2005 (AI-423): Formal object with an access definition
kono
parents:
diff changeset
471
kono
parents:
diff changeset
472 if Token = Tok_Access then
kono
parents:
diff changeset
473
kono
parents:
diff changeset
474 -- The access definition is still parsed and set even though
kono
parents:
diff changeset
475 -- the compilation may not use the proper switch. This action
kono
parents:
diff changeset
476 -- ensures the required local error recovery.
kono
parents:
diff changeset
477
kono
parents:
diff changeset
478 Set_Access_Definition (Decl_Node,
kono
parents:
diff changeset
479 P_Access_Definition (Not_Null_Present));
kono
parents:
diff changeset
480
kono
parents:
diff changeset
481 if Ada_Version < Ada_2005 then
kono
parents:
diff changeset
482 Error_Msg_SP
kono
parents:
diff changeset
483 ("access definition not allowed in formal object " &
kono
parents:
diff changeset
484 "declaration");
kono
parents:
diff changeset
485 Error_Msg_SP ("\unit must be compiled with -gnat05 switch");
kono
parents:
diff changeset
486 end if;
kono
parents:
diff changeset
487
kono
parents:
diff changeset
488 -- Formal object with a subtype mark
kono
parents:
diff changeset
489
kono
parents:
diff changeset
490 else
kono
parents:
diff changeset
491 Set_Null_Exclusion_Present (Decl_Node, Not_Null_Present);
kono
parents:
diff changeset
492 Set_Subtype_Mark (Decl_Node, P_Subtype_Mark_Resync);
kono
parents:
diff changeset
493 end if;
kono
parents:
diff changeset
494
kono
parents:
diff changeset
495 No_Constraint;
kono
parents:
diff changeset
496 Set_Default_Expression (Decl_Node, Init_Expr_Opt);
kono
parents:
diff changeset
497 P_Aspect_Specifications (Decl_Node);
kono
parents:
diff changeset
498
kono
parents:
diff changeset
499 if Ident > 1 then
kono
parents:
diff changeset
500 Set_Prev_Ids (Decl_Node, True);
kono
parents:
diff changeset
501 end if;
kono
parents:
diff changeset
502
kono
parents:
diff changeset
503 if Ident < Num_Idents then
kono
parents:
diff changeset
504 Set_More_Ids (Decl_Node, True);
kono
parents:
diff changeset
505 end if;
kono
parents:
diff changeset
506
kono
parents:
diff changeset
507 Append (Decl_Node, Decls);
kono
parents:
diff changeset
508
kono
parents:
diff changeset
509 exit Ident_Loop when Ident = Num_Idents;
kono
parents:
diff changeset
510 Ident := Ident + 1;
kono
parents:
diff changeset
511 Restore_Scan_State (Scan_State);
kono
parents:
diff changeset
512 end loop Ident_Loop;
kono
parents:
diff changeset
513 end P_Formal_Object_Declarations;
kono
parents:
diff changeset
514
kono
parents:
diff changeset
515 -----------------------------------
kono
parents:
diff changeset
516 -- 12.5 Formal Type Declaration --
kono
parents:
diff changeset
517 -----------------------------------
kono
parents:
diff changeset
518
kono
parents:
diff changeset
519 -- FORMAL_TYPE_DECLARATION ::=
kono
parents:
diff changeset
520 -- type DEFINING_IDENTIFIER [DISCRIMINANT_PART]
kono
parents:
diff changeset
521 -- is FORMAL_TYPE_DEFINITION
kono
parents:
diff changeset
522 -- [ASPECT_SPECIFICATIONS];
kono
parents:
diff changeset
523
kono
parents:
diff changeset
524 -- The caller has checked that the initial token is TYPE
kono
parents:
diff changeset
525
kono
parents:
diff changeset
526 -- Error recovery: cannot raise Error_Resync
kono
parents:
diff changeset
527
kono
parents:
diff changeset
528 function P_Formal_Type_Declaration return Node_Id is
kono
parents:
diff changeset
529 Decl_Node : Node_Id;
kono
parents:
diff changeset
530 Def_Node : Node_Id;
kono
parents:
diff changeset
531
kono
parents:
diff changeset
532 begin
kono
parents:
diff changeset
533 Decl_Node := New_Node (N_Formal_Type_Declaration, Token_Ptr);
kono
parents:
diff changeset
534 Scan; -- past TYPE
kono
parents:
diff changeset
535 Set_Defining_Identifier (Decl_Node, P_Defining_Identifier);
kono
parents:
diff changeset
536
kono
parents:
diff changeset
537 if P_Unknown_Discriminant_Part_Opt then
kono
parents:
diff changeset
538 Set_Unknown_Discriminants_Present (Decl_Node, True);
kono
parents:
diff changeset
539 else
kono
parents:
diff changeset
540 Set_Discriminant_Specifications
kono
parents:
diff changeset
541 (Decl_Node, P_Known_Discriminant_Part_Opt);
kono
parents:
diff changeset
542 end if;
kono
parents:
diff changeset
543
kono
parents:
diff changeset
544 if Token = Tok_Semicolon then
kono
parents:
diff changeset
545
kono
parents:
diff changeset
546 -- Ada 2012: Incomplete formal type
kono
parents:
diff changeset
547
kono
parents:
diff changeset
548 Scan; -- past semicolon
kono
parents:
diff changeset
549
kono
parents:
diff changeset
550 Error_Msg_Ada_2012_Feature
kono
parents:
diff changeset
551 ("formal incomplete type", Sloc (Decl_Node));
kono
parents:
diff changeset
552
kono
parents:
diff changeset
553 Set_Formal_Type_Definition
kono
parents:
diff changeset
554 (Decl_Node,
kono
parents:
diff changeset
555 New_Node (N_Formal_Incomplete_Type_Definition, Token_Ptr));
kono
parents:
diff changeset
556 return Decl_Node;
kono
parents:
diff changeset
557
kono
parents:
diff changeset
558 else
kono
parents:
diff changeset
559 T_Is;
kono
parents:
diff changeset
560 end if;
kono
parents:
diff changeset
561
kono
parents:
diff changeset
562 Def_Node := P_Formal_Type_Definition;
kono
parents:
diff changeset
563
kono
parents:
diff changeset
564 if Nkind (Def_Node) = N_Formal_Incomplete_Type_Definition then
kono
parents:
diff changeset
565 Error_Msg_Ada_2012_Feature
kono
parents:
diff changeset
566 ("formal incomplete type", Sloc (Decl_Node));
kono
parents:
diff changeset
567 end if;
kono
parents:
diff changeset
568
kono
parents:
diff changeset
569 if Def_Node /= Error then
kono
parents:
diff changeset
570 Set_Formal_Type_Definition (Decl_Node, Def_Node);
kono
parents:
diff changeset
571 P_Aspect_Specifications (Decl_Node);
kono
parents:
diff changeset
572
kono
parents:
diff changeset
573 else
kono
parents:
diff changeset
574 Decl_Node := Error;
kono
parents:
diff changeset
575
kono
parents:
diff changeset
576 -- If we have aspect specifications, skip them
kono
parents:
diff changeset
577
kono
parents:
diff changeset
578 if Aspect_Specifications_Present then
kono
parents:
diff changeset
579 P_Aspect_Specifications (Error);
kono
parents:
diff changeset
580
kono
parents:
diff changeset
581 -- If we have semicolon, skip it to avoid cascaded errors
kono
parents:
diff changeset
582
kono
parents:
diff changeset
583 elsif Token = Tok_Semicolon then
kono
parents:
diff changeset
584 Scan; -- past semicolon
kono
parents:
diff changeset
585 end if;
kono
parents:
diff changeset
586 end if;
kono
parents:
diff changeset
587
kono
parents:
diff changeset
588 return Decl_Node;
kono
parents:
diff changeset
589 end P_Formal_Type_Declaration;
kono
parents:
diff changeset
590
kono
parents:
diff changeset
591 ----------------------------------
kono
parents:
diff changeset
592 -- 12.5 Formal Type Definition --
kono
parents:
diff changeset
593 ----------------------------------
kono
parents:
diff changeset
594
kono
parents:
diff changeset
595 -- FORMAL_TYPE_DEFINITION ::=
kono
parents:
diff changeset
596 -- FORMAL_PRIVATE_TYPE_DEFINITION
kono
parents:
diff changeset
597 -- | FORMAL_INCOMPLETE_TYPE_DEFINITION
kono
parents:
diff changeset
598 -- | FORMAL_DERIVED_TYPE_DEFINITION
kono
parents:
diff changeset
599 -- | FORMAL_DISCRETE_TYPE_DEFINITION
kono
parents:
diff changeset
600 -- | FORMAL_SIGNED_INTEGER_TYPE_DEFINITION
kono
parents:
diff changeset
601 -- | FORMAL_MODULAR_TYPE_DEFINITION
kono
parents:
diff changeset
602 -- | FORMAL_FLOATING_POINT_DEFINITION
kono
parents:
diff changeset
603 -- | FORMAL_ORDINARY_FIXED_POINT_DEFINITION
kono
parents:
diff changeset
604 -- | FORMAL_DECIMAL_FIXED_POINT_DEFINITION
kono
parents:
diff changeset
605 -- | FORMAL_ARRAY_TYPE_DEFINITION
kono
parents:
diff changeset
606 -- | FORMAL_ACCESS_TYPE_DEFINITION
kono
parents:
diff changeset
607 -- | FORMAL_INTERFACE_TYPE_DEFINITION
kono
parents:
diff changeset
608
kono
parents:
diff changeset
609 -- FORMAL_ARRAY_TYPE_DEFINITION ::= ARRAY_TYPE_DEFINITION
kono
parents:
diff changeset
610
kono
parents:
diff changeset
611 -- FORMAL_ACCESS_TYPE_DEFINITION ::= ACCESS_TYPE_DEFINITION
kono
parents:
diff changeset
612
kono
parents:
diff changeset
613 -- FORMAL_INTERFACE_TYPE_DEFINITION ::= INTERFACE_TYPE_DEFINITION
kono
parents:
diff changeset
614
kono
parents:
diff changeset
615 function P_Formal_Type_Definition return Node_Id is
kono
parents:
diff changeset
616 Scan_State : Saved_Scan_State;
kono
parents:
diff changeset
617 Typedef_Node : Node_Id;
kono
parents:
diff changeset
618
kono
parents:
diff changeset
619 begin
kono
parents:
diff changeset
620 if Token_Name = Name_Abstract then
kono
parents:
diff changeset
621 Check_95_Keyword (Tok_Abstract, Tok_Tagged);
kono
parents:
diff changeset
622 end if;
kono
parents:
diff changeset
623
kono
parents:
diff changeset
624 if Token_Name = Name_Tagged then
kono
parents:
diff changeset
625 Check_95_Keyword (Tok_Tagged, Tok_Private);
kono
parents:
diff changeset
626 Check_95_Keyword (Tok_Tagged, Tok_Limited);
kono
parents:
diff changeset
627 end if;
kono
parents:
diff changeset
628
kono
parents:
diff changeset
629 case Token is
kono
parents:
diff changeset
630
kono
parents:
diff changeset
631 -- Mostly we can tell what we have from the initial token. The one
kono
parents:
diff changeset
632 -- exception is ABSTRACT, where we have to scan ahead to see if we
kono
parents:
diff changeset
633 -- have a formal derived type or a formal private type definition.
kono
parents:
diff changeset
634
kono
parents:
diff changeset
635 -- In addition, in Ada 2005 LIMITED may appear after abstract, so
kono
parents:
diff changeset
636 -- that the lookahead must be extended by one more token.
kono
parents:
diff changeset
637
kono
parents:
diff changeset
638 when Tok_Abstract =>
kono
parents:
diff changeset
639 Save_Scan_State (Scan_State);
kono
parents:
diff changeset
640 Scan; -- past ABSTRACT
kono
parents:
diff changeset
641
kono
parents:
diff changeset
642 if Token = Tok_New then
kono
parents:
diff changeset
643 Restore_Scan_State (Scan_State); -- to ABSTRACT
kono
parents:
diff changeset
644 return P_Formal_Derived_Type_Definition;
kono
parents:
diff changeset
645
kono
parents:
diff changeset
646 elsif Token = Tok_Limited then
kono
parents:
diff changeset
647 Scan; -- past LIMITED
kono
parents:
diff changeset
648
kono
parents:
diff changeset
649 if Token = Tok_New then
kono
parents:
diff changeset
650 Restore_Scan_State (Scan_State); -- to ABSTRACT
kono
parents:
diff changeset
651 return P_Formal_Derived_Type_Definition;
kono
parents:
diff changeset
652
kono
parents:
diff changeset
653 else
kono
parents:
diff changeset
654 Restore_Scan_State (Scan_State); -- to ABSTRACT
kono
parents:
diff changeset
655 return P_Formal_Private_Type_Definition;
kono
parents:
diff changeset
656 end if;
kono
parents:
diff changeset
657
kono
parents:
diff changeset
658 -- Ada 2005 (AI-443): Abstract synchronized formal derived type
kono
parents:
diff changeset
659
kono
parents:
diff changeset
660 elsif Token = Tok_Synchronized then
kono
parents:
diff changeset
661 Restore_Scan_State (Scan_State); -- to ABSTRACT
kono
parents:
diff changeset
662 return P_Formal_Derived_Type_Definition;
kono
parents:
diff changeset
663
kono
parents:
diff changeset
664 else
kono
parents:
diff changeset
665 Restore_Scan_State (Scan_State); -- to ABSTRACT
kono
parents:
diff changeset
666 return P_Formal_Private_Type_Definition;
kono
parents:
diff changeset
667 end if;
kono
parents:
diff changeset
668
kono
parents:
diff changeset
669 when Tok_Access =>
kono
parents:
diff changeset
670 return P_Access_Type_Definition;
kono
parents:
diff changeset
671
kono
parents:
diff changeset
672 when Tok_Array =>
kono
parents:
diff changeset
673 return P_Array_Type_Definition;
kono
parents:
diff changeset
674
kono
parents:
diff changeset
675 when Tok_Delta =>
kono
parents:
diff changeset
676 return P_Formal_Fixed_Point_Definition;
kono
parents:
diff changeset
677
kono
parents:
diff changeset
678 when Tok_Digits =>
kono
parents:
diff changeset
679 return P_Formal_Floating_Point_Definition;
kono
parents:
diff changeset
680
kono
parents:
diff changeset
681 when Tok_Interface => -- Ada 2005 (AI-251)
kono
parents:
diff changeset
682 return P_Interface_Type_Definition (Abstract_Present => False);
kono
parents:
diff changeset
683
kono
parents:
diff changeset
684 when Tok_Left_Paren =>
kono
parents:
diff changeset
685 return P_Formal_Discrete_Type_Definition;
kono
parents:
diff changeset
686
kono
parents:
diff changeset
687 when Tok_Limited =>
kono
parents:
diff changeset
688 Save_Scan_State (Scan_State);
kono
parents:
diff changeset
689 Scan; -- past LIMITED
kono
parents:
diff changeset
690
kono
parents:
diff changeset
691 if Token = Tok_Interface then
kono
parents:
diff changeset
692 Typedef_Node :=
kono
parents:
diff changeset
693 P_Interface_Type_Definition (Abstract_Present => False);
kono
parents:
diff changeset
694 Set_Limited_Present (Typedef_Node);
kono
parents:
diff changeset
695 return Typedef_Node;
kono
parents:
diff changeset
696
kono
parents:
diff changeset
697 elsif Token = Tok_New then
kono
parents:
diff changeset
698 Restore_Scan_State (Scan_State); -- to LIMITED
kono
parents:
diff changeset
699 return P_Formal_Derived_Type_Definition;
kono
parents:
diff changeset
700
kono
parents:
diff changeset
701 else
kono
parents:
diff changeset
702 if Token = Tok_Abstract then
kono
parents:
diff changeset
703 Error_Msg_SC -- CODEFIX
kono
parents:
diff changeset
704 ("ABSTRACT must come before LIMITED");
kono
parents:
diff changeset
705 Scan; -- past improper ABSTRACT
kono
parents:
diff changeset
706
kono
parents:
diff changeset
707 if Token = Tok_New then
kono
parents:
diff changeset
708 Restore_Scan_State (Scan_State); -- to LIMITED
kono
parents:
diff changeset
709 return P_Formal_Derived_Type_Definition;
kono
parents:
diff changeset
710
kono
parents:
diff changeset
711 else
kono
parents:
diff changeset
712 Restore_Scan_State (Scan_State);
kono
parents:
diff changeset
713 return P_Formal_Private_Type_Definition;
kono
parents:
diff changeset
714 end if;
kono
parents:
diff changeset
715 end if;
kono
parents:
diff changeset
716
kono
parents:
diff changeset
717 Restore_Scan_State (Scan_State);
kono
parents:
diff changeset
718 return P_Formal_Private_Type_Definition;
kono
parents:
diff changeset
719 end if;
kono
parents:
diff changeset
720
kono
parents:
diff changeset
721 when Tok_Mod =>
kono
parents:
diff changeset
722 return P_Formal_Modular_Type_Definition;
kono
parents:
diff changeset
723
kono
parents:
diff changeset
724 when Tok_New =>
kono
parents:
diff changeset
725 return P_Formal_Derived_Type_Definition;
kono
parents:
diff changeset
726
kono
parents:
diff changeset
727 when Tok_Not =>
kono
parents:
diff changeset
728 if P_Null_Exclusion then
kono
parents:
diff changeset
729 Typedef_Node := P_Access_Type_Definition;
kono
parents:
diff changeset
730 Set_Null_Exclusion_Present (Typedef_Node);
kono
parents:
diff changeset
731 return Typedef_Node;
kono
parents:
diff changeset
732
kono
parents:
diff changeset
733 else
kono
parents:
diff changeset
734 Error_Msg_SC ("expect valid formal access definition!");
kono
parents:
diff changeset
735 Resync_Past_Semicolon;
kono
parents:
diff changeset
736 return Error;
kono
parents:
diff changeset
737 end if;
kono
parents:
diff changeset
738
kono
parents:
diff changeset
739 when Tok_Private =>
kono
parents:
diff changeset
740 return P_Formal_Private_Type_Definition;
kono
parents:
diff changeset
741
kono
parents:
diff changeset
742 when Tok_Tagged =>
kono
parents:
diff changeset
743 if Next_Token_Is (Tok_Semicolon) then
kono
parents:
diff changeset
744 Typedef_Node :=
kono
parents:
diff changeset
745 New_Node (N_Formal_Incomplete_Type_Definition, Token_Ptr);
kono
parents:
diff changeset
746 Set_Tagged_Present (Typedef_Node);
kono
parents:
diff changeset
747
kono
parents:
diff changeset
748 Scan; -- past tagged
kono
parents:
diff changeset
749 return Typedef_Node;
kono
parents:
diff changeset
750
kono
parents:
diff changeset
751 else
kono
parents:
diff changeset
752 return P_Formal_Private_Type_Definition;
kono
parents:
diff changeset
753 end if;
kono
parents:
diff changeset
754
kono
parents:
diff changeset
755 when Tok_Range =>
kono
parents:
diff changeset
756 return P_Formal_Signed_Integer_Type_Definition;
kono
parents:
diff changeset
757
kono
parents:
diff changeset
758 when Tok_Record =>
kono
parents:
diff changeset
759 Error_Msg_SC ("record not allowed in generic type definition!");
kono
parents:
diff changeset
760 Discard_Junk_Node (P_Record_Definition);
kono
parents:
diff changeset
761 return Error;
kono
parents:
diff changeset
762
kono
parents:
diff changeset
763 -- Ada 2005 (AI-345): Task, Protected or Synchronized interface or
kono
parents:
diff changeset
764 -- (AI-443): Synchronized formal derived type declaration.
kono
parents:
diff changeset
765
kono
parents:
diff changeset
766 when Tok_Protected
kono
parents:
diff changeset
767 | Tok_Synchronized
kono
parents:
diff changeset
768 | Tok_Task
kono
parents:
diff changeset
769 =>
kono
parents:
diff changeset
770 declare
kono
parents:
diff changeset
771 Saved_Token : constant Token_Type := Token;
kono
parents:
diff changeset
772
kono
parents:
diff changeset
773 begin
kono
parents:
diff changeset
774 Scan; -- past TASK, PROTECTED or SYNCHRONIZED
kono
parents:
diff changeset
775
kono
parents:
diff changeset
776 -- Synchronized derived type
kono
parents:
diff changeset
777
kono
parents:
diff changeset
778 if Token = Tok_New then
kono
parents:
diff changeset
779 Typedef_Node := P_Formal_Derived_Type_Definition;
kono
parents:
diff changeset
780
kono
parents:
diff changeset
781 if Saved_Token = Tok_Synchronized then
kono
parents:
diff changeset
782 Set_Synchronized_Present (Typedef_Node);
kono
parents:
diff changeset
783 else
kono
parents:
diff changeset
784 Error_Msg_SC ("invalid kind of formal derived type");
kono
parents:
diff changeset
785 end if;
kono
parents:
diff changeset
786
kono
parents:
diff changeset
787 -- Interface
kono
parents:
diff changeset
788
kono
parents:
diff changeset
789 else
kono
parents:
diff changeset
790 Typedef_Node :=
kono
parents:
diff changeset
791 P_Interface_Type_Definition (Abstract_Present => False);
kono
parents:
diff changeset
792
kono
parents:
diff changeset
793 case Saved_Token is
kono
parents:
diff changeset
794 when Tok_Task =>
kono
parents:
diff changeset
795 Set_Task_Present (Typedef_Node);
kono
parents:
diff changeset
796
kono
parents:
diff changeset
797 when Tok_Protected =>
kono
parents:
diff changeset
798 Set_Protected_Present (Typedef_Node);
kono
parents:
diff changeset
799
kono
parents:
diff changeset
800 when Tok_Synchronized =>
kono
parents:
diff changeset
801 Set_Synchronized_Present (Typedef_Node);
kono
parents:
diff changeset
802
kono
parents:
diff changeset
803 when others =>
kono
parents:
diff changeset
804 null;
kono
parents:
diff changeset
805 end case;
kono
parents:
diff changeset
806 end if;
kono
parents:
diff changeset
807
kono
parents:
diff changeset
808 return Typedef_Node;
kono
parents:
diff changeset
809 end;
kono
parents:
diff changeset
810
kono
parents:
diff changeset
811 when others =>
kono
parents:
diff changeset
812 Error_Msg_BC ("expecting generic type definition here");
kono
parents:
diff changeset
813 Resync_Past_Semicolon;
kono
parents:
diff changeset
814 return Error;
kono
parents:
diff changeset
815 end case;
kono
parents:
diff changeset
816 end P_Formal_Type_Definition;
kono
parents:
diff changeset
817
kono
parents:
diff changeset
818 --------------------------------------------
kono
parents:
diff changeset
819 -- 12.5.1 Formal Private Type Definition --
kono
parents:
diff changeset
820 --------------------------------------------
kono
parents:
diff changeset
821
kono
parents:
diff changeset
822 -- FORMAL_PRIVATE_TYPE_DEFINITION ::=
kono
parents:
diff changeset
823 -- [[abstract] tagged] [limited] private
kono
parents:
diff changeset
824
kono
parents:
diff changeset
825 -- The caller has checked the initial token is PRIVATE, ABSTRACT,
kono
parents:
diff changeset
826 -- TAGGED or LIMITED
kono
parents:
diff changeset
827
kono
parents:
diff changeset
828 -- Error recovery: cannot raise Error_Resync
kono
parents:
diff changeset
829
kono
parents:
diff changeset
830 function P_Formal_Private_Type_Definition return Node_Id is
kono
parents:
diff changeset
831 Def_Node : Node_Id;
kono
parents:
diff changeset
832
kono
parents:
diff changeset
833 begin
kono
parents:
diff changeset
834 Def_Node := New_Node (N_Formal_Private_Type_Definition, Token_Ptr);
kono
parents:
diff changeset
835
kono
parents:
diff changeset
836 if Token = Tok_Abstract then
kono
parents:
diff changeset
837 Scan; -- past ABSTRACT
kono
parents:
diff changeset
838
kono
parents:
diff changeset
839 if Token_Name = Name_Tagged then
kono
parents:
diff changeset
840 Check_95_Keyword (Tok_Tagged, Tok_Private);
kono
parents:
diff changeset
841 Check_95_Keyword (Tok_Tagged, Tok_Limited);
kono
parents:
diff changeset
842 end if;
kono
parents:
diff changeset
843
kono
parents:
diff changeset
844 if Token /= Tok_Tagged then
kono
parents:
diff changeset
845 Error_Msg_SP ("ABSTRACT must be followed by TAGGED");
kono
parents:
diff changeset
846 else
kono
parents:
diff changeset
847 Set_Abstract_Present (Def_Node, True);
kono
parents:
diff changeset
848 end if;
kono
parents:
diff changeset
849 end if;
kono
parents:
diff changeset
850
kono
parents:
diff changeset
851 if Token = Tok_Tagged then
kono
parents:
diff changeset
852 Set_Tagged_Present (Def_Node, True);
kono
parents:
diff changeset
853 Scan; -- past TAGGED
kono
parents:
diff changeset
854 end if;
kono
parents:
diff changeset
855
kono
parents:
diff changeset
856 if Token = Tok_Limited then
kono
parents:
diff changeset
857 Set_Limited_Present (Def_Node, True);
kono
parents:
diff changeset
858 Scan; -- past LIMITED
kono
parents:
diff changeset
859 end if;
kono
parents:
diff changeset
860
kono
parents:
diff changeset
861 if Token = Tok_Abstract then
kono
parents:
diff changeset
862 if Prev_Token = Tok_Tagged then
kono
parents:
diff changeset
863 Error_Msg_SC -- CODEFIX
kono
parents:
diff changeset
864 ("ABSTRACT must come before TAGGED");
kono
parents:
diff changeset
865 elsif Prev_Token = Tok_Limited then
kono
parents:
diff changeset
866 Error_Msg_SC -- CODEFIX
kono
parents:
diff changeset
867 ("ABSTRACT must come before LIMITED");
kono
parents:
diff changeset
868 end if;
kono
parents:
diff changeset
869
kono
parents:
diff changeset
870 Resync_Past_Semicolon;
kono
parents:
diff changeset
871
kono
parents:
diff changeset
872 elsif Token = Tok_Tagged then
kono
parents:
diff changeset
873 Error_Msg_SC -- CODEFIX
kono
parents:
diff changeset
874 ("TAGGED must come before LIMITED");
kono
parents:
diff changeset
875 Resync_Past_Semicolon;
kono
parents:
diff changeset
876 end if;
kono
parents:
diff changeset
877
kono
parents:
diff changeset
878 Set_Sloc (Def_Node, Token_Ptr);
kono
parents:
diff changeset
879 T_Private;
kono
parents:
diff changeset
880
kono
parents:
diff changeset
881 if Token = Tok_Tagged then -- CODEFIX
kono
parents:
diff changeset
882 Error_Msg_SC ("TAGGED must come before PRIVATE");
kono
parents:
diff changeset
883 Scan; -- past TAGGED
kono
parents:
diff changeset
884
kono
parents:
diff changeset
885 elsif Token = Tok_Abstract then -- CODEFIX
kono
parents:
diff changeset
886 Error_Msg_SC ("`ABSTRACT TAGGED` must come before PRIVATE");
kono
parents:
diff changeset
887 Scan; -- past ABSTRACT
kono
parents:
diff changeset
888
kono
parents:
diff changeset
889 if Token = Tok_Tagged then
kono
parents:
diff changeset
890 Scan; -- past TAGGED
kono
parents:
diff changeset
891 end if;
kono
parents:
diff changeset
892 end if;
kono
parents:
diff changeset
893
kono
parents:
diff changeset
894 return Def_Node;
kono
parents:
diff changeset
895 end P_Formal_Private_Type_Definition;
kono
parents:
diff changeset
896
kono
parents:
diff changeset
897 --------------------------------------------
kono
parents:
diff changeset
898 -- 12.5.1 Formal Derived Type Definition --
kono
parents:
diff changeset
899 --------------------------------------------
kono
parents:
diff changeset
900
kono
parents:
diff changeset
901 -- FORMAL_DERIVED_TYPE_DEFINITION ::=
kono
parents:
diff changeset
902 -- [abstract] [limited | synchronized]
kono
parents:
diff changeset
903 -- new SUBTYPE_MARK [[and INTERFACE_LIST] with private]
kono
parents:
diff changeset
904
kono
parents:
diff changeset
905 -- The caller has checked the initial token(s) is/are NEW, ABSTRACT NEW,
kono
parents:
diff changeset
906 -- or LIMITED NEW, ABSTRACT LIMITED NEW, SYNCHRONIZED NEW or ABSTRACT
kono
parents:
diff changeset
907 -- SYNCHRONIZED NEW.
kono
parents:
diff changeset
908
kono
parents:
diff changeset
909 -- Error recovery: cannot raise Error_Resync
kono
parents:
diff changeset
910
kono
parents:
diff changeset
911 function P_Formal_Derived_Type_Definition return Node_Id is
kono
parents:
diff changeset
912 Def_Node : Node_Id;
kono
parents:
diff changeset
913
kono
parents:
diff changeset
914 begin
kono
parents:
diff changeset
915 Def_Node := New_Node (N_Formal_Derived_Type_Definition, Token_Ptr);
kono
parents:
diff changeset
916
kono
parents:
diff changeset
917 if Token = Tok_Abstract then
kono
parents:
diff changeset
918 Set_Abstract_Present (Def_Node);
kono
parents:
diff changeset
919 Scan; -- past ABSTRACT
kono
parents:
diff changeset
920 end if;
kono
parents:
diff changeset
921
kono
parents:
diff changeset
922 if Token = Tok_Limited then
kono
parents:
diff changeset
923 Set_Limited_Present (Def_Node);
kono
parents:
diff changeset
924 Scan; -- past LIMITED
kono
parents:
diff changeset
925
kono
parents:
diff changeset
926 if Ada_Version < Ada_2005 then
kono
parents:
diff changeset
927 Error_Msg_SP
kono
parents:
diff changeset
928 ("LIMITED in derived type is an Ada 2005 extension");
kono
parents:
diff changeset
929 Error_Msg_SP
kono
parents:
diff changeset
930 ("\unit must be compiled with -gnat05 switch");
kono
parents:
diff changeset
931 end if;
kono
parents:
diff changeset
932
kono
parents:
diff changeset
933 elsif Token = Tok_Synchronized then
kono
parents:
diff changeset
934 Set_Synchronized_Present (Def_Node);
kono
parents:
diff changeset
935 Scan; -- past SYNCHRONIZED
kono
parents:
diff changeset
936
kono
parents:
diff changeset
937 if Ada_Version < Ada_2005 then
kono
parents:
diff changeset
938 Error_Msg_SP
kono
parents:
diff changeset
939 ("SYNCHRONIZED in derived type is an Ada 2005 extension");
kono
parents:
diff changeset
940 Error_Msg_SP
kono
parents:
diff changeset
941 ("\unit must be compiled with -gnat05 switch");
kono
parents:
diff changeset
942 end if;
kono
parents:
diff changeset
943 end if;
kono
parents:
diff changeset
944
kono
parents:
diff changeset
945 if Token = Tok_Abstract then
kono
parents:
diff changeset
946 Scan; -- past ABSTRACT, diagnosed already in caller.
kono
parents:
diff changeset
947 end if;
kono
parents:
diff changeset
948
kono
parents:
diff changeset
949 Scan; -- past NEW;
kono
parents:
diff changeset
950 Set_Subtype_Mark (Def_Node, P_Subtype_Mark);
kono
parents:
diff changeset
951 No_Constraint;
kono
parents:
diff changeset
952
kono
parents:
diff changeset
953 -- Ada 2005 (AI-251): Deal with interfaces
kono
parents:
diff changeset
954
kono
parents:
diff changeset
955 if Token = Tok_And then
kono
parents:
diff changeset
956 Scan; -- past AND
kono
parents:
diff changeset
957
kono
parents:
diff changeset
958 if Ada_Version < Ada_2005 then
kono
parents:
diff changeset
959 Error_Msg_SP
kono
parents:
diff changeset
960 ("abstract interface is an Ada 2005 extension");
kono
parents:
diff changeset
961 Error_Msg_SP ("\unit must be compiled with -gnat05 switch");
kono
parents:
diff changeset
962 end if;
kono
parents:
diff changeset
963
kono
parents:
diff changeset
964 Set_Interface_List (Def_Node, New_List);
kono
parents:
diff changeset
965
kono
parents:
diff changeset
966 loop
kono
parents:
diff changeset
967 Append (P_Qualified_Simple_Name, Interface_List (Def_Node));
kono
parents:
diff changeset
968 exit when Token /= Tok_And;
kono
parents:
diff changeset
969 Scan; -- past AND
kono
parents:
diff changeset
970 end loop;
kono
parents:
diff changeset
971 end if;
kono
parents:
diff changeset
972
kono
parents:
diff changeset
973 if Token = Tok_With then
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
974
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
975 if Ada_Version >= Ada_2020 and Token /= Tok_Private then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
976 -- Formal type has aspect specifications, parsed later.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
977 return Def_Node;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
978
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
979 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
980 Scan; -- past WITH
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
981 Set_Private_Present (Def_Node, True);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
982 T_Private;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
983 end if;
111
kono
parents:
diff changeset
984
kono
parents:
diff changeset
985 elsif Token = Tok_Tagged then
kono
parents:
diff changeset
986 Scan;
kono
parents:
diff changeset
987
kono
parents:
diff changeset
988 if Token = Tok_Private then
kono
parents:
diff changeset
989 Error_Msg_SC -- CODEFIX
kono
parents:
diff changeset
990 ("TAGGED should be WITH");
kono
parents:
diff changeset
991 Set_Private_Present (Def_Node, True);
kono
parents:
diff changeset
992 T_Private;
kono
parents:
diff changeset
993 else
kono
parents:
diff changeset
994 Ignore (Tok_Tagged);
kono
parents:
diff changeset
995 end if;
kono
parents:
diff changeset
996 end if;
kono
parents:
diff changeset
997
kono
parents:
diff changeset
998 return Def_Node;
kono
parents:
diff changeset
999 end P_Formal_Derived_Type_Definition;
kono
parents:
diff changeset
1000
kono
parents:
diff changeset
1001 ---------------------------------------------
kono
parents:
diff changeset
1002 -- 12.5.2 Formal Discrete Type Definition --
kono
parents:
diff changeset
1003 ---------------------------------------------
kono
parents:
diff changeset
1004
kono
parents:
diff changeset
1005 -- FORMAL_DISCRETE_TYPE_DEFINITION ::= (<>)
kono
parents:
diff changeset
1006
kono
parents:
diff changeset
1007 -- The caller has checked the initial token is left paren
kono
parents:
diff changeset
1008
kono
parents:
diff changeset
1009 -- Error recovery: cannot raise Error_Resync
kono
parents:
diff changeset
1010
kono
parents:
diff changeset
1011 function P_Formal_Discrete_Type_Definition return Node_Id is
kono
parents:
diff changeset
1012 Def_Node : Node_Id;
kono
parents:
diff changeset
1013
kono
parents:
diff changeset
1014 begin
kono
parents:
diff changeset
1015 Def_Node := New_Node (N_Formal_Discrete_Type_Definition, Token_Ptr);
kono
parents:
diff changeset
1016 Scan; -- past left paren
kono
parents:
diff changeset
1017 T_Box;
kono
parents:
diff changeset
1018 T_Right_Paren;
kono
parents:
diff changeset
1019 return Def_Node;
kono
parents:
diff changeset
1020 end P_Formal_Discrete_Type_Definition;
kono
parents:
diff changeset
1021
kono
parents:
diff changeset
1022 ---------------------------------------------------
kono
parents:
diff changeset
1023 -- 12.5.2 Formal Signed Integer Type Definition --
kono
parents:
diff changeset
1024 ---------------------------------------------------
kono
parents:
diff changeset
1025
kono
parents:
diff changeset
1026 -- FORMAL_SIGNED_INTEGER_TYPE_DEFINITION ::= range <>
kono
parents:
diff changeset
1027
kono
parents:
diff changeset
1028 -- The caller has checked the initial token is RANGE
kono
parents:
diff changeset
1029
kono
parents:
diff changeset
1030 -- Error recovery: cannot raise Error_Resync
kono
parents:
diff changeset
1031
kono
parents:
diff changeset
1032 function P_Formal_Signed_Integer_Type_Definition return Node_Id is
kono
parents:
diff changeset
1033 Def_Node : Node_Id;
kono
parents:
diff changeset
1034
kono
parents:
diff changeset
1035 begin
kono
parents:
diff changeset
1036 Def_Node :=
kono
parents:
diff changeset
1037 New_Node (N_Formal_Signed_Integer_Type_Definition, Token_Ptr);
kono
parents:
diff changeset
1038 Scan; -- past RANGE
kono
parents:
diff changeset
1039 T_Box;
kono
parents:
diff changeset
1040 return Def_Node;
kono
parents:
diff changeset
1041 end P_Formal_Signed_Integer_Type_Definition;
kono
parents:
diff changeset
1042
kono
parents:
diff changeset
1043 --------------------------------------------
kono
parents:
diff changeset
1044 -- 12.5.2 Formal Modular Type Definition --
kono
parents:
diff changeset
1045 --------------------------------------------
kono
parents:
diff changeset
1046
kono
parents:
diff changeset
1047 -- FORMAL_MODULAR_TYPE_DEFINITION ::= mod <>
kono
parents:
diff changeset
1048
kono
parents:
diff changeset
1049 -- The caller has checked the initial token is MOD
kono
parents:
diff changeset
1050
kono
parents:
diff changeset
1051 -- Error recovery: cannot raise Error_Resync
kono
parents:
diff changeset
1052
kono
parents:
diff changeset
1053 function P_Formal_Modular_Type_Definition return Node_Id is
kono
parents:
diff changeset
1054 Def_Node : Node_Id;
kono
parents:
diff changeset
1055
kono
parents:
diff changeset
1056 begin
kono
parents:
diff changeset
1057 Def_Node :=
kono
parents:
diff changeset
1058 New_Node (N_Formal_Modular_Type_Definition, Token_Ptr);
kono
parents:
diff changeset
1059 Scan; -- past MOD
kono
parents:
diff changeset
1060 T_Box;
kono
parents:
diff changeset
1061 return Def_Node;
kono
parents:
diff changeset
1062 end P_Formal_Modular_Type_Definition;
kono
parents:
diff changeset
1063
kono
parents:
diff changeset
1064 ----------------------------------------------
kono
parents:
diff changeset
1065 -- 12.5.2 Formal Floating Point Definition --
kono
parents:
diff changeset
1066 ----------------------------------------------
kono
parents:
diff changeset
1067
kono
parents:
diff changeset
1068 -- FORMAL_FLOATING_POINT_DEFINITION ::= digits <>
kono
parents:
diff changeset
1069
kono
parents:
diff changeset
1070 -- The caller has checked the initial token is DIGITS
kono
parents:
diff changeset
1071
kono
parents:
diff changeset
1072 -- Error recovery: cannot raise Error_Resync
kono
parents:
diff changeset
1073
kono
parents:
diff changeset
1074 function P_Formal_Floating_Point_Definition return Node_Id is
kono
parents:
diff changeset
1075 Def_Node : Node_Id;
kono
parents:
diff changeset
1076
kono
parents:
diff changeset
1077 begin
kono
parents:
diff changeset
1078 Def_Node :=
kono
parents:
diff changeset
1079 New_Node (N_Formal_Floating_Point_Definition, Token_Ptr);
kono
parents:
diff changeset
1080 Scan; -- past DIGITS
kono
parents:
diff changeset
1081 T_Box;
kono
parents:
diff changeset
1082 return Def_Node;
kono
parents:
diff changeset
1083 end P_Formal_Floating_Point_Definition;
kono
parents:
diff changeset
1084
kono
parents:
diff changeset
1085 -------------------------------------------
kono
parents:
diff changeset
1086 -- 12.5.2 Formal Fixed Point Definition --
kono
parents:
diff changeset
1087 -------------------------------------------
kono
parents:
diff changeset
1088
kono
parents:
diff changeset
1089 -- This routine parses either a formal ordinary fixed point definition
kono
parents:
diff changeset
1090 -- or a formal decimal fixed point definition:
kono
parents:
diff changeset
1091
kono
parents:
diff changeset
1092 -- FORMAL_ORDINARY_FIXED_POINT_DEFINITION ::= delta <>
kono
parents:
diff changeset
1093
kono
parents:
diff changeset
1094 -- FORMAL_DECIMAL_FIXED_POINT_DEFINITION ::= delta <> digits <>
kono
parents:
diff changeset
1095
kono
parents:
diff changeset
1096 -- The caller has checked the initial token is DELTA
kono
parents:
diff changeset
1097
kono
parents:
diff changeset
1098 -- Error recovery: cannot raise Error_Resync
kono
parents:
diff changeset
1099
kono
parents:
diff changeset
1100 function P_Formal_Fixed_Point_Definition return Node_Id is
kono
parents:
diff changeset
1101 Def_Node : Node_Id;
kono
parents:
diff changeset
1102 Delta_Sloc : Source_Ptr;
kono
parents:
diff changeset
1103
kono
parents:
diff changeset
1104 begin
kono
parents:
diff changeset
1105 Delta_Sloc := Token_Ptr;
kono
parents:
diff changeset
1106 Scan; -- past DELTA
kono
parents:
diff changeset
1107 T_Box;
kono
parents:
diff changeset
1108
kono
parents:
diff changeset
1109 if Token = Tok_Digits then
kono
parents:
diff changeset
1110 Def_Node :=
kono
parents:
diff changeset
1111 New_Node (N_Formal_Decimal_Fixed_Point_Definition, Delta_Sloc);
kono
parents:
diff changeset
1112 Scan; -- past DIGITS
kono
parents:
diff changeset
1113 T_Box;
kono
parents:
diff changeset
1114 else
kono
parents:
diff changeset
1115 Def_Node :=
kono
parents:
diff changeset
1116 New_Node (N_Formal_Ordinary_Fixed_Point_Definition, Delta_Sloc);
kono
parents:
diff changeset
1117 end if;
kono
parents:
diff changeset
1118
kono
parents:
diff changeset
1119 return Def_Node;
kono
parents:
diff changeset
1120 end P_Formal_Fixed_Point_Definition;
kono
parents:
diff changeset
1121
kono
parents:
diff changeset
1122 ----------------------------------------------------
kono
parents:
diff changeset
1123 -- 12.5.2 Formal Ordinary Fixed Point Definition --
kono
parents:
diff changeset
1124 ----------------------------------------------------
kono
parents:
diff changeset
1125
kono
parents:
diff changeset
1126 -- Parsed by P_Formal_Fixed_Point_Definition (12.5.2)
kono
parents:
diff changeset
1127
kono
parents:
diff changeset
1128 ---------------------------------------------------
kono
parents:
diff changeset
1129 -- 12.5.2 Formal Decimal Fixed Point Definition --
kono
parents:
diff changeset
1130 ---------------------------------------------------
kono
parents:
diff changeset
1131
kono
parents:
diff changeset
1132 -- Parsed by P_Formal_Fixed_Point_Definition (12.5.2)
kono
parents:
diff changeset
1133
kono
parents:
diff changeset
1134 ------------------------------------------
kono
parents:
diff changeset
1135 -- 12.5.3 Formal Array Type Definition --
kono
parents:
diff changeset
1136 ------------------------------------------
kono
parents:
diff changeset
1137
kono
parents:
diff changeset
1138 -- Parsed by P_Formal_Type_Definition (12.5)
kono
parents:
diff changeset
1139
kono
parents:
diff changeset
1140 -------------------------------------------
kono
parents:
diff changeset
1141 -- 12.5.4 Formal Access Type Definition --
kono
parents:
diff changeset
1142 -------------------------------------------
kono
parents:
diff changeset
1143
kono
parents:
diff changeset
1144 -- Parsed by P_Formal_Type_Definition (12.5)
kono
parents:
diff changeset
1145
kono
parents:
diff changeset
1146 -----------------------------------------
kono
parents:
diff changeset
1147 -- 12.6 Formal Subprogram Declaration --
kono
parents:
diff changeset
1148 -----------------------------------------
kono
parents:
diff changeset
1149
kono
parents:
diff changeset
1150 -- FORMAL_SUBPROGRAM_DECLARATION ::=
kono
parents:
diff changeset
1151 -- FORMAL_CONCRETE_SUBPROGRAM_DECLARATION
kono
parents:
diff changeset
1152 -- | FORMAL_ABSTRACT_SUBPROGRAM_DECLARATION
kono
parents:
diff changeset
1153
kono
parents:
diff changeset
1154 -- FORMAL_CONCRETE_SUBPROGRAM_DECLARATION ::=
kono
parents:
diff changeset
1155 -- with SUBPROGRAM_SPECIFICATION [is SUBPROGRAM_DEFAULT]
kono
parents:
diff changeset
1156 -- [ASPECT_SPECIFICATIONS];
kono
parents:
diff changeset
1157
kono
parents:
diff changeset
1158 -- FORMAL_ABSTRACT_SUBPROGRAM_DECLARATION ::=
kono
parents:
diff changeset
1159 -- with SUBPROGRAM_SPECIFICATION is abstract [SUBPROGRAM_DEFAULT]
kono
parents:
diff changeset
1160 -- [ASPECT_SPECIFICATIONS];
kono
parents:
diff changeset
1161
kono
parents:
diff changeset
1162 -- SUBPROGRAM_DEFAULT ::= DEFAULT_NAME | <>
kono
parents:
diff changeset
1163
kono
parents:
diff changeset
1164 -- DEFAULT_NAME ::= NAME | null
kono
parents:
diff changeset
1165
kono
parents:
diff changeset
1166 -- The caller has checked that the initial tokens are WITH FUNCTION or
kono
parents:
diff changeset
1167 -- WITH PROCEDURE, and the initial WITH has been scanned out.
kono
parents:
diff changeset
1168
kono
parents:
diff changeset
1169 -- A null default is an Ada 2005 feature
kono
parents:
diff changeset
1170
kono
parents:
diff changeset
1171 -- Error recovery: cannot raise Error_Resync
kono
parents:
diff changeset
1172
kono
parents:
diff changeset
1173 function P_Formal_Subprogram_Declaration return Node_Id is
kono
parents:
diff changeset
1174 Prev_Sloc : constant Source_Ptr := Prev_Token_Ptr;
kono
parents:
diff changeset
1175 Spec_Node : constant Node_Id := P_Subprogram_Specification;
kono
parents:
diff changeset
1176 Def_Node : Node_Id;
kono
parents:
diff changeset
1177
kono
parents:
diff changeset
1178 begin
kono
parents:
diff changeset
1179 if Token = Tok_Is then
kono
parents:
diff changeset
1180 T_Is; -- past IS, skip extra IS or ";"
kono
parents:
diff changeset
1181
kono
parents:
diff changeset
1182 if Token = Tok_Abstract then
kono
parents:
diff changeset
1183 Def_Node :=
kono
parents:
diff changeset
1184 New_Node (N_Formal_Abstract_Subprogram_Declaration, Prev_Sloc);
kono
parents:
diff changeset
1185 Scan; -- past ABSTRACT
kono
parents:
diff changeset
1186
kono
parents:
diff changeset
1187 if Ada_Version < Ada_2005 then
kono
parents:
diff changeset
1188 Error_Msg_SP
kono
parents:
diff changeset
1189 ("formal abstract subprograms are an Ada 2005 extension");
kono
parents:
diff changeset
1190 Error_Msg_SP ("\unit must be compiled with -gnat05 switch");
kono
parents:
diff changeset
1191 end if;
kono
parents:
diff changeset
1192
kono
parents:
diff changeset
1193 else
kono
parents:
diff changeset
1194 Def_Node :=
kono
parents:
diff changeset
1195 New_Node (N_Formal_Concrete_Subprogram_Declaration, Prev_Sloc);
kono
parents:
diff changeset
1196 end if;
kono
parents:
diff changeset
1197
kono
parents:
diff changeset
1198 Set_Specification (Def_Node, Spec_Node);
kono
parents:
diff changeset
1199
kono
parents:
diff changeset
1200 if Token = Tok_Semicolon then
kono
parents:
diff changeset
1201 null;
kono
parents:
diff changeset
1202
kono
parents:
diff changeset
1203 elsif Aspect_Specifications_Present then
kono
parents:
diff changeset
1204 null;
kono
parents:
diff changeset
1205
kono
parents:
diff changeset
1206 elsif Token = Tok_Box then
kono
parents:
diff changeset
1207 Set_Box_Present (Def_Node, True);
kono
parents:
diff changeset
1208 Scan; -- past <>
kono
parents:
diff changeset
1209
kono
parents:
diff changeset
1210 elsif Token = Tok_Null then
kono
parents:
diff changeset
1211 if Ada_Version < Ada_2005 then
kono
parents:
diff changeset
1212 Error_Msg_SP
kono
parents:
diff changeset
1213 ("null default subprograms are an Ada 2005 extension");
kono
parents:
diff changeset
1214 Error_Msg_SP ("\unit must be compiled with -gnat05 switch");
kono
parents:
diff changeset
1215 end if;
kono
parents:
diff changeset
1216
kono
parents:
diff changeset
1217 if Nkind (Spec_Node) = N_Procedure_Specification then
kono
parents:
diff changeset
1218 Set_Null_Present (Spec_Node);
kono
parents:
diff changeset
1219 else
kono
parents:
diff changeset
1220 Error_Msg_SP ("only procedures can be null");
kono
parents:
diff changeset
1221 end if;
kono
parents:
diff changeset
1222
kono
parents:
diff changeset
1223 Scan; -- past NULL
kono
parents:
diff changeset
1224
kono
parents:
diff changeset
1225 else
kono
parents:
diff changeset
1226 Set_Default_Name (Def_Node, P_Name);
kono
parents:
diff changeset
1227 end if;
kono
parents:
diff changeset
1228
kono
parents:
diff changeset
1229 else
kono
parents:
diff changeset
1230 Def_Node :=
kono
parents:
diff changeset
1231 New_Node (N_Formal_Concrete_Subprogram_Declaration, Prev_Sloc);
kono
parents:
diff changeset
1232 Set_Specification (Def_Node, Spec_Node);
kono
parents:
diff changeset
1233 end if;
kono
parents:
diff changeset
1234
kono
parents:
diff changeset
1235 P_Aspect_Specifications (Def_Node);
kono
parents:
diff changeset
1236 return Def_Node;
kono
parents:
diff changeset
1237 end P_Formal_Subprogram_Declaration;
kono
parents:
diff changeset
1238
kono
parents:
diff changeset
1239 ------------------------------
kono
parents:
diff changeset
1240 -- 12.6 Subprogram Default --
kono
parents:
diff changeset
1241 ------------------------------
kono
parents:
diff changeset
1242
kono
parents:
diff changeset
1243 -- Parsed by P_Formal_Procedure_Declaration (12.6)
kono
parents:
diff changeset
1244
kono
parents:
diff changeset
1245 ------------------------
kono
parents:
diff changeset
1246 -- 12.6 Default Name --
kono
parents:
diff changeset
1247 ------------------------
kono
parents:
diff changeset
1248
kono
parents:
diff changeset
1249 -- Parsed by P_Formal_Procedure_Declaration (12.6)
kono
parents:
diff changeset
1250
kono
parents:
diff changeset
1251 --------------------------------------
kono
parents:
diff changeset
1252 -- 12.7 Formal Package Declaration --
kono
parents:
diff changeset
1253 --------------------------------------
kono
parents:
diff changeset
1254
kono
parents:
diff changeset
1255 -- FORMAL_PACKAGE_DECLARATION ::=
kono
parents:
diff changeset
1256 -- with package DEFINING_IDENTIFIER
kono
parents:
diff changeset
1257 -- is new generic_package_NAME FORMAL_PACKAGE_ACTUAL_PART
kono
parents:
diff changeset
1258 -- [ASPECT_SPECIFICATIONS];
kono
parents:
diff changeset
1259
kono
parents:
diff changeset
1260 -- FORMAL_PACKAGE_ACTUAL_PART ::=
kono
parents:
diff changeset
1261 -- ([OTHERS =>] <>) |
kono
parents:
diff changeset
1262 -- [GENERIC_ACTUAL_PART]
kono
parents:
diff changeset
1263 -- (FORMAL_PACKAGE_ASSOCIATION {, FORMAL_PACKAGE_ASSOCIATION}
kono
parents:
diff changeset
1264 -- [, OTHERS => <>)
kono
parents:
diff changeset
1265
kono
parents:
diff changeset
1266 -- FORMAL_PACKAGE_ASSOCIATION ::=
kono
parents:
diff changeset
1267 -- GENERIC_ASSOCIATION
kono
parents:
diff changeset
1268 -- | GENERIC_FORMAL_PARAMETER_SELECTOR_NAME => <>
kono
parents:
diff changeset
1269
kono
parents:
diff changeset
1270 -- The caller has checked that the initial tokens are WITH PACKAGE,
kono
parents:
diff changeset
1271 -- and the initial WITH has been scanned out (so Token = Tok_Package).
kono
parents:
diff changeset
1272
kono
parents:
diff changeset
1273 -- Error recovery: cannot raise Error_Resync
kono
parents:
diff changeset
1274
kono
parents:
diff changeset
1275 function P_Formal_Package_Declaration return Node_Id is
kono
parents:
diff changeset
1276 Def_Node : Node_Id;
kono
parents:
diff changeset
1277 Scan_State : Saved_Scan_State;
kono
parents:
diff changeset
1278
kono
parents:
diff changeset
1279 begin
kono
parents:
diff changeset
1280 Def_Node := New_Node (N_Formal_Package_Declaration, Prev_Token_Ptr);
kono
parents:
diff changeset
1281 Scan; -- past PACKAGE
kono
parents:
diff changeset
1282 Set_Defining_Identifier (Def_Node, P_Defining_Identifier (C_Is));
kono
parents:
diff changeset
1283 T_Is;
kono
parents:
diff changeset
1284 T_New;
kono
parents:
diff changeset
1285 Set_Name (Def_Node, P_Qualified_Simple_Name);
kono
parents:
diff changeset
1286
kono
parents:
diff changeset
1287 if Token = Tok_Left_Paren then
kono
parents:
diff changeset
1288 Save_Scan_State (Scan_State); -- at the left paren
kono
parents:
diff changeset
1289 Scan; -- past the left paren
kono
parents:
diff changeset
1290
kono
parents:
diff changeset
1291 if Token = Tok_Box then
kono
parents:
diff changeset
1292 Set_Box_Present (Def_Node, True);
kono
parents:
diff changeset
1293 Scan; -- past box
kono
parents:
diff changeset
1294 T_Right_Paren;
kono
parents:
diff changeset
1295
kono
parents:
diff changeset
1296 else
kono
parents:
diff changeset
1297 Restore_Scan_State (Scan_State); -- to the left paren
kono
parents:
diff changeset
1298 Set_Generic_Associations (Def_Node, P_Generic_Actual_Part_Opt);
kono
parents:
diff changeset
1299 end if;
kono
parents:
diff changeset
1300 end if;
kono
parents:
diff changeset
1301
kono
parents:
diff changeset
1302 P_Aspect_Specifications (Def_Node);
kono
parents:
diff changeset
1303 return Def_Node;
kono
parents:
diff changeset
1304 end P_Formal_Package_Declaration;
kono
parents:
diff changeset
1305
kono
parents:
diff changeset
1306 --------------------------------------
kono
parents:
diff changeset
1307 -- 12.7 Formal Package Actual Part --
kono
parents:
diff changeset
1308 --------------------------------------
kono
parents:
diff changeset
1309
kono
parents:
diff changeset
1310 -- Parsed by P_Formal_Package_Declaration (12.7)
kono
parents:
diff changeset
1311
kono
parents:
diff changeset
1312 end Ch12;