1 ------------------------------------------------------------------------------
3 -- GNAT COMPILER COMPONENTS --
9 -- Copyright (C) 1992-2010, Free Software Foundation, Inc. --
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. --
21 -- GNAT was originally developed by the GNAT team at New York University. --
22 -- Extensive contributions were provided by Ada Core Technologies Inc. --
24 ------------------------------------------------------------------------------
26 with Aspects; use Aspects;
27 with Atree; use Atree;
28 with Checks; use Checks;
29 with Einfo; use Einfo;
30 with Errout; use Errout;
32 with Lib.Xref; use Lib.Xref;
33 with Namet; use Namet;
34 with Nlists; use Nlists;
35 with Nmake; use Nmake;
37 with Restrict; use Restrict;
38 with Rident; use Rident;
39 with Rtsfind; use Rtsfind;
41 with Sem_Ch5; use Sem_Ch5;
42 with Sem_Ch8; use Sem_Ch8;
43 with Sem_Ch13; use Sem_Ch13;
44 with Sem_Res; use Sem_Res;
45 with Sem_Util; use Sem_Util;
46 with Sem_Warn; use Sem_Warn;
47 with Sinfo; use Sinfo;
48 with Stand; use Stand;
49 with Uintp; use Uintp;
51 package body Sem_Ch11 is
53 -----------------------------------
54 -- Analyze_Exception_Declaration --
55 -----------------------------------
57 procedure Analyze_Exception_Declaration (N : Node_Id) is
58 Id : constant Entity_Id := Defining_Identifier (N);
59 PF : constant Boolean := Is_Pure (Current_Scope);
60 AS : constant List_Id := Aspect_Specifications (N);
62 Generate_Definition (Id);
64 Set_Ekind (Id, E_Exception);
65 Set_Exception_Code (Id, Uint_0);
66 Set_Etype (Id, Standard_Exception_Type);
67 Set_Is_Statically_Allocated (Id);
69 Analyze_Aspect_Specifications (N, Id, AS);
70 end Analyze_Exception_Declaration;
72 --------------------------------
73 -- Analyze_Exception_Handlers --
74 --------------------------------
76 procedure Analyze_Exception_Handlers (L : List_Id) is
80 H_Scope : Entity_Id := Empty;
82 procedure Check_Duplication (Id : Node_Id);
83 -- Iterate through the identifiers in each handler to find duplicates
85 function Others_Present return Boolean;
86 -- Returns True if others handler is present
88 -----------------------
89 -- Check_Duplication --
90 -----------------------
92 procedure Check_Duplication (Id : Node_Id) is
95 Id_Entity : Entity_Id := Entity (Id);
98 if Present (Renamed_Entity (Id_Entity)) then
99 Id_Entity := Renamed_Entity (Id_Entity);
102 Handler := First_Non_Pragma (L);
103 while Present (Handler) loop
104 Id1 := First (Exception_Choices (Handler));
105 while Present (Id1) loop
107 -- Only check against the exception choices which precede
108 -- Id in the handler, since the ones that follow Id have not
109 -- been analyzed yet and will be checked in a subsequent call.
114 elsif Nkind (Id1) /= N_Others_Choice
116 (Id_Entity = Entity (Id1)
117 or else (Id_Entity = Renamed_Entity (Entity (Id1))))
119 if Handler /= Parent (Id) then
120 Error_Msg_Sloc := Sloc (Id1);
122 ("exception choice duplicates &#", Id, Id1);
125 if Ada_Version = Ada_83
126 and then Comes_From_Source (Id)
129 ("(Ada 83): duplicate exception choice&", Id);
134 Next_Non_Pragma (Id1);
139 end Check_Duplication;
145 function Others_Present return Boolean is
150 while Present (H) loop
151 if Nkind (H) /= N_Pragma
152 and then Nkind (First (Exception_Choices (H))) = N_Others_Choice
163 -- Start of processing for Analyze_Exception_Handlers
166 Handler := First (L);
167 Check_Restriction (No_Exceptions, Handler);
168 Check_Restriction (No_Exception_Handlers, Handler);
170 -- Kill current remembered values, since we don't know where we were
171 -- when the exception was raised.
175 -- Loop through handlers (which can include pragmas)
177 while Present (Handler) loop
179 -- If pragma just analyze it
181 if Nkind (Handler) = N_Pragma then
184 -- Otherwise we have a real exception handler
187 -- Deal with choice parameter. The exception handler is a
188 -- declarative part for the choice parameter, so it constitutes a
189 -- scope for visibility purposes. We create an entity to denote
190 -- the whole exception part, and use it as the scope of all the
191 -- choices, which may even have the same name without conflict.
192 -- This scope plays no other role in expansion or code generation.
194 Choice := Choice_Parameter (Handler);
196 if Present (Choice) then
197 Set_Local_Raise_Not_OK (Handler);
199 if Comes_From_Source (Choice) then
200 Check_Restriction (No_Exception_Propagation, Choice);
206 (E_Block, Current_Scope, Sloc (Choice), 'E');
209 Push_Scope (H_Scope);
210 Set_Etype (H_Scope, Standard_Void_Type);
212 -- Set the Finalization Chain entity to Error means that it
213 -- should not be used at that level but the parent one should
216 -- ??? this usage needs documenting in Einfo/Exp_Ch7 ???
217 -- ??? using Error for this non-error condition is nasty ???
219 Set_Finalization_Chain_Entity (H_Scope, Error);
222 Set_Ekind (Choice, E_Variable);
224 if RTE_Available (RE_Exception_Occurrence) then
225 Set_Etype (Choice, RTE (RE_Exception_Occurrence));
228 Generate_Definition (Choice);
230 -- Indicate that choice has an initial value, since in effect
231 -- this field is assigned an initial value by the exception.
232 -- We also consider that it is modified in the source.
234 Set_Has_Initial_Value (Choice, True);
235 Set_Never_Set_In_Source (Choice, False);
238 Id := First (Exception_Choices (Handler));
239 while Present (Id) loop
240 if Nkind (Id) = N_Others_Choice then
241 if Present (Next (Id))
242 or else Present (Next (Handler))
243 or else Present (Prev (Id))
245 Error_Msg_N ("OTHERS must appear alone and last", Id);
251 -- In most cases the choice has already been analyzed in
252 -- Analyze_Handled_Statement_Sequence, in order to expand
253 -- local handlers. This advance analysis does not take into
254 -- account the case in which a choice has the same name as
255 -- the choice parameter of the handler, which may hide an
256 -- outer exception. This pathological case appears in ACATS
257 -- B80001_3.adb, and requires an explicit check to verify
258 -- that the id is not hidden.
260 if not Is_Entity_Name (Id)
261 or else Ekind (Entity (Id)) /= E_Exception
263 (Nkind (Id) = N_Identifier
264 and then Chars (Id) = Chars (Choice))
266 Error_Msg_N ("exception name expected", Id);
269 -- Emit a warning at the declaration level when a local
270 -- exception is never raised explicitly.
272 if Warn_On_Redundant_Constructs
273 and then not Is_Raised (Entity (Id))
274 and then Scope (Entity (Id)) = Current_Scope
277 ("?exception & is never raised", Entity (Id), Id);
280 if Present (Renamed_Entity (Entity (Id))) then
281 if Entity (Id) = Standard_Numeric_Error then
282 Check_Restriction (No_Obsolescent_Features, Id);
284 if Warn_On_Obsolescent_Feature then
286 ("Numeric_Error is an " &
287 "obsolescent feature (RM J.6(1))?", Id);
289 ("\use Constraint_Error instead?", Id);
294 Check_Duplication (Id);
296 -- Check for exception declared within generic formal
297 -- package (which is illegal, see RM 11.2(8))
300 Ent : Entity_Id := Entity (Id);
304 if Present (Renamed_Entity (Ent)) then
305 Ent := Renamed_Entity (Ent);
309 while Scop /= Standard_Standard
310 and then Ekind (Scop) = E_Package
312 if Nkind (Declaration_Node (Scop)) =
313 N_Package_Specification
315 Nkind (Original_Node (Parent
316 (Declaration_Node (Scop)))) =
317 N_Formal_Package_Declaration
320 ("exception& is declared in " &
321 "generic formal package", Id, Ent);
323 ("\and therefore cannot appear in " &
324 "handler (RM 11.2(8))", Id);
327 -- If the exception is declared in an inner
328 -- instance, nothing else to check.
330 elsif Is_Generic_Instance (Scop) then
334 Scop := Scope (Scop);
343 -- Check for redundant handler (has only raise statement) and is
344 -- either an others handler, or is a specific handler when no
345 -- others handler is present.
347 if Warn_On_Redundant_Constructs
348 and then List_Length (Statements (Handler)) = 1
349 and then Nkind (First (Statements (Handler))) = N_Raise_Statement
350 and then No (Name (First (Statements (Handler))))
351 and then (not Others_Present
352 or else Nkind (First (Exception_Choices (Handler))) =
356 ("useless handler contains only a reraise statement?",
360 -- Now analyze the statements of this handler
362 Analyze_Statements (Statements (Handler));
364 -- If a choice was present, we created a special scope for it,
365 -- so this is where we pop that special scope to get rid of it.
367 if Present (Choice) then
374 end Analyze_Exception_Handlers;
376 --------------------------------
377 -- Analyze_Handled_Statements --
378 --------------------------------
380 procedure Analyze_Handled_Statements (N : Node_Id) is
381 Handlers : constant List_Id := Exception_Handlers (N);
386 if Present (Handlers) then
390 -- We are now going to analyze the statements and then the exception
391 -- handlers. We certainly need to do things in this order to get the
392 -- proper sequential semantics for various warnings.
394 -- However, there is a glitch. When we process raise statements, an
395 -- optimization is to look for local handlers and specialize the code
398 -- In order to detect if a handler is matching, we must have at least
399 -- analyzed the choices in the proper scope so that proper visibility
400 -- analysis is performed. Hence we analyze just the choices first,
401 -- before we analyze the statement sequence.
403 Handler := First_Non_Pragma (Handlers);
404 while Present (Handler) loop
405 Choice := First_Non_Pragma (Exception_Choices (Handler));
406 while Present (Choice) loop
408 Next_Non_Pragma (Choice);
411 Next_Non_Pragma (Handler);
414 -- Analyze statements in sequence
416 Analyze_Statements (Statements (N));
418 -- If the current scope is a subprogram, then this is the right place to
419 -- check for hanging useless assignments from the statement sequence of
420 -- the subprogram body.
422 if Is_Subprogram (Current_Scope) then
423 Warn_On_Useless_Assignments (Current_Scope);
426 -- Deal with handlers or AT END proc
428 if Present (Handlers) then
429 Analyze_Exception_Handlers (Handlers);
430 elsif Present (At_End_Proc (N)) then
431 Analyze (At_End_Proc (N));
433 end Analyze_Handled_Statements;
435 -----------------------------
436 -- Analyze_Raise_Statement --
437 -----------------------------
439 procedure Analyze_Raise_Statement (N : Node_Id) is
440 Exception_Id : constant Node_Id := Name (N);
441 Exception_Name : Entity_Id := Empty;
445 Check_Unreachable_Code (N);
447 -- Check exception restrictions on the original source
449 if Comes_From_Source (N) then
450 Check_Restriction (No_Exceptions, N);
453 -- Check for useless assignment to OUT or IN OUT scalar immediately
454 -- preceding the raise. Right now we only look at assignment statements,
457 if Is_List_Member (N) then
466 and then Nkind (P) = N_Assignment_Statement
470 if Is_Scalar_Type (Etype (L))
471 and then Is_Entity_Name (L)
472 and then Is_Formal (Entity (L))
475 ("?assignment to pass-by-copy formal may have no effect",
478 ("\?RAISE statement may result in abnormal return" &
479 " (RM 6.4.1(17))", P);
487 if No (Exception_Id) then
489 while not Nkind_In (P, N_Exception_Handler,
498 if Nkind (P) /= N_Exception_Handler then
500 ("reraise statement must appear directly in a handler", N);
502 -- If a handler has a reraise, it cannot be the target of a local
503 -- raise (goto optimization is impossible), and if the no exception
504 -- propagation restriction is set, this is a violation.
507 Set_Local_Raise_Not_OK (P);
509 -- Do not check the restriction if the reraise statement is part
510 -- of the code generated for an AT-END handler. That's because
511 -- if the restriction is actually active, we never generate this
512 -- raise anyway, so the apparent violation is bogus.
514 if not From_At_End (N) then
515 Check_Restriction (No_Exception_Propagation, N);
519 -- Normal case with exception id present
522 Analyze (Exception_Id);
524 if Is_Entity_Name (Exception_Id) then
525 Exception_Name := Entity (Exception_Id);
528 if No (Exception_Name)
529 or else Ekind (Exception_Name) /= E_Exception
532 ("exception name expected in raise statement", Exception_Id);
534 Set_Is_Raised (Exception_Name);
537 -- Deal with RAISE WITH case
539 if Present (Expression (N)) then
540 Check_Compiler_Unit (Expression (N));
541 Analyze_And_Resolve (Expression (N), Standard_String);
545 -- Check obsolescent use of Numeric_Error
547 if Exception_Name = Standard_Numeric_Error then
548 Check_Restriction (No_Obsolescent_Features, Exception_Id);
551 -- Kill last assignment indication
553 Kill_Current_Values (Last_Assignment_Only => True);
554 end Analyze_Raise_Statement;
556 -----------------------------
557 -- Analyze_Raise_xxx_Error --
558 -----------------------------
560 -- Normally, the Etype is already set (when this node is used within
561 -- an expression, since it is copied from the node which it rewrites).
562 -- If this node is used in a statement context, then we set the type
563 -- Standard_Void_Type. This is used both by Gigi and by the front end
564 -- to distinguish the statement use and the subexpression use.
566 -- The only other required processing is to take care of the Condition
567 -- field if one is present.
569 procedure Analyze_Raise_xxx_Error (N : Node_Id) is
571 function Same_Expression (C1, C2 : Node_Id) return Boolean;
572 -- It often occurs that two identical raise statements are generated in
573 -- succession (for example when dynamic elaboration checks take place on
574 -- separate expressions in a call). If the two statements are identical
575 -- according to the simple criterion that follows, the raise is
576 -- converted into a null statement.
578 ---------------------
579 -- Same_Expression --
580 ---------------------
582 function Same_Expression (C1, C2 : Node_Id) return Boolean is
584 if No (C1) and then No (C2) then
587 elsif Is_Entity_Name (C1) and then Is_Entity_Name (C2) then
588 return Entity (C1) = Entity (C2);
590 elsif Nkind (C1) /= Nkind (C2) then
593 elsif Nkind (C1) in N_Unary_Op then
594 return Same_Expression (Right_Opnd (C1), Right_Opnd (C2));
596 elsif Nkind (C1) in N_Binary_Op then
597 return Same_Expression (Left_Opnd (C1), Left_Opnd (C2))
598 and then Same_Expression (Right_Opnd (C1), Right_Opnd (C2));
600 elsif Nkind (C1) = N_Null then
608 -- Start of processing for Analyze_Raise_xxx_Error
611 if No (Etype (N)) then
612 Set_Etype (N, Standard_Void_Type);
615 if Present (Condition (N)) then
616 Analyze_And_Resolve (Condition (N), Standard_Boolean);
619 -- Deal with static cases in obvious manner
621 if Nkind (Condition (N)) = N_Identifier then
622 if Entity (Condition (N)) = Standard_True then
623 Set_Condition (N, Empty);
625 elsif Entity (Condition (N)) = Standard_False then
626 Rewrite (N, Make_Null_Statement (Sloc (N)));
630 -- Remove duplicate raise statements. Note that the previous one may
631 -- already have been removed as well.
633 if not Comes_From_Source (N)
634 and then Nkind (N) /= N_Null_Statement
635 and then Is_List_Member (N)
636 and then Present (Prev (N))
637 and then Nkind (N) = Nkind (Original_Node (Prev (N)))
638 and then Same_Expression
639 (Condition (N), Condition (Original_Node (Prev (N))))
641 Rewrite (N, Make_Null_Statement (Sloc (N)));
643 end Analyze_Raise_xxx_Error;
645 -----------------------------
646 -- Analyze_Subprogram_Info --
647 -----------------------------
649 procedure Analyze_Subprogram_Info (N : Node_Id) is
651 Set_Etype (N, RTE (RE_Code_Loc));
652 end Analyze_Subprogram_Info;