1 ------------------------------------------------------------------------------
3 -- GNAT COMPILER COMPONENTS --
9 -- Copyright (C) 1992-2015, 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 Atree
; use Atree
;
27 with Checks
; use Checks
;
28 with Einfo
; use Einfo
;
29 with Errout
; use Errout
;
30 with Ghost
; use Ghost
;
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_Aux
; use Sem_Aux
;
42 with Sem_Ch5
; use Sem_Ch5
;
43 with Sem_Ch8
; use Sem_Ch8
;
44 with Sem_Ch13
; use Sem_Ch13
;
45 with Sem_Res
; use Sem_Res
;
46 with Sem_Util
; use Sem_Util
;
47 with Sem_Warn
; use Sem_Warn
;
48 with Sinfo
; use Sinfo
;
49 with Snames
; use Snames
;
50 with Stand
; use Stand
;
52 package body Sem_Ch11
is
54 -----------------------------------
55 -- Analyze_Exception_Declaration --
56 -----------------------------------
58 procedure Analyze_Exception_Declaration
(N
: Node_Id
) is
59 Id
: constant Entity_Id
:= Defining_Identifier
(N
);
60 PF
: constant Boolean := Is_Pure
(Current_Scope
);
63 Generate_Definition
(Id
);
65 Set_Ekind
(Id
, E_Exception
);
66 Set_Etype
(Id
, Standard_Exception_Type
);
67 Set_Is_Statically_Allocated
(Id
);
70 -- An exception declared within a Ghost region is automatically Ghost
73 if Ghost_Mode
> None
then
74 Set_Is_Ghost_Entity
(Id
);
77 if Has_Aspects
(N
) then
78 Analyze_Aspect_Specifications
(N
, Id
);
80 end Analyze_Exception_Declaration
;
82 --------------------------------
83 -- Analyze_Exception_Handlers --
84 --------------------------------
86 procedure Analyze_Exception_Handlers
(L
: List_Id
) is
90 H_Scope
: Entity_Id
:= Empty
;
92 procedure Check_Duplication
(Id
: Node_Id
);
93 -- Iterate through the identifiers in each handler to find duplicates
95 function Others_Present
return Boolean;
96 -- Returns True if others handler is present
98 -----------------------
99 -- Check_Duplication --
100 -----------------------
102 procedure Check_Duplication
(Id
: Node_Id
) is
105 Id_Entity
: Entity_Id
:= Entity
(Id
);
108 if Present
(Renamed_Entity
(Id_Entity
)) then
109 Id_Entity
:= Renamed_Entity
(Id_Entity
);
112 Handler
:= First_Non_Pragma
(L
);
113 while Present
(Handler
) loop
114 Id1
:= First
(Exception_Choices
(Handler
));
115 while Present
(Id1
) loop
117 -- Only check against the exception choices which precede
118 -- Id in the handler, since the ones that follow Id have not
119 -- been analyzed yet and will be checked in a subsequent call.
124 elsif Nkind
(Id1
) /= N_Others_Choice
126 (Id_Entity
= Entity
(Id1
)
127 or else (Id_Entity
= Renamed_Entity
(Entity
(Id1
))))
129 if Handler
/= Parent
(Id
) then
130 Error_Msg_Sloc
:= Sloc
(Id1
);
131 Error_Msg_NE
("exception choice duplicates &#", Id
, Id1
);
134 if Ada_Version
= Ada_83
135 and then Comes_From_Source
(Id
)
138 ("(Ada 83): duplicate exception choice&", Id
);
143 Next_Non_Pragma
(Id1
);
148 end Check_Duplication
;
154 function Others_Present
return Boolean is
159 while Present
(H
) loop
160 if Nkind
(H
) /= N_Pragma
161 and then Nkind
(First
(Exception_Choices
(H
))) = N_Others_Choice
172 -- Start of processing for Analyze_Exception_Handlers
175 Handler
:= First
(L
);
176 Check_Restriction
(No_Exceptions
, Handler
);
177 Check_Restriction
(No_Exception_Handlers
, Handler
);
179 -- Kill current remembered values, since we don't know where we were
180 -- when the exception was raised.
184 -- Loop through handlers (which can include pragmas)
186 while Present
(Handler
) loop
188 -- If pragma just analyze it
190 if Nkind
(Handler
) = N_Pragma
then
193 -- Otherwise we have a real exception handler
196 -- Deal with choice parameter. The exception handler is a
197 -- declarative part for the choice parameter, so it constitutes a
198 -- scope for visibility purposes. We create an entity to denote
199 -- the whole exception part, and use it as the scope of all the
200 -- choices, which may even have the same name without conflict.
201 -- This scope plays no other role in expansion or code generation.
203 Choice
:= Choice_Parameter
(Handler
);
205 if Present
(Choice
) then
206 Set_Local_Raise_Not_OK
(Handler
);
208 if Comes_From_Source
(Choice
) then
209 Check_Restriction
(No_Exception_Propagation
, Choice
);
210 Set_Debug_Info_Needed
(Choice
);
216 (E_Block
, Current_Scope
, Sloc
(Choice
), 'E');
219 Push_Scope
(H_Scope
);
220 Set_Etype
(H_Scope
, Standard_Void_Type
);
223 Set_Ekind
(Choice
, E_Variable
);
225 if RTE_Available
(RE_Exception_Occurrence
) then
226 Set_Etype
(Choice
, RTE
(RE_Exception_Occurrence
));
229 Generate_Definition
(Choice
);
231 -- Indicate that choice has an initial value, since in effect
232 -- this field is assigned an initial value by the exception.
233 -- We also consider that it is modified in the source.
235 Set_Has_Initial_Value
(Choice
, True);
236 Set_Never_Set_In_Source
(Choice
, False);
239 Id
:= First
(Exception_Choices
(Handler
));
240 while Present
(Id
) loop
241 if Nkind
(Id
) = N_Others_Choice
then
242 if Present
(Next
(Id
))
243 or else Present
(Next
(Handler
))
244 or else Present
(Prev
(Id
))
246 Error_Msg_N
("OTHERS must appear alone and last", Id
);
252 -- In most cases the choice has already been analyzed in
253 -- Analyze_Handled_Statement_Sequence, in order to expand
254 -- local handlers. This advance analysis does not take into
255 -- account the case in which a choice has the same name as
256 -- the choice parameter of the handler, which may hide an
257 -- outer exception. This pathological case appears in ACATS
258 -- B80001_3.adb, and requires an explicit check to verify
259 -- that the id is not hidden.
261 if not Is_Entity_Name
(Id
)
262 or else Ekind
(Entity
(Id
)) /= E_Exception
264 (Nkind
(Id
) = N_Identifier
265 and then Chars
(Id
) = Chars
(Choice
))
267 Error_Msg_N
("exception name expected", Id
);
270 -- Emit a warning at the declaration level when a local
271 -- exception is never raised explicitly.
273 if Warn_On_Redundant_Constructs
274 and then not Is_Raised
(Entity
(Id
))
275 and then Scope
(Entity
(Id
)) = Current_Scope
278 ("exception & is never raised?r?", Entity
(Id
), Id
);
281 if Present
(Renamed_Entity
(Entity
(Id
))) then
282 if Entity
(Id
) = Standard_Numeric_Error
then
283 Check_Restriction
(No_Obsolescent_Features
, Id
);
285 if Warn_On_Obsolescent_Feature
then
287 ("Numeric_Error is an " &
288 "obsolescent feature (RM J.6(1))?j?", Id
);
290 ("\use Constraint_Error instead?j?", Id
);
295 Check_Duplication
(Id
);
297 -- Check for exception declared within generic formal
298 -- package (which is illegal, see RM 11.2(8))
301 Ent
: Entity_Id
:= Entity
(Id
);
305 if Present
(Renamed_Entity
(Ent
)) then
306 Ent
:= Renamed_Entity
(Ent
);
310 while Scop
/= Standard_Standard
311 and then Ekind
(Scop
) = E_Package
313 if Nkind
(Declaration_Node
(Scop
)) =
314 N_Package_Specification
316 Nkind
(Original_Node
(Parent
317 (Declaration_Node
(Scop
)))) =
318 N_Formal_Package_Declaration
321 ("exception& is declared in " &
322 "generic formal package", Id
, Ent
);
324 ("\and therefore cannot appear in " &
325 "handler (RM 11.2(8))", Id
);
328 -- If the exception is declared in an inner
329 -- instance, nothing else to check.
331 elsif Is_Generic_Instance
(Scop
) then
335 Scop
:= Scope
(Scop
);
344 -- Check for redundant handler (has only raise statement) and is
345 -- either an others handler, or is a specific handler when no
346 -- others handler is present.
348 if Warn_On_Redundant_Constructs
349 and then List_Length
(Statements
(Handler
)) = 1
350 and then Nkind
(First
(Statements
(Handler
))) = N_Raise_Statement
351 and then No
(Name
(First
(Statements
(Handler
))))
352 and then (not Others_Present
353 or else Nkind
(First
(Exception_Choices
(Handler
))) =
357 ("useless handler contains only a reraise statement?r?",
361 -- Now analyze the statements of this handler
363 Analyze_Statements
(Statements
(Handler
));
365 -- If a choice was present, we created a special scope for it,
366 -- so this is where we pop that special scope to get rid of it.
368 if Present
(Choice
) then
375 end Analyze_Exception_Handlers
;
377 --------------------------------
378 -- Analyze_Handled_Statements --
379 --------------------------------
381 procedure Analyze_Handled_Statements
(N
: Node_Id
) is
382 Handlers
: constant List_Id
:= Exception_Handlers
(N
);
387 if Present
(Handlers
) then
391 -- We are now going to analyze the statements and then the exception
392 -- handlers. We certainly need to do things in this order to get the
393 -- proper sequential semantics for various warnings.
395 -- However, there is a glitch. When we process raise statements, an
396 -- optimization is to look for local handlers and specialize the code
399 -- In order to detect if a handler is matching, we must have at least
400 -- analyzed the choices in the proper scope so that proper visibility
401 -- analysis is performed. Hence we analyze just the choices first,
402 -- before we analyze the statement sequence.
404 Handler
:= First_Non_Pragma
(Handlers
);
405 while Present
(Handler
) loop
406 Choice
:= First_Non_Pragma
(Exception_Choices
(Handler
));
407 while Present
(Choice
) loop
409 Next_Non_Pragma
(Choice
);
412 Next_Non_Pragma
(Handler
);
415 -- Analyze statements in sequence
417 Analyze_Statements
(Statements
(N
));
419 -- If the current scope is a subprogram, then this is the right place to
420 -- check for hanging useless assignments from the statement sequence of
421 -- the subprogram body. Skip this in the body of a postcondition,
422 -- since in that case there are no source references, and we need to
423 -- preserve deferred references from the enclosing scope.
425 if Is_Subprogram
(Current_Scope
)
426 and then Chars
(Current_Scope
) /= Name_uPostconditions
428 Warn_On_Useless_Assignments
(Current_Scope
);
431 -- Deal with handlers or AT END proc
433 if Present
(Handlers
) then
434 Analyze_Exception_Handlers
(Handlers
);
435 elsif Present
(At_End_Proc
(N
)) then
436 Analyze
(At_End_Proc
(N
));
438 end Analyze_Handled_Statements
;
440 ------------------------------
441 -- Analyze_Raise_Expression --
442 ------------------------------
444 procedure Analyze_Raise_Expression
(N
: Node_Id
) is
445 Exception_Id
: constant Node_Id
:= Name
(N
);
446 Exception_Name
: Entity_Id
:= Empty
;
449 if Comes_From_Source
(N
) then
450 Check_Compiler_Unit
("raise expression", N
);
453 Check_SPARK_05_Restriction
("raise expression is not allowed", N
);
455 -- Check exception restrictions on the original source
457 if Comes_From_Source
(N
) then
458 Check_Restriction
(No_Exceptions
, N
);
461 Analyze
(Exception_Id
);
463 if Is_Entity_Name
(Exception_Id
) then
464 Exception_Name
:= Entity
(Exception_Id
);
467 if No
(Exception_Name
)
468 or else Ekind
(Exception_Name
) /= E_Exception
471 ("exception name expected in raise statement", Exception_Id
);
473 Set_Is_Raised
(Exception_Name
);
476 -- Deal with RAISE WITH case
478 if Present
(Expression
(N
)) then
479 Analyze_And_Resolve
(Expression
(N
), Standard_String
);
482 -- Check obsolescent use of Numeric_Error
484 if Exception_Name
= Standard_Numeric_Error
then
485 Check_Restriction
(No_Obsolescent_Features
, Exception_Id
);
488 -- Kill last assignment indication
490 Kill_Current_Values
(Last_Assignment_Only
=> True);
492 -- Raise_Type is compatible with all other types so that the raise
493 -- expression is legal in any expression context. It will be eventually
494 -- replaced by the concrete type imposed by the context.
496 Set_Etype
(N
, Raise_Type
);
497 end Analyze_Raise_Expression
;
499 -----------------------------
500 -- Analyze_Raise_Statement --
501 -----------------------------
503 procedure Analyze_Raise_Statement
(N
: Node_Id
) is
504 Exception_Id
: constant Node_Id
:= Name
(N
);
505 Exception_Name
: Entity_Id
:= Empty
;
510 if Comes_From_Source
(N
) then
511 Check_SPARK_05_Restriction
("raise statement is not allowed", N
);
514 Check_Unreachable_Code
(N
);
516 -- Check exception restrictions on the original source
518 if Comes_From_Source
(N
) then
519 Check_Restriction
(No_Exceptions
, N
);
522 -- Check for useless assignment to OUT or IN OUT scalar preceding the
523 -- raise. Right now only look at assignment statements, could do more???
525 if Is_List_Member
(N
) then
533 -- Skip past null statements and pragmas
536 and then Nkind_In
(P
, N_Null_Statement
, N_Pragma
)
541 -- See if preceding statement is an assignment
543 if Present
(P
) and then Nkind
(P
) = N_Assignment_Statement
then
546 -- Give warning for assignment to scalar formal
548 if Is_Scalar_Type
(Etype
(L
))
549 and then Is_Entity_Name
(L
)
550 and then Is_Formal
(Entity
(L
))
552 -- Do this only for parameters to the current subprogram.
553 -- This avoids some false positives for the nested case.
555 and then Nearest_Dynamic_Scope
(Current_Scope
) =
559 -- Don't give warning if we are covered by an exception
560 -- handler, since this may result in false positives, since
561 -- the handler may handle the exception and return normally.
563 -- First find the enclosing handled sequence of statements
564 -- (note, we could also look for a handler in an outer block
565 -- but currently we don't, and in that case we'll emit the
571 exit when Nkind
(Par
) = N_Handled_Sequence_Of_Statements
;
574 -- See if there is a handler, give message if not
576 if No
(Exception_Handlers
(Par
)) then
578 ("assignment to pass-by-copy formal "
579 & "may have no effect??", P
);
581 ("\RAISE statement may result in abnormal return "
582 & "(RM 6.4.1(17))??", P
);
591 if No
(Exception_Id
) then
593 while not Nkind_In
(P
, N_Exception_Handler
,
602 if Nkind
(P
) /= N_Exception_Handler
then
604 ("reraise statement must appear directly in a handler", N
);
606 -- If a handler has a reraise, it cannot be the target of a local
607 -- raise (goto optimization is impossible), and if the no exception
608 -- propagation restriction is set, this is a violation.
611 Set_Local_Raise_Not_OK
(P
);
613 -- Do not check the restriction if the reraise statement is part
614 -- of the code generated for an AT-END handler. That's because
615 -- if the restriction is actually active, we never generate this
616 -- raise anyway, so the apparent violation is bogus.
618 if not From_At_End
(N
) then
619 Check_Restriction
(No_Exception_Propagation
, N
);
623 -- Normal case with exception id present
626 Analyze
(Exception_Id
);
628 if Is_Entity_Name
(Exception_Id
) then
629 Exception_Name
:= Entity
(Exception_Id
);
632 if No
(Exception_Name
)
633 or else Ekind
(Exception_Name
) /= E_Exception
636 ("exception name expected in raise statement", Exception_Id
);
638 Set_Is_Raised
(Exception_Name
);
641 -- Deal with RAISE WITH case
643 if Present
(Expression
(N
)) then
644 Analyze_And_Resolve
(Expression
(N
), Standard_String
);
648 -- Check obsolescent use of Numeric_Error
650 if Exception_Name
= Standard_Numeric_Error
then
651 Check_Restriction
(No_Obsolescent_Features
, Exception_Id
);
654 -- Kill last assignment indication
656 Kill_Current_Values
(Last_Assignment_Only
=> True);
657 end Analyze_Raise_Statement
;
659 -----------------------------
660 -- Analyze_Raise_xxx_Error --
661 -----------------------------
663 -- Normally, the Etype is already set (when this node is used within
664 -- an expression, since it is copied from the node which it rewrites).
665 -- If this node is used in a statement context, then we set the type
666 -- Standard_Void_Type. This is used both by Gigi and by the front end
667 -- to distinguish the statement use and the subexpression use.
669 -- The only other required processing is to take care of the Condition
670 -- field if one is present.
672 procedure Analyze_Raise_xxx_Error
(N
: Node_Id
) is
674 function Same_Expression
(C1
, C2
: Node_Id
) return Boolean;
675 -- It often occurs that two identical raise statements are generated in
676 -- succession (for example when dynamic elaboration checks take place on
677 -- separate expressions in a call). If the two statements are identical
678 -- according to the simple criterion that follows, the raise is
679 -- converted into a null statement.
681 ---------------------
682 -- Same_Expression --
683 ---------------------
685 function Same_Expression
(C1
, C2
: Node_Id
) return Boolean is
687 if No
(C1
) and then No
(C2
) then
690 elsif Is_Entity_Name
(C1
) and then Is_Entity_Name
(C2
) then
691 return Entity
(C1
) = Entity
(C2
);
693 elsif Nkind
(C1
) /= Nkind
(C2
) then
696 elsif Nkind
(C1
) in N_Unary_Op
then
697 return Same_Expression
(Right_Opnd
(C1
), Right_Opnd
(C2
));
699 elsif Nkind
(C1
) in N_Binary_Op
then
700 return Same_Expression
(Left_Opnd
(C1
), Left_Opnd
(C2
))
702 Same_Expression
(Right_Opnd
(C1
), Right_Opnd
(C2
));
704 elsif Nkind
(C1
) = N_Null
then
712 -- Start of processing for Analyze_Raise_xxx_Error
715 if Nkind
(Original_Node
(N
)) = N_Raise_Statement
then
716 Check_SPARK_05_Restriction
("raise statement is not allowed", N
);
719 if No
(Etype
(N
)) then
720 Set_Etype
(N
, Standard_Void_Type
);
723 if Present
(Condition
(N
)) then
724 Analyze_And_Resolve
(Condition
(N
), Standard_Boolean
);
727 -- Deal with static cases in obvious manner
729 if Nkind
(Condition
(N
)) = N_Identifier
then
730 if Entity
(Condition
(N
)) = Standard_True
then
731 Set_Condition
(N
, Empty
);
733 elsif Entity
(Condition
(N
)) = Standard_False
then
734 Rewrite
(N
, Make_Null_Statement
(Sloc
(N
)));
738 -- Remove duplicate raise statements. Note that the previous one may
739 -- already have been removed as well.
741 if not Comes_From_Source
(N
)
742 and then Nkind
(N
) /= N_Null_Statement
743 and then Is_List_Member
(N
)
744 and then Present
(Prev
(N
))
745 and then Nkind
(N
) = Nkind
(Original_Node
(Prev
(N
)))
746 and then Same_Expression
747 (Condition
(N
), Condition
(Original_Node
(Prev
(N
))))
749 Rewrite
(N
, Make_Null_Statement
(Sloc
(N
)));
751 end Analyze_Raise_xxx_Error
;