libstdc++: fix C header include guards
[official-gcc.git] / gcc / ada / sem_warn.adb
blob49e9d90b478f845936a30a23aa7063505ac7087c
1 ------------------------------------------------------------------------------
2 -- --
3 -- GNAT COMPILER COMPONENTS --
4 -- --
5 -- S E M _ W A R N --
6 -- --
7 -- B o d y --
8 -- --
9 -- Copyright (C) 1999-2024, Free Software Foundation, Inc. --
10 -- --
11 -- GNAT is free software; you can redistribute it and/or modify it under --
12 -- terms of the GNU General Public License as published by the Free Soft- --
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
16 -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
17 -- for more details. You should have received a copy of the GNU General --
18 -- Public License distributed with GNAT; see file COPYING3. If not, go to --
19 -- http://www.gnu.org/licenses for a complete copy of the license. --
20 -- --
21 -- GNAT was originally developed by the GNAT team at New York University. --
22 -- Extensive contributions were provided by Ada Core Technologies Inc. --
23 -- --
24 ------------------------------------------------------------------------------
26 with Accessibility; use Accessibility;
27 with Atree; use Atree;
28 with Debug; use Debug;
29 with Einfo; use Einfo;
30 with Einfo.Entities; use Einfo.Entities;
31 with Einfo.Utils; use Einfo.Utils;
32 with Errout; use Errout;
33 with Exp_Code; use Exp_Code;
34 with Lib; use Lib;
35 with Namet; use Namet;
36 with Nlists; use Nlists;
37 with Opt; use Opt;
38 with Par_SCO; use Par_SCO;
39 with Rtsfind; use Rtsfind;
40 with Sem; use Sem;
41 with Sem_Ch8; use Sem_Ch8;
42 with Sem_Aux; use Sem_Aux;
43 with Sem_Eval; use Sem_Eval;
44 with Sem_Prag; use Sem_Prag;
45 with Sem_Util; use Sem_Util;
46 with Sinfo; use Sinfo;
47 with Sinfo.Nodes; use Sinfo.Nodes;
48 with Sinfo.Utils; use Sinfo.Utils;
49 with Sinput; use Sinput;
50 with Snames; use Snames;
51 with Stand; use Stand;
52 with Stringt; use Stringt;
53 with Tbuild; use Tbuild;
54 with Uintp; use Uintp;
55 with Warnsw; use Warnsw;
57 package body Sem_Warn is
59 -- The following table collects Id's of entities that are potentially
60 -- unreferenced. See Check_Unset_Reference for further details.
61 -- ??? Check_Unset_Reference has zero information about this table.
63 package Unreferenced_Entities is new Table.Table (
64 Table_Component_Type => Entity_Id,
65 Table_Index_Type => Nat,
66 Table_Low_Bound => 1,
67 Table_Initial => Alloc.Unreferenced_Entities_Initial,
68 Table_Increment => Alloc.Unreferenced_Entities_Increment,
69 Table_Name => "Unreferenced_Entities");
71 -- The following table collects potential warnings for IN OUT parameters
72 -- that are referenced but not modified. These warnings are processed when
73 -- the front end calls the procedure Output_Non_Modified_In_Out_Warnings.
74 -- The reason that we defer output of these messages is that we want to
75 -- detect the case where the relevant procedure is used as a generic actual
76 -- in an instantiation, since we suppress the warnings in this case. The
77 -- flag Used_As_Generic_Actual will be set in this case, but only at the
78 -- point of usage. Similarly, we suppress the message if the address of the
79 -- procedure is taken, where the flag Address_Taken may be set later.
81 package In_Out_Warnings is new Table.Table (
82 Table_Component_Type => Entity_Id,
83 Table_Index_Type => Nat,
84 Table_Low_Bound => 1,
85 Table_Initial => Alloc.In_Out_Warnings_Initial,
86 Table_Increment => Alloc.In_Out_Warnings_Increment,
87 Table_Name => "In_Out_Warnings");
89 --------------------------------------------------------
90 -- Handling of Warnings Off, Unmodified, Unreferenced --
91 --------------------------------------------------------
93 -- The functions Has_Warnings_Off, Has_Unmodified, Has_Unreferenced must
94 -- generally be used instead of Warnings_Off, Has_Pragma_Unmodified and
95 -- Has_Pragma_Unreferenced, as noted in the specs in Einfo.
97 -- In order to avoid losing warnings in -gnatw.w (warn on unnecessary
98 -- warnings off pragma) mode, i.e. to avoid false negatives, the code
99 -- must follow some important rules.
101 -- Call these functions as late as possible, after completing all other
102 -- tests, just before the warnings is given. For example, don't write:
104 -- if not Has_Warnings_Off (E)
105 -- and then some-other-predicate-on-E then ..
107 -- Instead the following is preferred
109 -- if some-other-predicate-on-E
110 -- and then Has_Warnings_Off (E)
112 -- This way if some-other-predicate is false, we avoid a false indication
113 -- that a Warnings (Off, E) pragma was useful in preventing a warning.
115 -- The second rule is that if both Has_Unmodified and Has_Warnings_Off, or
116 -- Has_Unreferenced and Has_Warnings_Off are called, make sure that the
117 -- call to Has_Unmodified/Has_Unreferenced comes first, this way we record
118 -- that the Warnings (Off) could have been Unreferenced or Unmodified. In
119 -- fact Has_Unmodified/Has_Unreferenced includes a test for Warnings Off,
120 -- and so a subsequent test is not needed anyway (though it is harmless).
122 -----------------------
123 -- Local Subprograms --
124 -----------------------
126 function Generic_Package_Spec_Entity (E : Entity_Id) return Boolean;
127 -- This returns true if the entity E is declared within a generic package.
128 -- The point of this is to detect variables which are not assigned within
129 -- the generic, but might be assigned outside the package for any given
130 -- instance. These are cases where we leave the warnings to be posted for
131 -- the instance, when we will know more.
133 function Goto_Spec_Entity (E : Entity_Id) return Entity_Id;
134 -- If E is a parameter entity for a subprogram body, then this function
135 -- returns the corresponding spec entity, if not, E is returned unchanged.
137 function Has_Pragma_Unmodified_Check_Spec (E : Entity_Id) return Boolean;
138 -- Tests Has_Pragma_Unmodified flag for entity E. If E is not a formal,
139 -- this is simply the setting of the flag Has_Pragma_Unmodified. If E is
140 -- a body formal, the setting of the flag in the corresponding spec is
141 -- also checked (and True returned if either flag is True).
143 function Has_Pragma_Unreferenced_Check_Spec (E : Entity_Id) return Boolean;
144 -- Tests Has_Pragma_Unreferenced flag for entity E. If E is not a formal,
145 -- this is simply the setting of the flag Has_Pragma_Unreferenced. If E is
146 -- a body formal, the setting of the flag in the corresponding spec is
147 -- also checked (and True returned if either flag is True).
149 function Is_Attribute_And_Known_Value_Comparison
150 (Op : Node_Id) return Boolean;
151 -- Determine whether operator Op denotes a comparison where the left
152 -- operand is an attribute reference and the value of the right operand is
153 -- known at compile time.
155 function Never_Set_In_Source_Check_Spec (E : Entity_Id) return Boolean;
156 -- Tests Never_Set_In_Source status for entity E. If E is not a formal,
157 -- this is simply the setting of the flag Never_Set_In_Source. If E is
158 -- a body formal, the setting of the flag in the corresponding spec is
159 -- also checked (and False returned if either flag is False).
161 function Operand_Has_Warnings_Suppressed (N : Node_Id) return Boolean;
162 -- This function traverses the expression tree represented by the node N
163 -- and determines if any sub-operand is a reference to an entity for which
164 -- the Warnings_Off flag is set. True is returned if such an entity is
165 -- encountered, and False otherwise.
167 function Referenced_Check_Spec (E : Entity_Id) return Boolean;
168 -- Tests Referenced status for entity E. If E is not a formal, this is
169 -- simply the setting of the flag Referenced. If E is a body formal, the
170 -- setting of the flag in the corresponding spec is also checked (and True
171 -- returned if either flag is True).
173 function Referenced_As_LHS_Check_Spec (E : Entity_Id) return Boolean;
174 -- Tests Referenced_As_LHS status for entity E. If E is not a formal, this
175 -- is simply the setting of the flag Referenced_As_LHS. If E is a body
176 -- formal, the setting of the flag in the corresponding spec is also
177 -- checked (and True returned if either flag is True).
179 function Referenced_As_Out_Parameter_Check_Spec
180 (E : Entity_Id) return Boolean;
181 -- Tests Referenced_As_Out_Parameter status for entity E. If E is not a
182 -- formal, this is simply the setting of Referenced_As_Out_Parameter. If E
183 -- is a body formal, the setting of the flag in the corresponding spec is
184 -- also checked (and True returned if either flag is True).
186 procedure Warn_On_Unreferenced_Entity
187 (Spec_E : Entity_Id;
188 Body_E : Entity_Id := Empty);
189 -- Output warnings for unreferenced entity E. For the case of an entry
190 -- formal, Body_E is the corresponding body entity for a particular
191 -- accept statement, and the message is posted on Body_E. In all other
192 -- cases, Body_E is ignored and must be Empty.
194 function Warnings_Off_Check_Spec (E : Entity_Id) return Boolean;
195 -- Returns True if Warnings_Off is set for the entity E or (in the case
196 -- where there is a Spec_Entity), Warnings_Off is set for the Spec_Entity.
198 --------------------------
199 -- Check_Code_Statement --
200 --------------------------
202 procedure Check_Code_Statement (N : Node_Id) is
203 begin
204 -- If volatile, nothing to worry about
206 if Is_Asm_Volatile (N) then
207 return;
208 end if;
210 -- Warn if no input or no output
212 Setup_Asm_Inputs (N);
214 if No (Asm_Input_Value) then
215 Error_Msg_F
216 ("??code statement with no inputs should usually be Volatile!", N);
217 return;
218 end if;
220 Setup_Asm_Outputs (N);
222 if No (Asm_Output_Variable) then
223 Error_Msg_F
224 ("??code statement with no outputs should usually be Volatile!", N);
225 return;
226 end if;
227 end Check_Code_Statement;
229 ---------------------------------
230 -- Check_Infinite_Loop_Warning --
231 ---------------------------------
233 -- The case we look for is a while loop which tests a local variable, where
234 -- there is no obvious direct or possible indirect update of the variable
235 -- within the body of the loop.
237 procedure Check_Infinite_Loop_Warning (Loop_Statement : Node_Id) is
238 Expression : Node_Id := Empty;
239 -- Set to WHILE or EXIT WHEN condition to be tested
241 Ref : Node_Id := Empty;
242 -- Reference in Expression to variable that might not be modified
243 -- in loop, indicating a possible infinite loop.
245 Var : Entity_Id := Empty;
246 -- Corresponding entity (entity of Ref)
248 Function_Call_Found : Boolean := False;
249 -- True if Find_Var found a function call in the condition
251 procedure Find_Var (N : Node_Id);
252 -- Inspect condition to see if it depends on a single entity reference.
253 -- If so, Ref is set to point to the reference node, and Var is set to
254 -- the referenced Entity.
256 function Has_Condition_Actions (Iter : Node_Id) return Boolean;
257 -- Determine whether iteration scheme Iter has meaningful condition
258 -- actions.
260 function Has_Indirection (T : Entity_Id) return Boolean;
261 -- If the controlling variable is an access type, or is a record type
262 -- with access components, assume that it is changed indirectly and
263 -- suppress the warning. As a concession to low-level programming, in
264 -- particular within Declib, we also suppress warnings on a record
265 -- type that contains components of type Address or Short_Address.
267 function Is_Suspicious_Function_Name (E : Entity_Id) return Boolean;
268 -- Given an entity name, see if the name appears to have something to
269 -- do with I/O or network stuff, and if so, return True. Used to kill
270 -- some false positives on a heuristic basis that such functions will
271 -- likely have some strange side effect dependencies. A rather strange
272 -- test, but warning messages are in the heuristics business.
274 function Test_Ref (N : Node_Id) return Traverse_Result;
275 -- Test for reference to variable in question. Returns Abandon if
276 -- matching reference found. Used in instantiation of No_Ref_Found.
278 function No_Ref_Found is new Traverse_Func (Test_Ref);
279 -- Function to traverse body of procedure. Returns Abandon if matching
280 -- reference found.
282 --------------
283 -- Find_Var --
284 --------------
286 procedure Find_Var (N : Node_Id) is
287 begin
288 -- Expression is a direct variable reference
290 if Is_Entity_Name (N) then
291 Ref := N;
292 Var := Entity (Ref);
294 -- If expression is an operator, check its operands
296 elsif Nkind (N) in N_Binary_Op then
297 if Compile_Time_Known_Value (Right_Opnd (N)) then
298 Find_Var (Left_Opnd (N));
300 elsif Compile_Time_Known_Value (Left_Opnd (N)) then
301 Find_Var (Right_Opnd (N));
303 -- Ignore any other comparison
305 else
306 return;
307 end if;
309 -- If expression is a unary operator, check its operand
311 elsif Nkind (N) in N_Unary_Op then
312 Find_Var (Right_Opnd (N));
314 -- Case of condition is function call
316 elsif Nkind (N) = N_Function_Call then
318 Function_Call_Found := True;
320 -- Forget it if function name is not entity, who knows what
321 -- we might be calling?
323 if not Is_Entity_Name (Name (N)) then
324 return;
326 -- Forget it if function name is suspicious. A strange test
327 -- but warning generation is in the heuristics business.
329 elsif Is_Suspicious_Function_Name (Entity (Name (N))) then
330 return;
332 -- Forget it if function is marked Volatile_Function
334 elsif Is_Volatile_Function (Entity (Name (N))) then
335 return;
337 -- Forget it if warnings are suppressed on function entity
339 elsif Has_Warnings_Off (Entity (Name (N))) then
340 return;
342 -- Forget it if the parameter is not In
344 elsif Has_Out_Or_In_Out_Parameter (Entity (Name (N))) then
345 return;
346 end if;
348 -- OK, see if we have one argument
350 declare
351 PA : constant List_Id := Parameter_Associations (N);
353 begin
354 -- One argument, so check the argument
356 if List_Length (PA) = 1 then
357 if Nkind (First (PA)) = N_Parameter_Association then
358 Find_Var (Explicit_Actual_Parameter (First (PA)));
359 else
360 Find_Var (First (PA));
361 end if;
363 -- Not one argument
365 else
366 return;
367 end if;
368 end;
370 -- Any other kind of node is not something we warn for
372 else
373 return;
374 end if;
375 end Find_Var;
377 ---------------------------
378 -- Has_Condition_Actions --
379 ---------------------------
381 function Has_Condition_Actions (Iter : Node_Id) return Boolean is
382 Action : Node_Id;
384 begin
385 -- A call marker is not considered a meaningful action because it
386 -- acts as an annotation and has no runtime semantics.
388 Action := First (Condition_Actions (Iter));
389 while Present (Action) loop
390 if Nkind (Action) /= N_Call_Marker then
391 return True;
392 end if;
394 Next (Action);
395 end loop;
397 return False;
398 end Has_Condition_Actions;
400 ---------------------
401 -- Has_Indirection --
402 ---------------------
404 function Has_Indirection (T : Entity_Id) return Boolean is
405 Comp : Entity_Id;
406 Rec : Entity_Id;
408 begin
409 if Is_Access_Type (T) then
410 return True;
412 elsif Is_Private_Type (T)
413 and then Present (Full_View (T))
414 and then Is_Access_Type (Full_View (T))
415 then
416 return True;
418 elsif Is_Record_Type (T) then
419 Rec := T;
421 elsif Is_Private_Type (T)
422 and then Present (Full_View (T))
423 and then Is_Record_Type (Full_View (T))
424 then
425 Rec := Full_View (T);
426 else
427 return False;
428 end if;
430 Comp := First_Component (Rec);
431 while Present (Comp) loop
432 if Is_Access_Type (Etype (Comp))
433 or else Is_Descendant_Of_Address (Etype (Comp))
434 then
435 return True;
436 end if;
438 Next_Component (Comp);
439 end loop;
441 return False;
442 end Has_Indirection;
444 ---------------------------------
445 -- Is_Suspicious_Function_Name --
446 ---------------------------------
448 function Is_Suspicious_Function_Name (E : Entity_Id) return Boolean is
449 function Substring_Present (S : String) return Boolean;
450 -- Returns True if name buffer has given string delimited by non-
451 -- alphabetic characters or by end of string. S is lower case.
453 -----------------------
454 -- Substring_Present --
455 -----------------------
457 function Substring_Present (S : String) return Boolean is
458 Len : constant Natural := S'Length;
460 begin
461 for J in 1 .. Name_Len - (Len - 1) loop
462 if Name_Buffer (J .. J + (Len - 1)) = S
463 and then (J = 1 or else Name_Buffer (J - 1) not in 'a' .. 'z')
464 and then
465 (J + Len > Name_Len
466 or else Name_Buffer (J + Len) not in 'a' .. 'z')
467 then
468 return True;
469 end if;
470 end loop;
472 return False;
473 end Substring_Present;
475 -- Local variables
477 S : Entity_Id;
479 -- Start of processing for Is_Suspicious_Function_Name
481 begin
482 S := E;
483 while Present (S) and then S /= Standard_Standard loop
484 Get_Name_String (Chars (S));
486 if Substring_Present ("io")
487 or else Substring_Present ("file")
488 or else Substring_Present ("network")
489 then
490 return True;
491 else
492 S := Scope (S);
493 end if;
494 end loop;
496 return False;
497 end Is_Suspicious_Function_Name;
499 --------------
500 -- Test_Ref --
501 --------------
503 function Test_Ref (N : Node_Id) return Traverse_Result is
504 begin
505 -- Waste of time to look at the expression we are testing
507 if N = Expression then
508 return Skip;
510 -- Direct reference to variable in question
512 elsif Is_Entity_Name (N)
513 and then Present (Entity (N))
514 and then Entity (N) = Var
515 then
516 -- If this is an lvalue, then definitely abandon, since
517 -- this could be a direct modification of the variable.
519 if Known_To_Be_Assigned (N) then
520 return Abandon;
521 end if;
523 -- If the condition contains a function call, we consider it may
524 -- be modified by side effects from a procedure call. Otherwise,
525 -- we consider the condition may not be modified, although that
526 -- might happen if Variable is itself a by-reference parameter,
527 -- and the procedure called modifies the global object referred to
528 -- by Variable, but we actually prefer to issue a warning in this
529 -- odd case. Note that the case where the procedure called has
530 -- visibility over Variable is treated in another case below.
532 if Function_Call_Found then
533 declare
534 P : Node_Id;
536 begin
537 P := N;
538 loop
539 P := Parent (P);
540 exit when P = Loop_Statement;
542 -- Abandon if at procedure call, or something strange is
543 -- going on (perhaps a node with no parent that should
544 -- have one but does not?) As always, for a warning we
545 -- prefer to just abandon the warning than get into the
546 -- business of complaining about the tree structure here.
548 if No (P)
549 or else Nkind (P) = N_Procedure_Call_Statement
550 then
551 return Abandon;
552 end if;
553 end loop;
554 end;
555 end if;
557 -- Reference to variable renaming variable in question
559 elsif Is_Entity_Name (N)
560 and then Present (Entity (N))
561 and then Ekind (Entity (N)) = E_Variable
562 and then Present (Renamed_Object (Entity (N)))
563 and then Is_Entity_Name (Renamed_Object (Entity (N)))
564 and then Entity (Renamed_Object (Entity (N))) = Var
565 and then Known_To_Be_Assigned (N)
566 then
567 return Abandon;
569 -- Call to subprogram
571 elsif Nkind (N) in N_Subprogram_Call then
573 -- If subprogram is within the scope of the entity we are dealing
574 -- with as the loop variable, then it could modify this parameter,
575 -- so we abandon in this case. In the case of a subprogram that is
576 -- not an entity we also abandon. The check for no entity being
577 -- present is a defense against previous errors.
579 if not Is_Entity_Name (Name (N))
580 or else No (Entity (Name (N)))
581 or else Scope_Within (Entity (Name (N)), Scope (Var))
582 then
583 return Abandon;
584 end if;
586 -- If any of the arguments are of type access to subprogram, then
587 -- we may have funny side effects, so no warning in this case.
589 declare
590 Actual : Node_Id;
591 begin
592 Actual := First_Actual (N);
593 while Present (Actual) loop
594 if No (Etype (Actual))
595 or else Is_Access_Subprogram_Type (Etype (Actual))
596 then
597 return Abandon;
598 else
599 Next_Actual (Actual);
600 end if;
601 end loop;
602 end;
604 -- Declaration of the variable in question
606 elsif Nkind (N) = N_Object_Declaration
607 and then Defining_Identifier (N) = Var
608 then
609 return Abandon;
610 end if;
612 -- All OK, continue scan
614 return OK;
615 end Test_Ref;
617 -- Start of processing for Check_Infinite_Loop_Warning
619 begin
620 -- Skip processing if debug flag gnatd.w is set
622 if Debug_Flag_Dot_W then
623 return;
624 end if;
626 -- Deal with Iteration scheme present
628 declare
629 Iter : constant Node_Id := Iteration_Scheme (Loop_Statement);
631 begin
632 if Present (Iter) then
634 -- While iteration
636 if Present (Condition (Iter)) then
638 -- Skip processing for while iteration with conditions actions,
639 -- since they make it too complicated to get the warning right.
641 if Has_Condition_Actions (Iter) then
642 return;
643 end if;
645 -- Capture WHILE condition
647 Expression := Condition (Iter);
649 -- For Loop_Parameter_Specification, do not process, since loop
650 -- will always terminate. For Iterator_Specification, also do not
651 -- process. Either it will always terminate (e.g. "for X of
652 -- Some_Array ..."), or we can't tell if it's going to terminate
653 -- without looking at the iterator, so any warning here would be
654 -- noise.
656 elsif Present (Loop_Parameter_Specification (Iter))
657 or else Present (Iterator_Specification (Iter))
658 then
659 return;
660 end if;
661 end if;
662 end;
664 -- Check chain of EXIT statements, we only process loops that have a
665 -- single exit condition (either a single EXIT WHEN statement, or a
666 -- WHILE loop not containing any EXIT WHEN statements).
668 declare
669 Ident : constant Node_Id := Identifier (Loop_Statement);
670 Exit_Stmt : Node_Id;
672 begin
673 -- If we don't have a proper chain set, ignore call entirely. This
674 -- happens because of previous errors.
676 if No (Entity (Ident))
677 or else Ekind (Entity (Ident)) /= E_Loop
678 then
679 Check_Error_Detected;
680 return;
681 end if;
683 -- Otherwise prepare to scan list of EXIT statements
685 Exit_Stmt := First_Exit_Statement (Entity (Ident));
686 while Present (Exit_Stmt) loop
688 -- Check for EXIT WHEN
690 if Present (Condition (Exit_Stmt)) then
692 -- Quit processing if EXIT WHEN in WHILE loop, or more than
693 -- one EXIT WHEN statement present in the loop.
695 if Present (Expression) then
696 return;
698 -- Otherwise capture condition from EXIT WHEN statement
700 else
701 Expression := Condition (Exit_Stmt);
702 end if;
704 -- If an unconditional exit statement is the last statement in the
705 -- loop, assume that no warning is needed, without any attempt at
706 -- checking whether the exit is reachable.
708 elsif Exit_Stmt = Last (Statements (Loop_Statement)) then
709 return;
710 end if;
712 Exit_Stmt := Next_Exit_Statement (Exit_Stmt);
713 end loop;
714 end;
716 -- Return if no condition to test
718 if No (Expression) then
719 return;
720 end if;
722 -- Initial conditions met, see if condition is of right form
724 Find_Var (Expression);
726 -- Nothing to do if local variable from source not found. If it's a
727 -- renaming, it is probably renaming something too complicated to deal
728 -- with here.
730 if No (Var)
731 or else Ekind (Var) /= E_Variable
732 or else Is_Library_Level_Entity (Var)
733 or else not Comes_From_Source (Var)
734 or else Nkind (Parent (Var)) = N_Object_Renaming_Declaration
735 then
736 return;
738 -- Nothing to do if there is some indirection involved (assume that the
739 -- designated variable might be modified in some way we don't see).
740 -- However, if no function call was found, then we don't care about
741 -- indirections, because the condition must be something like "while X
742 -- /= null loop", so we don't care if X.all is modified in the loop.
744 elsif Function_Call_Found and then Has_Indirection (Etype (Var)) then
745 return;
747 -- Same sort of thing for volatile variable, might be modified by
748 -- some other task or by the operating system in some way.
750 elsif Is_Volatile (Var) then
751 return;
752 end if;
754 -- Filter out case of original statement sequence starting with delay.
755 -- We assume this is a multi-tasking program and that the condition
756 -- is affected by other threads (some kind of busy wait).
758 declare
759 Fstm : constant Node_Id :=
760 Original_Node (First (Statements (Loop_Statement)));
761 begin
762 if Nkind (Fstm) in N_Delay_Statement then
763 return;
764 end if;
765 end;
767 -- We have a variable reference of the right form, now we scan the loop
768 -- body to see if it looks like it might not be modified
770 if No_Ref_Found (Loop_Statement) = OK then
771 Error_Msg_NE
772 ("??variable& is not modified in loop body!", Ref, Var);
773 Error_Msg_N
774 ("\??possible infinite loop!", Ref);
775 end if;
776 end Check_Infinite_Loop_Warning;
778 ----------------------------
779 -- Check_Low_Bound_Tested --
780 ----------------------------
782 procedure Check_Low_Bound_Tested (Expr : Node_Id) is
783 procedure Check_Low_Bound_Tested_For (Opnd : Node_Id);
784 -- Determine whether operand Opnd denotes attribute 'First whose prefix
785 -- is a formal parameter. If this is the case, mark the entity of the
786 -- prefix as having its low bound tested.
788 --------------------------------
789 -- Check_Low_Bound_Tested_For --
790 --------------------------------
792 procedure Check_Low_Bound_Tested_For (Opnd : Node_Id) is
793 begin
794 if Nkind (Opnd) = N_Attribute_Reference
795 and then Attribute_Name (Opnd) = Name_First
796 and then Is_Entity_Name (Prefix (Opnd))
797 and then Present (Entity (Prefix (Opnd)))
798 and then Is_Formal (Entity (Prefix (Opnd)))
799 then
800 Set_Low_Bound_Tested (Entity (Prefix (Opnd)));
801 end if;
802 end Check_Low_Bound_Tested_For;
804 -- Start of processing for Check_Low_Bound_Tested
806 begin
807 if Comes_From_Source (Expr) then
808 Check_Low_Bound_Tested_For (Left_Opnd (Expr));
809 Check_Low_Bound_Tested_For (Right_Opnd (Expr));
810 end if;
811 end Check_Low_Bound_Tested;
813 ----------------------
814 -- Check_References --
815 ----------------------
817 procedure Check_References (E : Entity_Id; Anod : Node_Id := Empty) is
818 E1 : Entity_Id;
819 E1T : Entity_Id;
820 UR : Node_Id;
822 function Body_Formal
823 (E : Entity_Id;
824 Accept_Statement : Node_Id) return Entity_Id;
825 -- For an entry formal entity from an entry declaration, find the
826 -- corresponding body formal from the given accept statement.
828 function Generic_Body_Formal (E : Entity_Id) return Entity_Id;
829 -- Warnings on unused formals of subprograms are placed on the entity
830 -- in the subprogram body, which seems preferable because it suggests
831 -- a better codefix for GNAT Studio. The analysis of generic subprogram
832 -- bodies uses a different circuitry, so the choice for the proper
833 -- placement of the warning in the generic case takes place here, by
834 -- finding the body entity that corresponds to a formal in a spec.
836 procedure May_Need_Initialized_Actual (Ent : Entity_Id);
837 -- If an entity of a generic type has default initialization, then the
838 -- corresponding actual type should be fully initialized, or else there
839 -- will be uninitialized components in the instantiation, that might go
840 -- unreported. This routine marks the type of the uninitialized variable
841 -- appropriately to allow the compiler to emit an appropriate warning
842 -- in the instance. In a sense, the use of a type that requires full
843 -- initialization is a weak part of the generic contract.
845 function Missing_Subunits return Boolean;
846 -- We suppress warnings when there are missing subunits, because this
847 -- may generate too many false positives: entities in a parent may only
848 -- be referenced in one of the subunits. We make an exception for
849 -- subunits that contain no other stubs.
851 procedure Output_Reference_Error (M : String);
852 -- Used to output an error message. Deals with posting the error on the
853 -- body formal in the accept case.
855 function Publicly_Referenceable (Ent : Entity_Id) return Boolean;
856 -- This is true if the entity in question is potentially referenceable
857 -- from another unit. This is true for entities in packages that are at
858 -- the library level.
860 function Type_OK_For_No_Value_Assigned (T : Entity_Id) return Boolean;
861 -- Return True if it is OK for an object of type T to be referenced
862 -- without having been assigned a value in the source.
864 function Warnings_Off_E1 return Boolean;
865 -- Return True if Warnings_Off is set for E1, or for its Etype (E1T),
866 -- or for the base type of E1T.
868 -----------------
869 -- Body_Formal --
870 -----------------
872 function Body_Formal
873 (E : Entity_Id;
874 Accept_Statement : Node_Id) return Entity_Id
876 Body_Param : Node_Id;
877 Body_E : Entity_Id;
879 begin
880 -- Loop to find matching parameter in accept statement
882 Body_Param := First (Parameter_Specifications (Accept_Statement));
883 while Present (Body_Param) loop
884 Body_E := Defining_Identifier (Body_Param);
886 if Chars (Body_E) = Chars (E) then
887 return Body_E;
888 end if;
890 Next (Body_Param);
891 end loop;
893 -- Should never fall through, should always find a match
895 raise Program_Error;
896 end Body_Formal;
898 -------------------------
899 -- Generic_Body_Formal --
900 -------------------------
902 function Generic_Body_Formal (E : Entity_Id) return Entity_Id is
903 Gen_Decl : constant Node_Id := Unit_Declaration_Node (Scope (E));
904 Gen_Body : constant Entity_Id := Corresponding_Body (Gen_Decl);
905 Form : Entity_Id;
907 begin
908 if No (Gen_Body) then
909 return E;
911 else
912 Form := First_Entity (Gen_Body);
913 while Present (Form) loop
914 if Chars (Form) = Chars (E) then
915 return Form;
916 end if;
918 Next_Entity (Form);
919 end loop;
920 end if;
922 -- Should never fall through, should always find a match
924 raise Program_Error;
925 end Generic_Body_Formal;
927 ---------------------------------
928 -- May_Need_Initialized_Actual --
929 ---------------------------------
931 procedure May_Need_Initialized_Actual (Ent : Entity_Id) is
932 T : constant Entity_Id := Etype (Ent);
933 Par : constant Node_Id := Parent (T);
935 begin
936 if not Is_Generic_Type (T) then
937 null;
939 elsif Nkind (Par) = N_Private_Extension_Declaration then
941 -- We only indicate the first such variable in the generic.
943 if No (Uninitialized_Variable (Par)) then
944 Set_Uninitialized_Variable (Par, Ent);
945 end if;
947 elsif Nkind (Par) = N_Formal_Type_Declaration
948 and then Nkind (Formal_Type_Definition (Par)) =
949 N_Formal_Private_Type_Definition
950 then
951 if No (Uninitialized_Variable (Formal_Type_Definition (Par))) then
952 Set_Uninitialized_Variable (Formal_Type_Definition (Par), Ent);
953 end if;
954 end if;
955 end May_Need_Initialized_Actual;
957 ----------------------
958 -- Missing_Subunits --
959 ----------------------
961 function Missing_Subunits return Boolean is
962 D : Node_Id;
964 begin
965 if not Unloaded_Subunits then
967 -- Normal compilation, all subunits are present
969 return False;
971 elsif E /= Main_Unit_Entity then
973 -- No warnings on a stub that is not the main unit
975 return True;
977 elsif Nkind (Unit_Declaration_Node (E)) in N_Proper_Body then
978 D := First (Declarations (Unit_Declaration_Node (E)));
979 while Present (D) loop
981 -- No warnings if the proper body contains nested stubs
983 if Nkind (D) in N_Body_Stub then
984 return True;
985 end if;
987 Next (D);
988 end loop;
990 return False;
992 else
993 -- Missing stubs elsewhere
995 return True;
996 end if;
997 end Missing_Subunits;
999 ----------------------------
1000 -- Output_Reference_Error --
1001 ----------------------------
1003 procedure Output_Reference_Error (M : String) is
1004 begin
1005 -- Never issue messages for internal names or renamings
1007 if Is_Internal_Name (Chars (E1))
1008 or else Nkind (Parent (E1)) = N_Object_Renaming_Declaration
1009 then
1010 return;
1011 end if;
1013 -- Don't output message for IN OUT formal unless we have the warning
1014 -- flag specifically set. It is a bit odd to distinguish IN OUT
1015 -- formals from other cases. This distinction is historical in
1016 -- nature. Warnings for IN OUT formals were added fairly late.
1018 if Ekind (E1) = E_In_Out_Parameter
1019 and then not Check_Unreferenced_Formals
1020 then
1021 return;
1022 end if;
1024 -- Other than accept case, post error on defining identifier
1026 if No (Anod) then
1027 Error_Msg_N (M, E1);
1029 -- Accept case, find body formal to post the message
1031 else
1032 Error_Msg_NE (M, Body_Formal (E1, Accept_Statement => Anod), E1);
1034 end if;
1035 end Output_Reference_Error;
1037 ----------------------------
1038 -- Publicly_Referenceable --
1039 ----------------------------
1041 function Publicly_Referenceable (Ent : Entity_Id) return Boolean is
1042 P : Node_Id;
1043 Prev : Node_Id;
1045 begin
1046 -- A formal parameter is never referenceable outside the body of its
1047 -- subprogram or entry.
1049 if Is_Formal (Ent) then
1050 return False;
1051 end if;
1053 -- Examine parents to look for a library level package spec. But if
1054 -- we find a body or block or other similar construct along the way,
1055 -- we cannot be referenced.
1057 Prev := Ent;
1058 P := Parent (Ent);
1059 loop
1060 case Nkind (P) is
1062 -- If we get to top of tree, then publicly referenceable
1064 when N_Empty =>
1065 return True;
1067 -- If we reach a generic package declaration, then always
1068 -- consider this referenceable, since any instantiation will
1069 -- have access to the entities in the generic package. Note
1070 -- that the package itself may not be instantiated, but then
1071 -- we will get a warning for the package entity.
1073 -- Note that generic formal parameters are themselves not
1074 -- publicly referenceable in an instance, and warnings on them
1075 -- are useful.
1077 when N_Generic_Package_Declaration =>
1078 return
1079 not Is_List_Member (Prev)
1080 or else List_Containing (Prev) /=
1081 Generic_Formal_Declarations (P);
1083 -- Similarly, the generic formals of a generic subprogram are
1084 -- not accessible.
1086 when N_Generic_Subprogram_Declaration =>
1087 if Is_List_Member (Prev)
1088 and then List_Containing (Prev) =
1089 Generic_Formal_Declarations (P)
1090 then
1091 return False;
1092 else
1093 P := Parent (P);
1094 end if;
1096 -- If we reach a subprogram body, entity is not referenceable
1097 -- unless it is the defining entity of the body. This will
1098 -- happen, e.g. when a function is an attribute renaming that
1099 -- is rewritten as a body.
1101 when N_Subprogram_Body =>
1102 if Ent /= Defining_Entity (P) then
1103 return False;
1104 else
1105 P := Parent (P);
1106 end if;
1108 -- If we reach any other body, definitely not referenceable
1110 when N_Block_Statement
1111 | N_Entry_Body
1112 | N_Package_Body
1113 | N_Protected_Body
1114 | N_Subunit
1115 | N_Task_Body
1117 return False;
1119 -- For all other cases, keep looking up tree
1121 when others =>
1122 Prev := P;
1123 P := Parent (P);
1124 end case;
1125 end loop;
1126 end Publicly_Referenceable;
1128 -----------------------------------
1129 -- Type_OK_For_No_Value_Assigned --
1130 -----------------------------------
1132 function Type_OK_For_No_Value_Assigned (T : Entity_Id) return Boolean is
1133 begin
1134 -- No information for generic types, so be conservative
1136 if Is_Generic_Type (T) then
1137 return False;
1138 end if;
1140 -- Even if objects of access types are implicitly initialized to null
1142 if Is_Access_Type (T) then
1143 return False;
1144 end if;
1146 -- The criterion is whether the type is (partially) initialized in
1147 -- the source, in other words we disregard implicit default values.
1148 -- But we do not require full initialization for by-reference types
1149 -- because they are complex and it may not be possible to have it.
1151 if Is_By_Reference_Type (T) then
1152 return
1153 Is_Partially_Initialized_Type (T, Include_Implicit => False);
1154 else
1155 return Is_Fully_Initialized_Type (T);
1156 end if;
1157 end Type_OK_For_No_Value_Assigned;
1159 ---------------------
1160 -- Warnings_Off_E1 --
1161 ---------------------
1163 function Warnings_Off_E1 return Boolean is
1164 begin
1165 return Has_Warnings_Off (E1T)
1166 or else Has_Warnings_Off (Base_Type (E1T))
1167 or else Warnings_Off_Check_Spec (E1);
1168 end Warnings_Off_E1;
1170 -- Start of processing for Check_References
1172 begin
1173 -- No messages if warnings are suppressed, or if we have detected any
1174 -- real errors so far (this last check avoids junk messages resulting
1175 -- from errors, e.g. a subunit that is not loaded).
1177 if Warning_Mode = Suppress or else Serious_Errors_Detected /= 0 then
1178 return;
1179 end if;
1181 -- We also skip the messages if any subunits were not loaded (see
1182 -- comment in Sem_Ch10 to understand how this is set, and why it is
1183 -- necessary to suppress the warnings in this case).
1185 if Missing_Subunits then
1186 return;
1187 end if;
1189 -- Otherwise loop through entities, looking for suspicious stuff
1191 E1 := First_Entity (E);
1192 while Present (E1) loop
1193 -- We are only interested in source entities. We also don't issue
1194 -- warnings within instances, since the proper place for such
1195 -- warnings is on the template when it is compiled, and we don't
1196 -- issue warnings for variables with names like Junk, Discard etc.
1198 if Comes_From_Source (E1)
1199 and then Instantiation_Location (Sloc (E1)) = No_Location
1200 then
1201 E1T := Etype (E1);
1203 -- We are interested in variables and out/in-out parameters, but
1204 -- we exclude protected types, too complicated to worry about.
1206 if Ekind (E1) = E_Variable
1207 or else
1208 (Ekind (E1) in E_Out_Parameter | E_In_Out_Parameter
1209 and then not Is_Protected_Type (Current_Scope))
1210 then
1211 -- If the formal has a class-wide type, retrieve its type
1212 -- because checks below depend on its private nature.
1214 if Is_Class_Wide_Type (E1T) then
1215 E1T := Etype (E1T);
1216 end if;
1218 -- Case of an unassigned variable
1220 -- First gather any Unset_Reference indication for E1. In the
1221 -- case of an 'out' parameter, it is the Spec_Entity that is
1222 -- relevant.
1224 if Ekind (E1) = E_Out_Parameter
1225 and then Present (Spec_Entity (E1))
1226 then
1227 UR := Unset_Reference (Spec_Entity (E1));
1228 else
1229 UR := Unset_Reference (E1);
1230 end if;
1232 -- Special processing for access types
1234 if Present (UR) and then Is_Access_Type (E1T) then
1236 -- For access types, the only time we made a UR entry was
1237 -- for a dereference, and so we post the appropriate warning
1238 -- here (note that the dereference may not be explicit in
1239 -- the source, for example in the case of a dispatching call
1240 -- with an anonymous access controlling formal, or of an
1241 -- assignment of a pointer involving discriminant check on
1242 -- the designated object).
1244 if not Warnings_Off_E1 then
1245 Error_Msg_NE ("??& may be null!", UR, E1);
1246 end if;
1248 goto Continue;
1250 -- Case of variable that could be a constant. Note that we
1251 -- never signal such messages for generic package entities,
1252 -- since a given instance could have modifications outside
1253 -- the package.
1255 -- Note that we used to check Address_Taken here, but we don't
1256 -- want to do that since it can be set for non-source cases,
1257 -- e.g. the Unrestricted_Access from a valid attribute, and
1258 -- the wanted effect is included in Never_Set_In_Source.
1260 elsif Warn_On_Constant
1261 and then Ekind (E1) = E_Variable
1262 and then Has_Initial_Value (E1)
1263 and then Never_Set_In_Source (E1)
1264 and then not Generic_Package_Spec_Entity (E1)
1265 then
1266 -- A special case, if this variable is volatile and not
1267 -- imported, it is not helpful to tell the programmer
1268 -- to mark the variable as constant, since this would be
1269 -- illegal by virtue of RM C.6(13). Instead we suggest
1270 -- using pragma Export (can't be Import because of the
1271 -- initial value).
1273 if (Is_Volatile (E1) or else Has_Volatile_Components (E1))
1274 and then not Is_Imported (E1)
1275 then
1276 Error_Msg_N
1277 ("?k?& is not modified, consider pragma Export for "
1278 & "volatile variable!", E1);
1280 -- Another special case, Exception_Occurrence, this catches
1281 -- the case of exception choice (and a bit more too, but not
1282 -- worth doing more investigation here).
1284 elsif Is_RTE (E1T, RE_Exception_Occurrence) then
1285 null;
1287 -- Here we give the warning if referenced and no pragma
1288 -- Unreferenced or Unmodified is present.
1290 elsif Referenced (E1)
1291 and then not Has_Unreferenced (E1)
1292 and then not Has_Unmodified (E1)
1293 and then not Warnings_Off_E1
1294 and then not Has_Junk_Name (E1)
1295 then
1296 Error_Msg_N -- CODEFIX
1297 ("?k?& is not modified, could be declared constant!",
1298 E1);
1299 end if;
1301 -- Other cases of a variable or parameter never set in source
1303 elsif Never_Set_In_Source_Check_Spec (E1)
1305 -- No warning if address taken somewhere
1307 and then not Address_Taken (E1)
1309 -- No warning if explicit initial value
1311 and then not Has_Initial_Value (E1)
1313 -- No warning for generic package spec entities, since we
1314 -- might set them in a child unit or something like that
1316 and then not Generic_Package_Spec_Entity (E1)
1318 -- No warning if fully initialized type, except that for
1319 -- this purpose we do not consider access types to qualify
1320 -- as fully initialized types (relying on an access type
1321 -- variable being null when it is never set is a bit odd).
1323 -- Also we generate warning for an out parameter that is
1324 -- never referenced, since again it seems odd to rely on
1325 -- default initialization to set an out parameter value.
1327 and then (Is_Access_Type (E1T)
1328 or else Ekind (E1) = E_Out_Parameter
1329 or else not Is_Fully_Initialized_Type (E1T))
1330 then
1331 -- Do not output complaint about never being assigned a
1332 -- value if a pragma Unmodified applies to the variable
1333 -- we are examining, or if it is a parameter, if there is
1334 -- a pragma Unreferenced for the corresponding spec, or
1335 -- if the type is marked as having unreferenced objects.
1336 -- The last is a little peculiar, but better too few than
1337 -- too many warnings in this situation.
1339 if Has_Pragma_Unreferenced_Objects (E1T)
1340 or else Has_Pragma_Unmodified_Check_Spec (E1)
1341 then
1342 null;
1344 -- IN OUT parameter case where parameter is referenced. We
1345 -- separate this out, since this is the case where we delay
1346 -- output of the warning until more information is available
1347 -- (about use in an instantiation or address being taken).
1349 elsif Ekind (E1) = E_In_Out_Parameter
1350 and then Referenced_Check_Spec (E1)
1351 then
1352 -- Suppress warning if private type, and the procedure
1353 -- has a separate declaration in a different unit. This
1354 -- is the case where the client of a package sees only
1355 -- the private type, and it may be quite reasonable
1356 -- for the logical view to be IN OUT, even if the
1357 -- implementation ends up using access types or some
1358 -- other method to achieve the local effect of a
1359 -- modification. On the other hand if the spec and body
1360 -- are in the same unit, we are in the package body and
1361 -- there we have less excuse for a junk IN OUT parameter.
1363 if Has_Private_Declaration (E1T)
1364 and then Present (Spec_Entity (E1))
1365 and then not In_Same_Source_Unit (E1, Spec_Entity (E1))
1366 then
1367 null;
1369 -- Suppress warning for any parameter of a dispatching
1370 -- operation, since it is quite reasonable to have an
1371 -- operation that is overridden, and for some subclasses
1372 -- needs the formal to be IN OUT and for others happens
1373 -- not to assign it.
1375 elsif Is_Dispatching_Operation
1376 (Scope (Goto_Spec_Entity (E1)))
1377 then
1378 null;
1380 -- Suppress warning if composite type contains any access
1381 -- component, since the logical effect of modifying a
1382 -- parameter may be achieved by modifying a referenced
1383 -- object. This rationale does not apply to private
1384 -- types, so we warn in that case.
1386 elsif Is_Composite_Type (E1T)
1387 and then not Is_Private_Type (E1T)
1388 and then Has_Access_Values (E1T)
1389 then
1390 null;
1392 -- Suppress warning on formals of an entry body. All
1393 -- references are attached to the formal in the entry
1394 -- declaration, which are marked Is_Entry_Formal.
1396 elsif Ekind (Scope (E1)) = E_Entry
1397 and then not Is_Entry_Formal (E1)
1398 then
1399 null;
1401 -- OK, looks like warning for an IN OUT parameter that
1402 -- could be IN makes sense, but we delay the output of
1403 -- the warning, pending possibly finding out later on
1404 -- that the associated subprogram is used as a generic
1405 -- actual, or its address/access is taken. In these two
1406 -- cases, we suppress the warning because the context may
1407 -- force use of IN OUT, even if in this particular case
1408 -- the formal is not modified.
1410 elsif Warn_On_No_Value_Assigned then
1411 -- Suppress the warnings for a junk name
1413 if not Has_Junk_Name (E1) then
1414 In_Out_Warnings.Append (E1);
1415 end if;
1416 end if;
1418 -- Other cases of formals
1420 elsif Is_Formal (E1) then
1421 if not Is_Trivial_Subprogram (Scope (E1)) then
1422 if Referenced_Check_Spec (E1) then
1423 if not Has_Pragma_Unmodified_Check_Spec (E1)
1424 and then not Warnings_Off_E1
1425 and then not Has_Junk_Name (E1)
1426 and then Warn_On_No_Value_Assigned
1427 then
1428 Output_Reference_Error
1429 ("?v?formal parameter& is read but "
1430 & "never assigned!");
1431 end if;
1433 elsif not Has_Pragma_Unreferenced_Check_Spec (E1)
1434 and then not Warnings_Off_E1
1435 and then not Has_Junk_Name (E1)
1436 and then Check_Unreferenced_Formals
1437 then
1438 Output_Reference_Error
1439 ("?f?formal parameter& is not referenced!");
1440 end if;
1441 end if;
1443 -- Case of variable
1445 else
1446 if Referenced (E1) then
1447 if Warn_On_No_Value_Assigned
1448 and then not Has_Unmodified (E1)
1449 and then not Warnings_Off_E1
1450 and then not Has_Junk_Name (E1)
1451 then
1452 if not Type_OK_For_No_Value_Assigned (E1T) then
1453 Output_Reference_Error
1454 ("?v?variable& is read but never assigned!");
1455 end if;
1457 May_Need_Initialized_Actual (E1);
1458 end if;
1460 elsif Check_Unreferenced
1461 and then not Has_Unreferenced (E1)
1462 and then not Warnings_Off_E1
1463 and then not Has_Junk_Name (E1)
1464 then
1465 Output_Reference_Error -- CODEFIX
1466 ("?u?variable& is never read and never assigned!");
1467 end if;
1469 -- Deal with special case where this variable is hidden
1470 -- by a loop variable.
1472 if Ekind (E1) = E_Variable
1473 and then Present (Hiding_Loop_Variable (E1))
1474 and then not Warnings_Off_E1
1475 and then Warn_On_Hiding
1476 then
1477 Error_Msg_N
1478 ("?h?for loop implicitly declares loop variable!",
1479 Hiding_Loop_Variable (E1));
1481 Error_Msg_Sloc := Sloc (E1);
1482 Error_Msg_N
1483 ("\?h?declaration hides & declared#!",
1484 Hiding_Loop_Variable (E1));
1485 end if;
1486 end if;
1488 goto Continue;
1489 end if;
1491 -- Check for unset reference
1493 if Warn_On_No_Value_Assigned
1494 and then Present (UR)
1495 and then not Type_OK_For_No_Value_Assigned (E1T)
1496 then
1497 -- Don't issue warning if appearing inside Initial_Condition
1498 -- pragma or aspect, since that expression is not evaluated
1499 -- at the point where it occurs in the source.
1501 if In_Pragma_Expression (UR, Name_Initial_Condition) then
1502 goto Continue;
1503 end if;
1505 -- Here we issue the warning, all checks completed
1507 -- If we have a return statement, this was a case of an OUT
1508 -- parameter not being set at the time of the return. (Note:
1509 -- it can't be N_Extended_Return_Statement, because those
1510 -- are only for functions, and functions do not allow OUT
1511 -- parameters.)
1513 if not Is_Trivial_Subprogram (Scope (E1)) then
1514 if Nkind (UR) = N_Simple_Return_Statement
1515 and then not Has_Pragma_Unmodified_Check_Spec (E1)
1516 then
1517 if not Warnings_Off_E1
1518 and then not Has_Junk_Name (E1)
1519 then
1520 Error_Msg_NE
1521 ("?v?OUT parameter& not set before return",
1522 UR, E1);
1523 end if;
1525 -- If the unset reference is a selected component
1526 -- prefix from source, mention the component as well.
1527 -- If the selected component comes from expansion, all
1528 -- we know is that the entity is not fully initialized
1529 -- at the point of the reference. Locate a random
1530 -- uninitialized component to get a better message.
1532 elsif Nkind (Parent (UR)) = N_Selected_Component then
1533 -- Suppress possibly superfluous warning if component
1534 -- is known to exist and is partially initialized.
1536 if not Has_Discriminants (Etype (E1))
1537 and then
1538 Is_Partially_Initialized_Type
1539 (Etype (Parent (UR)), False)
1540 then
1541 goto Continue;
1542 end if;
1544 Error_Msg_Node_2 := Selector_Name (Parent (UR));
1546 if not Comes_From_Source (Parent (UR)) then
1547 declare
1548 Comp : Entity_Id;
1550 begin
1551 Comp := First_Component (E1T);
1552 while Present (Comp) loop
1553 if Nkind (Parent (Comp)) =
1554 N_Component_Declaration
1555 and then No (Expression (Parent (Comp)))
1556 then
1557 Error_Msg_Node_2 := Comp;
1558 exit;
1559 end if;
1561 Next_Component (Comp);
1562 end loop;
1563 end;
1564 end if;
1566 -- Issue proper warning. This is a case of referencing
1567 -- a variable before it has been explicitly assigned.
1568 -- For access types, UR was only set for dereferences,
1569 -- so the issue is that the value may be null.
1571 if not Warnings_Off_E1 then
1572 if Is_Access_Type (Etype (Parent (UR))) then
1573 Error_Msg_N ("??`&.&` may be null!", UR);
1574 else
1575 Error_Msg_N
1576 ("??`&.&` may be referenced before "
1577 & "it has a value!", UR);
1578 end if;
1579 end if;
1581 -- All other cases of unset reference active
1583 elsif not Warnings_Off_E1 then
1584 Error_Msg_N
1585 ("??& may be referenced before it has a value!", UR);
1586 end if;
1587 end if;
1589 goto Continue;
1591 end if;
1592 end if;
1594 -- Then check for unreferenced entities. Note that we are only
1595 -- interested in entities whose Referenced flag is not set.
1597 if not Referenced_Check_Spec (E1)
1599 -- If Referenced_As_LHS is set, then that's still interesting
1600 -- (potential "assigned but never read" case), but not if we
1601 -- have pragma Unreferenced, which cancels this warning.
1603 and then (not Referenced_As_LHS_Check_Spec (E1)
1604 or else not Has_Unreferenced (E1))
1606 -- Check that warnings on unreferenced entities are enabled
1608 and then
1609 ((Check_Unreferenced and then not Is_Formal (E1))
1611 -- Case of warning on unreferenced formal
1613 or else (Check_Unreferenced_Formals and then Is_Formal (E1))
1615 -- Case of warning on unread variables modified by an
1616 -- assignment, or an OUT parameter if it is the only one.
1618 or else (Warn_On_Modified_Unread
1619 and then Referenced_As_LHS_Check_Spec (E1))
1621 -- Case of warning on any unread OUT parameter (note such
1622 -- indications are only set if the appropriate warning
1623 -- options were set, so no need to recheck here.)
1625 or else Referenced_As_Out_Parameter_Check_Spec (E1))
1627 -- All other entities, including local packages that cannot be
1628 -- referenced from elsewhere, including those declared within a
1629 -- package body.
1631 and then (Is_Object (E1)
1632 or else Is_Type (E1)
1633 or else Ekind (E1) = E_Label
1634 or else Ekind (E1) in E_Exception
1635 | E_Named_Integer
1636 | E_Named_Real
1637 or else Is_Overloadable (E1)
1639 -- Package case, if the main unit is a package spec
1640 -- or generic package spec, then there may be a
1641 -- corresponding body that references this package
1642 -- in some other file. Otherwise we can be sure
1643 -- that there is no other reference.
1645 or else
1646 (Ekind (E1) = E_Package
1647 and then
1648 not Is_Package_Or_Generic_Package
1649 (Cunit_Entity (Current_Sem_Unit))))
1651 -- Consider private type referenced if full view is referenced.
1652 -- If there is not full view, this is a generic type on which
1653 -- warnings are also useful.
1655 and then
1656 not (Is_Private_Type (E1)
1657 and then Present (Full_View (E1))
1658 and then Referenced (Full_View (E1)))
1660 -- Don't worry about full view, only about private type
1662 and then not Has_Private_Declaration (E1)
1664 -- Eliminate dispatching operations from consideration, we
1665 -- cannot tell if these are referenced or not in any easy
1666 -- manner (note this also catches Adjust/Finalize/Initialize).
1668 and then not Is_Dispatching_Operation (E1)
1670 -- Check entity that can be publicly referenced (we do not give
1671 -- messages for such entities, since there could be other
1672 -- units, not involved in this compilation, that contain
1673 -- relevant references.
1675 and then not Publicly_Referenceable (E1)
1677 -- Class wide types are marked as source entities, but they are
1678 -- not really source entities, and are always created, so we do
1679 -- not care if they are not referenced.
1681 and then Ekind (E1) /= E_Class_Wide_Type
1683 -- Objects other than parameters of task types are allowed to
1684 -- be non-referenced, since they start up tasks.
1686 and then ((Ekind (E1) /= E_Variable
1687 and then Ekind (E1) /= E_Constant
1688 and then Ekind (E1) /= E_Component)
1690 -- Check that E1T is not a task or a composite type
1691 -- with a task component.
1693 or else not Has_Task (E1T))
1695 -- For subunits, only place warnings on the main unit itself,
1696 -- since parent units are not completely compiled.
1698 and then (Nkind (Unit (Cunit (Main_Unit))) /= N_Subunit
1699 or else Get_Source_Unit (E1) = Main_Unit)
1701 -- No warning on a return object, because these are often
1702 -- created with a single expression and an implicit return.
1703 -- If the object is a variable there will be a warning
1704 -- indicating that it could be declared constant.
1706 and then not
1707 (Ekind (E1) = E_Constant and then Is_Return_Object (E1))
1708 then
1709 -- Suppress warnings in internal units if not in -gnatg mode
1710 -- (these would be junk warnings for an applications program,
1711 -- since they refer to problems in internal units).
1713 if GNAT_Mode or else not In_Internal_Unit (E1) then
1714 -- We do not immediately flag the error. This is because we
1715 -- have not expanded generic bodies yet, and they may have
1716 -- the missing reference. So instead we park the entity on a
1717 -- list, for later processing. However for the case of an
1718 -- accept statement we want to output messages now, since
1719 -- we know we already have all information at hand, and we
1720 -- also want to have separate warnings for each accept
1721 -- statement for the same entry.
1723 if Present (Anod) then
1724 pragma Assert (Is_Formal (E1));
1726 -- The unreferenced entity is E1, but post the warning
1727 -- on the body entity for this accept statement.
1729 if not Warnings_Off_E1 then
1730 Warn_On_Unreferenced_Entity
1731 (E1, Body_Formal (E1, Accept_Statement => Anod));
1732 end if;
1734 elsif not Warnings_Off_E1
1735 and then not Has_Junk_Name (E1)
1736 then
1737 if Is_Formal (E1)
1738 and then Nkind (Unit_Declaration_Node (Scope (E1)))
1739 = N_Generic_Subprogram_Declaration
1740 then
1741 Unreferenced_Entities.Append
1742 (Generic_Body_Formal (E1));
1743 else
1744 Unreferenced_Entities.Append (E1);
1745 end if;
1746 end if;
1747 end if;
1749 -- Generic units are referenced in the generic body, but if they
1750 -- are not public and never instantiated we want to force a
1751 -- warning on them. We treat them as redundant constructs to
1752 -- minimize noise.
1754 elsif Is_Generic_Subprogram (E1)
1755 and then not Is_Instantiated (E1)
1756 and then not Publicly_Referenceable (E1)
1757 and then Warn_On_Redundant_Constructs
1758 then
1759 if not Warnings_Off_E1 and then not Has_Junk_Name (E1) then
1760 Unreferenced_Entities.Append (E1);
1762 -- Force warning on entity
1764 Set_Referenced (E1, False);
1765 end if;
1766 end if;
1767 end if;
1769 -- Recurse into nested package or block. Do not recurse into a formal
1770 -- package, because the corresponding body is not analyzed.
1772 <<Continue>>
1773 if (Is_Package_Or_Generic_Package (E1)
1774 and then Nkind (Parent (E1)) = N_Package_Specification
1775 and then
1776 Nkind (Original_Node (Unit_Declaration_Node (E1))) /=
1777 N_Formal_Package_Declaration)
1779 or else Ekind (E1) = E_Block
1780 then
1781 Check_References (E1);
1782 end if;
1784 Next_Entity (E1);
1785 end loop;
1786 end Check_References;
1788 ---------------------------
1789 -- Check_Unset_Reference --
1790 ---------------------------
1792 procedure Check_Unset_Reference (N : Node_Id) is
1793 Typ : constant Entity_Id := Etype (N);
1795 function Is_OK_Fully_Initialized return Boolean;
1796 -- This function returns true if the given node N is fully initialized
1797 -- so that the reference is safe as far as this routine is concerned.
1798 -- Safe generally means that the type of N is a fully initialized type.
1799 -- The one special case is that for access types, which are always fully
1800 -- initialized, we don't consider a dereference OK since it will surely
1801 -- be dereferencing a null value, which won't do.
1803 function Prefix_Has_Dereference (Pref : Node_Id) return Boolean;
1804 -- Used to test indexed or selected component or slice to see if the
1805 -- evaluation of the prefix depends on a dereference, and if so, returns
1806 -- True, in which case we always check the prefix, even if we know that
1807 -- the referenced component is initialized. Pref is the prefix to test.
1809 -----------------------------
1810 -- Is_OK_Fully_Initialized --
1811 -----------------------------
1813 function Is_OK_Fully_Initialized return Boolean is
1814 begin
1815 if Is_Access_Type (Typ) and then Is_Dereferenced (N) then
1816 return False;
1818 -- A type subject to pragma Default_Initial_Condition may be fully
1819 -- default initialized depending on inheritance and the argument of
1820 -- the pragma (SPARK RM 3.1 and SPARK RM 7.3.3).
1822 elsif Has_Fully_Default_Initializing_DIC_Pragma (Typ) then
1823 return True;
1825 else
1826 return Is_Fully_Initialized_Type (Typ);
1827 end if;
1828 end Is_OK_Fully_Initialized;
1830 ----------------------------
1831 -- Prefix_Has_Dereference --
1832 ----------------------------
1834 function Prefix_Has_Dereference (Pref : Node_Id) return Boolean is
1835 begin
1836 -- If prefix is of an access type, it certainly needs a dereference
1838 if Is_Access_Type (Etype (Pref)) then
1839 return True;
1841 -- If prefix is explicit dereference, that's a dereference for sure
1843 elsif Nkind (Pref) = N_Explicit_Dereference then
1844 return True;
1846 -- If prefix is itself a component reference or slice check prefix
1848 elsif Nkind (Pref) = N_Slice
1849 or else Nkind (Pref) = N_Indexed_Component
1850 or else Nkind (Pref) = N_Selected_Component
1851 then
1852 return Prefix_Has_Dereference (Prefix (Pref));
1854 -- All other cases do not involve a dereference
1856 else
1857 return False;
1858 end if;
1859 end Prefix_Has_Dereference;
1861 -- Start of processing for Check_Unset_Reference
1863 begin
1864 -- Nothing to do if warnings suppressed
1866 if Warning_Mode = Suppress then
1867 return;
1868 end if;
1870 -- Ignore reference unless it comes from source. Almost always if we
1871 -- have a reference from generated code, it is bogus (e.g. calls to init
1872 -- procs to set default discriminant values).
1874 if not Comes_From_Source (Original_Node (N)) then
1875 return;
1876 end if;
1878 -- Otherwise see what kind of node we have. If the entity already has an
1879 -- unset reference, it is not necessarily the earliest in the text,
1880 -- because resolution of the prefix of selected components is completed
1881 -- before the resolution of the selected component itself. As a result,
1882 -- given (R /= null and then R.X > 0), the occurrences of R are examined
1883 -- in right-to-left order. If there is already an unset reference, we
1884 -- check whether N is earlier before proceeding.
1886 case Nkind (N) is
1888 -- For identifier or expanded name, examine the entity involved
1890 when N_Expanded_Name
1891 | N_Identifier
1893 declare
1894 E : constant Entity_Id := Entity (N);
1896 begin
1897 if Ekind (E) in E_Variable | E_Out_Parameter
1898 and then Never_Set_In_Source_Check_Spec (E)
1899 and then not Has_Initial_Value (E)
1900 and then (No (Unset_Reference (E))
1901 or else
1902 Earlier_In_Extended_Unit
1903 (N, Unset_Reference (E)))
1904 and then not Has_Pragma_Unmodified_Check_Spec (E)
1905 and then not Warnings_Off_Check_Spec (E)
1906 and then not Has_Junk_Name (E)
1907 then
1908 -- We may have an unset reference. The first test is whether
1909 -- this is an access to a discriminant of a record or a
1910 -- component with default initialization. Both of these
1911 -- cases can be ignored, since the actual object that is
1912 -- referenced is definitely initialized. Note that this
1913 -- covers the case of reading discriminants of an OUT
1914 -- parameter, which is OK even in Ada 83.
1916 -- Note that we are only interested in a direct reference to
1917 -- a record component here. If the reference is through an
1918 -- access type, then the access object is being referenced,
1919 -- not the record, and still deserves an unset reference.
1921 if Nkind (Parent (N)) = N_Selected_Component
1922 and not Is_Access_Type (Typ)
1923 then
1924 declare
1925 ES : constant Entity_Id :=
1926 Entity (Selector_Name (Parent (N)));
1927 begin
1928 if Ekind (ES) = E_Discriminant
1929 or else
1930 (Present (Declaration_Node (ES))
1931 and then
1932 Present (Expression (Declaration_Node (ES))))
1933 then
1934 return;
1935 end if;
1936 end;
1937 end if;
1939 -- Exclude fully initialized types
1941 if Is_OK_Fully_Initialized then
1942 return;
1943 end if;
1945 -- Here we have a potential unset reference. But before we
1946 -- get worried about it, we have to make sure that the
1947 -- entity declaration is in the same procedure as the
1948 -- reference, since if they are in separate procedures, then
1949 -- we have no idea about sequential execution.
1951 -- The tests in the loop below catch all such cases, but do
1952 -- allow the reference to appear in a loop, block, or
1953 -- package spec that is nested within the declaring scope.
1954 -- As always, it is possible to construct cases where the
1955 -- warning is wrong, that is why it is a warning.
1957 Potential_Unset_Reference : declare
1958 SR : Entity_Id;
1959 SE : constant Entity_Id := Scope (E);
1961 function Within_Contract_Or_Predicate return Boolean;
1962 -- Returns True if N is within a contract or predicate,
1963 -- an Ensures component in a Test_Case, or a
1964 -- Contract_Cases.
1966 ----------------------------------
1967 -- Within_Contract_Or_Predicate --
1968 ----------------------------------
1970 function Within_Contract_Or_Predicate return Boolean is
1971 Nod, P : Node_Id;
1973 begin
1974 Nod := Parent (N);
1975 while Present (Nod) loop
1976 -- General contract / predicate related pragma
1978 if Nkind (Nod) = N_Pragma
1979 and then
1980 Pragma_Name_Unmapped (Nod)
1981 in Name_Precondition
1982 | Name_Postcondition
1983 | Name_Refined_Post
1984 | Name_Contract_Cases
1985 then
1986 return True;
1988 -- Verify we are not within a generated predicate
1989 -- function call.
1991 elsif Nkind (Nod) = N_Function_Call
1992 and then Is_Entity_Name (Name (Nod))
1993 and then Is_Predicate_Function
1994 (Entity (Name (Nod)))
1995 then
1996 return True;
1998 -- Deal with special 'Ensures' Test_Case component
2000 elsif Present (Parent (Nod)) then
2001 P := Parent (Nod);
2003 if Nkind (P) = N_Pragma
2004 and then Pragma_Name (P) = Name_Test_Case
2005 and then Nod = Test_Case_Arg (P, Name_Ensures)
2006 then
2007 return True;
2008 end if;
2010 -- Prevent the search from going too far
2012 elsif Is_Body_Or_Package_Declaration (Nod) then
2013 exit;
2014 end if;
2016 Nod := Parent (Nod);
2017 end loop;
2019 return False;
2020 end Within_Contract_Or_Predicate;
2022 -- Start of processing for Potential_Unset_Reference
2024 begin
2025 SR := Current_Scope;
2026 while SR /= SE loop
2027 if SR = Standard_Standard
2028 or else Is_Subprogram (SR)
2029 or else Is_Concurrent_Body (SR)
2030 or else Is_Concurrent_Type (SR)
2031 then
2032 return;
2033 end if;
2035 SR := Scope (SR);
2036 end loop;
2038 -- Case of reference has an access type. This is a
2039 -- special case since access types are always set to null
2040 -- so cannot be truly uninitialized, but we still want to
2041 -- warn about cases of obvious null dereference.
2043 if Is_Access_Type (Typ) then
2044 Access_Type_Case : declare
2045 P : Node_Id;
2047 function Process
2048 (N : Node_Id) return Traverse_Result;
2049 -- Process function for instantiation of Traverse
2050 -- below. Checks if N contains reference to E other
2051 -- than a dereference.
2053 function Ref_In (Nod : Node_Id) return Boolean;
2054 -- Determines whether Nod contains a reference to
2055 -- the entity E that is not a dereference.
2057 -------------
2058 -- Process --
2059 -------------
2061 function Process
2062 (N : Node_Id) return Traverse_Result
2064 begin
2065 if Is_Entity_Name (N)
2066 and then Entity (N) = E
2067 and then not Is_Dereferenced (N)
2068 then
2069 return Abandon;
2070 else
2071 return OK;
2072 end if;
2073 end Process;
2075 ------------
2076 -- Ref_In --
2077 ------------
2079 function Ref_In (Nod : Node_Id) return Boolean is
2080 function Traverse is new Traverse_Func (Process);
2081 begin
2082 return Traverse (Nod) = Abandon;
2083 end Ref_In;
2085 -- Start of processing for Access_Type_Case
2087 begin
2088 -- Don't bother if we are inside an instance, since
2089 -- the compilation of the generic template is where
2090 -- the warning should be issued.
2092 if In_Instance then
2093 return;
2094 end if;
2096 -- Don't bother if this is not the main unit. If we
2097 -- try to give this warning for with'ed units, we
2098 -- get some false positives, since we do not record
2099 -- references in other units.
2101 if not In_Extended_Main_Source_Unit (E)
2102 or else
2103 not In_Extended_Main_Source_Unit (N)
2104 then
2105 return;
2106 end if;
2108 -- We are only interested in dereferences
2110 if not Is_Dereferenced (N) then
2111 return;
2112 end if;
2114 -- One more check, don't bother with references
2115 -- that are inside conditional statements or WHILE
2116 -- loops if the condition references the entity in
2117 -- question. This avoids most false positives.
2119 P := Parent (N);
2120 loop
2121 P := Parent (P);
2122 exit when No (P);
2124 if Nkind (P) in N_If_Statement | N_Elsif_Part
2125 and then Ref_In (Condition (P))
2126 then
2127 return;
2129 elsif Nkind (P) = N_Loop_Statement
2130 and then Present (Iteration_Scheme (P))
2131 and then
2132 Ref_In (Condition (Iteration_Scheme (P)))
2133 then
2134 return;
2135 end if;
2136 end loop;
2137 end Access_Type_Case;
2138 end if;
2140 -- One more check, don't bother if we are within a
2141 -- postcondition, since the expression occurs in a
2142 -- place unrelated to the actual test.
2144 if not Within_Contract_Or_Predicate then
2146 -- Here we definitely have a case for giving a warning
2147 -- for a reference to an unset value. But we don't
2148 -- give the warning now. Instead set Unset_Reference
2149 -- in the identifier involved. The reason for this is
2150 -- that if we find the variable is never ever assigned
2151 -- a value then that warning is more important and
2152 -- there is no point in giving the reference warning.
2154 -- If this is an identifier, set the field directly
2156 if Nkind (N) = N_Identifier then
2157 Set_Unset_Reference (E, N);
2159 -- Otherwise it is an expanded name, so set the field
2160 -- of the actual identifier for the reference.
2162 else
2163 Set_Unset_Reference (E, Selector_Name (N));
2164 end if;
2165 end if;
2166 end Potential_Unset_Reference;
2167 end if;
2168 end;
2170 -- Indexed component or slice
2172 when N_Indexed_Component
2173 | N_Slice
2175 -- If prefix does not involve dereferencing an access type, then
2176 -- we know we are OK if the component type is fully initialized,
2177 -- since the component will have been set as part of the default
2178 -- initialization.
2180 if not Prefix_Has_Dereference (Prefix (N))
2181 and then Is_OK_Fully_Initialized
2182 then
2183 return;
2185 -- Look at prefix in access type case, or if the component is not
2186 -- fully initialized.
2188 else
2189 Check_Unset_Reference (Prefix (N));
2190 end if;
2192 -- Record component
2194 when N_Selected_Component =>
2195 declare
2196 Pref : constant Node_Id := Prefix (N);
2197 Ent : constant Entity_Id := Entity (Selector_Name (N));
2199 begin
2200 -- If prefix involves dereferencing an access type, always
2201 -- check the prefix, since the issue then is whether this
2202 -- access value is null.
2204 if Prefix_Has_Dereference (Pref) then
2205 null;
2207 -- Always go to prefix if no selector entity is set. Can this
2208 -- happen in the normal case? Not clear, but it definitely can
2209 -- happen in error cases.
2211 elsif No (Ent) then
2212 null;
2214 -- For a record component, check some cases where we have
2215 -- reasonable cause to consider that the component is known to
2216 -- be or probably is initialized. In this case, we don't care
2217 -- if the prefix itself was explicitly initialized.
2219 -- Discriminants are always considered initialized
2221 elsif Ekind (Ent) = E_Discriminant then
2222 return;
2224 -- An explicitly initialized component is certainly initialized
2226 elsif Nkind (Parent (Ent)) = N_Component_Declaration
2227 and then Present (Expression (Parent (Ent)))
2228 then
2229 return;
2231 -- A fully initialized component is initialized
2233 elsif Is_OK_Fully_Initialized then
2234 return;
2235 end if;
2237 -- If none of those cases apply, check the record type prefix
2239 Check_Unset_Reference (Pref);
2240 end;
2242 -- Type conversions can appear in assignment statements both
2243 -- as variable names and as expressions. We examine their own
2244 -- expressions only when processing their parent node.
2246 when N_Type_Conversion =>
2247 Check_Unset_Reference (Expression (N));
2249 -- For explicit dereference, always check prefix, which will generate
2250 -- an unset reference (since this is a case of dereferencing null).
2252 when N_Explicit_Dereference =>
2253 Check_Unset_Reference (Prefix (N));
2255 -- All other cases are not cases of an unset reference
2257 when others =>
2258 null;
2259 end case;
2260 end Check_Unset_Reference;
2262 ------------------------
2263 -- Check_Unused_Withs --
2264 ------------------------
2266 procedure Check_Unused_Withs (Spec_Unit : Unit_Number_Type := No_Unit) is
2268 Munite : constant Entity_Id := Cunit_Entity (Main_Unit);
2269 -- This is needed for checking the special renaming case
2271 procedure Check_One_Unit (Unit : Unit_Number_Type);
2272 -- Subsidiary procedure, performs checks for specified unit
2274 --------------------
2275 -- Check_One_Unit --
2276 --------------------
2278 procedure Check_One_Unit (Unit : Unit_Number_Type) is
2279 Cnode : constant Node_Id := Cunit (Unit);
2281 Is_Visible_Renaming : Boolean := False;
2283 procedure Check_Inner_Package (Pack : Entity_Id);
2284 -- Pack is a package local to a unit in a with_clause. Both the unit
2285 -- and Pack are referenced. If none of the entities in Pack are
2286 -- referenced, then the only occurrence of Pack is in a USE clause
2287 -- or a pragma, and a warning is worthwhile as well.
2289 function Check_System_Aux (Lunit : Entity_Id) return Boolean;
2290 -- Before giving a warning on a with_clause for System, check whether
2291 -- a system extension is present.
2293 function Find_Package_Renaming
2294 (P : Entity_Id;
2295 L : Entity_Id) return Entity_Id;
2296 -- The only reference to a context unit may be in a renaming
2297 -- declaration. If this renaming declares a visible entity, do not
2298 -- warn that the context clause could be moved to the body, because
2299 -- the renaming may be intended to re-export the unit.
2301 function Has_Visible_Entities (P : Entity_Id) return Boolean;
2302 -- This function determines if a package has any visible entities.
2303 -- True is returned if there is at least one declared visible entity,
2304 -- otherwise False is returned (e.g. case of only pragmas present).
2306 -------------------------
2307 -- Check_Inner_Package --
2308 -------------------------
2310 procedure Check_Inner_Package (Pack : Entity_Id) is
2311 E : Entity_Id;
2312 Un : constant Node_Id := Sinfo.Nodes.Unit (Cnode);
2314 function Check_Use_Clause (N : Node_Id) return Traverse_Result;
2315 -- If N is a use_clause for Pack, emit warning
2317 procedure Check_Use_Clauses is new
2318 Traverse_Proc (Check_Use_Clause);
2320 ----------------------
2321 -- Check_Use_Clause --
2322 ----------------------
2324 function Check_Use_Clause (N : Node_Id) return Traverse_Result is
2325 begin
2326 if Nkind (N) = N_Use_Package_Clause
2327 and then Entity (Name (N)) = Pack
2328 then
2329 -- Suppress message if any serious errors detected that turn
2330 -- off expansion, and thus result in false positives for
2331 -- this warning.
2333 if Serious_Errors_Detected = 0 then
2334 Error_Msg_Qual_Level := 1;
2335 Error_Msg_NE -- CODEFIX
2336 ("?u?no entities of package& are referenced!",
2337 Name (N), Pack);
2338 Error_Msg_Qual_Level := 0;
2339 end if;
2340 end if;
2342 return OK;
2343 end Check_Use_Clause;
2345 -- Start of processing for Check_Inner_Package
2347 begin
2348 E := First_Entity (Pack);
2349 while Present (E) loop
2350 if Referenced_Check_Spec (E) then
2351 return;
2352 end if;
2354 Next_Entity (E);
2355 end loop;
2357 -- No entities of the package are referenced. Check whether the
2358 -- reference to the package itself is a use clause, and if so
2359 -- place a warning on it.
2361 Check_Use_Clauses (Un);
2362 end Check_Inner_Package;
2364 ----------------------
2365 -- Check_System_Aux --
2366 ----------------------
2368 function Check_System_Aux (Lunit : Entity_Id) return Boolean is
2369 Ent : Entity_Id;
2371 begin
2372 if Chars (Lunit) = Name_System
2373 and then Scope (Lunit) = Standard_Standard
2374 and then Present_System_Aux
2375 then
2376 Ent := First_Entity (System_Aux_Id);
2377 while Present (Ent) loop
2378 if Referenced_Check_Spec (Ent) then
2379 return True;
2380 end if;
2382 Next_Entity (Ent);
2383 end loop;
2384 end if;
2386 return False;
2387 end Check_System_Aux;
2389 ---------------------------
2390 -- Find_Package_Renaming --
2391 ---------------------------
2393 function Find_Package_Renaming
2394 (P : Entity_Id;
2395 L : Entity_Id) return Entity_Id
2397 E1 : Entity_Id;
2398 R : Entity_Id;
2400 begin
2401 Is_Visible_Renaming := False;
2403 E1 := First_Entity (P);
2404 while Present (E1) loop
2405 if Ekind (E1) = E_Package and then Renamed_Entity (E1) = L then
2406 Is_Visible_Renaming := not Is_Hidden (E1);
2407 return E1;
2409 elsif Ekind (E1) = E_Package
2410 and then No (Renamed_Entity (E1))
2411 and then not Is_Generic_Instance (E1)
2412 then
2413 R := Find_Package_Renaming (E1, L);
2415 if Present (R) then
2416 Is_Visible_Renaming := not Is_Hidden (R);
2417 return R;
2418 end if;
2419 end if;
2421 Next_Entity (E1);
2422 end loop;
2424 return Empty;
2425 end Find_Package_Renaming;
2427 --------------------------
2428 -- Has_Visible_Entities --
2429 --------------------------
2431 function Has_Visible_Entities (P : Entity_Id) return Boolean is
2432 E : Entity_Id;
2434 begin
2435 -- If unit in context is not a package, it is a subprogram that
2436 -- is not called or a generic unit that is not instantiated
2437 -- in the current unit, and warning is appropriate.
2439 if Ekind (P) /= E_Package then
2440 return True;
2441 end if;
2443 -- If unit comes from a limited_with clause, look for declaration
2444 -- of shadow entities.
2446 if Present (Limited_View (P)) then
2447 E := First_Entity (Limited_View (P));
2448 else
2449 E := First_Entity (P);
2450 end if;
2452 while Present (E) and then E /= First_Private_Entity (P) loop
2453 if Comes_From_Source (E) or else Present (Limited_View (P)) then
2454 return True;
2455 end if;
2457 Next_Entity (E);
2458 end loop;
2460 return False;
2461 end Has_Visible_Entities;
2463 -- Local variables
2465 Ent : Entity_Id;
2466 Item : Node_Id;
2467 Lunit : Entity_Id;
2468 Pack : Entity_Id;
2470 -- Start of processing for Check_One_Unit
2472 begin
2473 -- Only do check in units that are part of the extended main unit.
2474 -- This is actually a necessary restriction, because in the case of
2475 -- subprogram acting as its own specification, there can be with's in
2476 -- subunits that we will not see.
2478 if not In_Extended_Main_Source_Unit (Cnode) then
2479 return;
2480 end if;
2482 -- Loop through context items in this unit
2484 Item := First (Context_Items (Cnode));
2485 while Present (Item) loop
2486 if Nkind (Item) = N_With_Clause
2487 and then not Implicit_With (Item)
2488 and then In_Extended_Main_Source_Unit (Item)
2490 -- Guard for no entity present. Not clear under what conditions
2491 -- this happens, but it does occur, and since this is only a
2492 -- warning, we just suppress the warning in this case.
2494 and then Nkind (Name (Item)) in N_Has_Entity
2495 and then Present (Entity (Name (Item)))
2496 then
2497 Lunit := Entity (Name (Item));
2499 -- Check if this unit is referenced (skip the check if this
2500 -- is explicitly marked by a pragma Unreferenced).
2502 if not Referenced (Lunit) and then not Has_Unreferenced (Lunit)
2503 then
2504 -- Suppress warnings in internal units if not in -gnatg mode
2505 -- (these would be junk warnings for an application program,
2506 -- since they refer to problems in internal units).
2508 if GNAT_Mode or else not Is_Internal_Unit (Unit) then
2509 -- Here we definitely have a non-referenced unit. If it
2510 -- is the special call for a spec unit, then just set the
2511 -- flag to be read later.
2513 if Unit = Spec_Unit then
2514 Set_Unreferenced_In_Spec (Item);
2516 -- Otherwise simple unreferenced message, but skip this
2517 -- if no visible entities, because that is most likely a
2518 -- case where warning would be false positive (e.g. a
2519 -- package with only a linker options pragma and nothing
2520 -- else or a pragma elaborate with a body library task).
2522 elsif Has_Visible_Entities (Lunit) then
2523 Error_Msg_N -- CODEFIX
2524 ("?u?unit& is not referenced!", Name (Item));
2525 end if;
2526 end if;
2528 -- If main unit is a renaming of this unit, then we consider
2529 -- the with to be OK (obviously it is needed in this case).
2530 -- This may be transitive: the unit in the with_clause may
2531 -- itself be a renaming, in which case both it and the main
2532 -- unit rename the same ultimate package.
2534 elsif Present (Renamed_Entity (Munite))
2535 and then
2536 (Renamed_Entity (Munite) = Lunit
2537 or else Renamed_Entity (Munite) = Renamed_Entity (Lunit))
2538 then
2539 null;
2541 -- If this unit is referenced, and it is a package, we do
2542 -- another test, to see if any of the entities in the package
2543 -- are referenced. If none of the entities are referenced, we
2544 -- still post a warning. This occurs if the only use of the
2545 -- package is in a use clause, or in a package renaming
2546 -- declaration. This check is skipped for packages that are
2547 -- renamed in a spec, since the entities in such a package are
2548 -- visible to clients via the renaming.
2550 elsif Ekind (Lunit) = E_Package
2551 and then not Renamed_In_Spec (Lunit)
2552 then
2553 -- If Is_Instantiated is set, it means that the package is
2554 -- implicitly instantiated (this is the case of parent
2555 -- instance or an actual for a generic package formal), and
2556 -- this counts as a reference.
2558 if Is_Instantiated (Lunit) then
2559 null;
2561 -- If no entities in package, and there is a pragma
2562 -- Elaborate_Body present, then assume that this with is
2563 -- done for purposes of this elaboration.
2565 elsif No (First_Entity (Lunit))
2566 and then Has_Pragma_Elaborate_Body (Lunit)
2567 then
2568 null;
2570 -- Otherwise see if any entities have been referenced
2572 else
2573 if Limited_Present (Item) then
2574 Ent := First_Entity (Limited_View (Lunit));
2575 else
2576 Ent := First_Entity (Lunit);
2577 end if;
2579 loop
2580 -- No more entities, and we did not find one that was
2581 -- referenced. Means we have a definite case of a with
2582 -- none of whose entities was referenced.
2584 if No (Ent) then
2586 -- If in spec, just set the flag
2588 if Unit = Spec_Unit then
2589 Set_No_Entities_Ref_In_Spec (Item);
2591 elsif Check_System_Aux (Lunit) then
2592 null;
2594 -- Else the warning may be needed
2596 else
2597 -- Warn if we unreferenced flag set and we have
2598 -- not had serious errors. The reason we inhibit
2599 -- the message if there are errors is to prevent
2600 -- false positives from disabling expansion.
2602 if not Has_Unreferenced (Lunit)
2603 and then Serious_Errors_Detected = 0
2604 then
2605 -- Get possible package renaming
2607 Pack := Find_Package_Renaming (Munite, Lunit);
2609 -- No warning if either the package or its
2610 -- renaming is used as a generic actual.
2612 if Used_As_Generic_Actual (Lunit)
2613 or else
2614 (Present (Pack)
2615 and then
2616 Used_As_Generic_Actual (Pack))
2617 then
2618 exit;
2619 end if;
2621 -- Here we give the warning
2623 Error_Msg_N -- CODEFIX
2624 ("?u?no entities of & are referenced!",
2625 Name (Item));
2627 -- Flag renaming of package as well. If
2628 -- the original package has warnings off,
2629 -- we suppress the warning on the renaming
2630 -- as well.
2632 if Present (Pack)
2633 and then not Has_Warnings_Off (Lunit)
2634 and then not Has_Unreferenced (Pack)
2635 then
2636 Error_Msg_NE -- CODEFIX
2637 ("?u?no entities of& are referenced!",
2638 Unit_Declaration_Node (Pack), Pack);
2639 end if;
2640 end if;
2641 end if;
2643 exit;
2645 -- Case of entity being referenced. The reference may
2646 -- come from a limited_with_clause, in which case the
2647 -- limited view of the entity carries the flag.
2649 elsif Referenced_Check_Spec (Ent)
2650 or else Referenced_As_LHS_Check_Spec (Ent)
2651 or else Referenced_As_Out_Parameter_Check_Spec (Ent)
2652 or else
2653 (From_Limited_With (Ent)
2654 and then Is_Incomplete_Type (Ent)
2655 and then Present (Non_Limited_View (Ent))
2656 and then Referenced (Non_Limited_View (Ent)))
2657 then
2658 -- This means that the with is indeed fine, in that
2659 -- it is definitely needed somewhere, and we can
2660 -- quit worrying about this one...
2662 -- Except for one little detail: if either of the
2663 -- flags was set during spec processing, this is
2664 -- where we complain that the with could be moved
2665 -- from the spec. If the spec contains a visible
2666 -- renaming of the package, inhibit warning to move
2667 -- with_clause to body.
2669 if Ekind (Munite) = E_Package_Body then
2670 Pack :=
2671 Find_Package_Renaming
2672 (Spec_Entity (Munite), Lunit);
2673 else
2674 Pack := Empty;
2675 end if;
2677 -- If a renaming is present in the spec do not warn
2678 -- because the body or child unit may depend on it.
2680 if Present (Pack)
2681 and then Renamed_Entity (Pack) = Lunit
2682 then
2683 exit;
2685 elsif Unreferenced_In_Spec (Item) then
2686 Error_Msg_N -- CODEFIX
2687 ("?u?unit& is not referenced in spec!",
2688 Name (Item));
2690 elsif No_Entities_Ref_In_Spec (Item) then
2691 Error_Msg_N -- CODEFIX
2692 ("?u?no entities of & are referenced in spec!",
2693 Name (Item));
2695 else
2696 if Ekind (Ent) = E_Package then
2697 Check_Inner_Package (Ent);
2698 end if;
2700 exit;
2701 end if;
2703 if not Is_Visible_Renaming then
2704 Error_Msg_N -- CODEFIX
2705 ("\?u?with clause might be moved to body!",
2706 Name (Item));
2707 end if;
2709 exit;
2711 -- Move to next entity to continue search
2713 else
2714 Next_Entity (Ent);
2715 end if;
2716 end loop;
2717 end if;
2719 -- For a generic package, the only interesting kind of
2720 -- reference is an instantiation, since entities cannot be
2721 -- referenced directly.
2723 elsif Is_Generic_Unit (Lunit) then
2725 -- Unit was never instantiated, set flag for case of spec
2726 -- call, or give warning for normal call.
2728 if not Is_Instantiated (Lunit) then
2729 if Unit = Spec_Unit then
2730 Set_Unreferenced_In_Spec (Item);
2731 else
2732 Error_Msg_N -- CODEFIX
2733 ("?u?unit& is never instantiated!", Name (Item));
2734 end if;
2736 -- If unit was indeed instantiated, make sure that flag is
2737 -- not set showing it was uninstantiated in the spec, and if
2738 -- so, give warning.
2740 elsif Unreferenced_In_Spec (Item) then
2741 Error_Msg_N
2742 ("?u?unit& is not instantiated in spec!", Name (Item));
2743 Error_Msg_N -- CODEFIX
2744 ("\?u?with clause can be moved to body!", Name (Item));
2745 end if;
2746 end if;
2747 end if;
2749 Next (Item);
2750 end loop;
2751 end Check_One_Unit;
2753 -- Start of processing for Check_Unused_Withs
2755 begin
2756 -- Immediate return if no semantics or warning flag not set
2758 if not Check_Withs or else Operating_Mode = Check_Syntax then
2759 return;
2760 end if;
2762 -- Flag any unused with clauses. For a subunit, check only the units
2763 -- in its context, not those of the parent, which may be needed by other
2764 -- subunits. We will get the full warnings when we compile the parent,
2765 -- but the following is helpful when compiling a subunit by itself.
2767 if Nkind (Unit (Cunit (Main_Unit))) = N_Subunit then
2768 if Current_Sem_Unit = Main_Unit then
2769 Check_One_Unit (Main_Unit);
2770 end if;
2772 return;
2773 end if;
2775 -- Process specified units
2777 if Spec_Unit = No_Unit then
2779 -- For main call, check all units
2781 for Unit in Main_Unit .. Last_Unit loop
2782 Check_One_Unit (Unit);
2783 end loop;
2785 else
2786 -- For call for spec, check only the spec
2788 Check_One_Unit (Spec_Unit);
2789 end if;
2790 end Check_Unused_Withs;
2792 ---------------------------------
2793 -- Generic_Package_Spec_Entity --
2794 ---------------------------------
2796 function Generic_Package_Spec_Entity (E : Entity_Id) return Boolean is
2797 S : Entity_Id;
2799 begin
2800 if Is_Package_Body_Entity (E) then
2801 return False;
2803 else
2804 S := Scope (E);
2805 loop
2806 if S = Standard_Standard then
2807 return False;
2809 elsif Ekind (S) = E_Generic_Package then
2810 return True;
2812 elsif Ekind (S) = E_Package then
2813 S := Scope (S);
2815 else
2816 return False;
2817 end if;
2818 end loop;
2819 end if;
2820 end Generic_Package_Spec_Entity;
2822 ----------------------
2823 -- Goto_Spec_Entity --
2824 ----------------------
2826 function Goto_Spec_Entity (E : Entity_Id) return Entity_Id is
2827 begin
2828 if Is_Formal (E) and then Present (Spec_Entity (E)) then
2829 return Spec_Entity (E);
2830 else
2831 return E;
2832 end if;
2833 end Goto_Spec_Entity;
2835 -------------------
2836 -- Has_Junk_Name --
2837 -------------------
2839 function Has_Junk_Name (E : Entity_Id) return Boolean is
2840 function Match (S : String) return Boolean;
2841 -- Return true if substring S is found in Name_Buffer (1 .. Name_Len)
2843 -----------
2844 -- Match --
2845 -----------
2847 function Match (S : String) return Boolean is
2848 Slen1 : constant Integer := S'Length - 1;
2850 begin
2851 for J in 1 .. Name_Len - S'Length + 1 loop
2852 if Name_Buffer (J .. J + Slen1) = S then
2853 return True;
2854 end if;
2855 end loop;
2857 return False;
2858 end Match;
2860 -- Start of processing for Has_Junk_Name
2862 begin
2863 Get_Unqualified_Decoded_Name_String (Chars (E));
2865 return
2866 Match ("discard") or else
2867 Match ("dummy") or else
2868 Match ("ignore") or else
2869 Match ("junk") or else
2870 Match ("unuse") or else
2871 Match ("tmp") or else
2872 Match ("temp");
2873 end Has_Junk_Name;
2875 --------------------------------------
2876 -- Has_Pragma_Unmodified_Check_Spec --
2877 --------------------------------------
2879 function Has_Pragma_Unmodified_Check_Spec
2880 (E : Entity_Id) return Boolean
2882 begin
2883 if Is_Formal (E) and then Present (Spec_Entity (E)) then
2885 -- Note: use of OR instead of OR ELSE here is deliberate, we want
2886 -- to mess with Unmodified flags on both body and spec entities.
2887 -- Has_Unmodified has side effects!
2889 return Has_Unmodified (E)
2891 Has_Unmodified (Spec_Entity (E));
2893 else
2894 return Has_Unmodified (E);
2895 end if;
2896 end Has_Pragma_Unmodified_Check_Spec;
2898 ----------------------------------------
2899 -- Has_Pragma_Unreferenced_Check_Spec --
2900 ----------------------------------------
2902 function Has_Pragma_Unreferenced_Check_Spec
2903 (E : Entity_Id) return Boolean
2905 begin
2906 if Is_Formal (E) and then Present (Spec_Entity (E)) then
2908 -- Note: use of OR here instead of OR ELSE is deliberate, we want
2909 -- to mess with flags on both entities.
2911 return Has_Unreferenced (E)
2913 Has_Unreferenced (Spec_Entity (E));
2915 else
2916 return Has_Unreferenced (E);
2917 end if;
2918 end Has_Pragma_Unreferenced_Check_Spec;
2920 ----------------
2921 -- Initialize --
2922 ----------------
2924 procedure Initialize is
2925 begin
2926 Warnings_Off_Pragmas.Init;
2927 Unreferenced_Entities.Init;
2928 In_Out_Warnings.Init;
2929 end Initialize;
2931 ---------------------------------------------
2932 -- Is_Attribute_And_Known_Value_Comparison --
2933 ---------------------------------------------
2935 function Is_Attribute_And_Known_Value_Comparison
2936 (Op : Node_Id) return Boolean
2938 Orig_Op : constant Node_Id := Original_Node (Op);
2940 begin
2941 return
2942 Nkind (Orig_Op) in N_Op_Compare
2943 and then Nkind (Original_Node (Left_Opnd (Orig_Op))) =
2944 N_Attribute_Reference
2945 and then Compile_Time_Known_Value (Right_Opnd (Orig_Op));
2946 end Is_Attribute_And_Known_Value_Comparison;
2948 ------------------------------------
2949 -- Never_Set_In_Source_Check_Spec --
2950 ------------------------------------
2952 function Never_Set_In_Source_Check_Spec (E : Entity_Id) return Boolean is
2953 begin
2954 if Is_Formal (E) and then Present (Spec_Entity (E)) then
2955 return Never_Set_In_Source (E)
2956 and then
2957 Never_Set_In_Source (Spec_Entity (E));
2958 else
2959 return Never_Set_In_Source (E);
2960 end if;
2961 end Never_Set_In_Source_Check_Spec;
2963 -------------------------------------
2964 -- Operand_Has_Warnings_Suppressed --
2965 -------------------------------------
2967 function Operand_Has_Warnings_Suppressed (N : Node_Id) return Boolean is
2969 function Check_For_Warnings (N : Node_Id) return Traverse_Result;
2970 -- Function used to check one node to see if it is or was originally
2971 -- a reference to an entity for which Warnings are off. If so, Abandon
2972 -- is returned, otherwise OK_Orig is returned to continue the traversal
2973 -- of the original expression.
2975 function Traverse is new Traverse_Func (Check_For_Warnings);
2976 -- Function used to traverse tree looking for warnings
2978 ------------------------
2979 -- Check_For_Warnings --
2980 ------------------------
2982 function Check_For_Warnings (N : Node_Id) return Traverse_Result is
2983 R : constant Node_Id := Original_Node (N);
2985 begin
2986 if Nkind (R) in N_Has_Entity
2987 and then Present (Entity (R))
2988 and then Has_Warnings_Off (Entity (R))
2989 then
2990 return Abandon;
2991 else
2992 return OK_Orig;
2993 end if;
2994 end Check_For_Warnings;
2996 -- Start of processing for Operand_Has_Warnings_Suppressed
2998 begin
2999 return Traverse (N) = Abandon;
3000 end Operand_Has_Warnings_Suppressed;
3002 -----------------------------------------
3003 -- Output_Non_Modified_In_Out_Warnings --
3004 -----------------------------------------
3006 procedure Output_Non_Modified_In_Out_Warnings is
3008 function Warn_On_In_Out (E : Entity_Id) return Boolean;
3009 -- Given a formal parameter entity E, determines if there is a reason to
3010 -- suppress IN OUT warnings (not modified, could be IN) for formals of
3011 -- the subprogram. We suppress these warnings if Warnings Off is set, or
3012 -- if we have seen the address of the subprogram being taken, or if the
3013 -- subprogram is used as a generic actual (in the latter cases the
3014 -- context may force use of IN OUT, even if the parameter is not
3015 -- modified for this particular case).
3017 --------------------
3018 -- Warn_On_In_Out --
3019 --------------------
3021 function Warn_On_In_Out (E : Entity_Id) return Boolean is
3022 S : constant Entity_Id := Scope (E);
3023 SE : constant Entity_Id := Spec_Entity (E);
3025 begin
3026 -- Do not warn if address is taken, since funny business may be going
3027 -- on in treating the parameter indirectly as IN OUT.
3029 if Address_Taken (S)
3030 or else (Present (SE) and then Address_Taken (Scope (SE)))
3031 then
3032 return False;
3034 -- Do not warn if used as a generic actual, since the generic may be
3035 -- what is forcing the use of an "unnecessary" IN OUT.
3037 elsif Used_As_Generic_Actual (S)
3038 or else (Present (SE) and then Used_As_Generic_Actual (Scope (SE)))
3039 then
3040 return False;
3042 -- Else test warnings off on the subprogram
3044 elsif Warnings_Off (S) then
3045 return False;
3047 -- All tests for suppressing warning failed
3049 else
3050 return True;
3051 end if;
3052 end Warn_On_In_Out;
3054 -- Start of processing for Output_Non_Modified_In_Out_Warnings
3056 begin
3057 -- Loop through entities for which a warning may be needed
3059 for J in In_Out_Warnings.First .. In_Out_Warnings.Last loop
3060 declare
3061 E1 : constant Entity_Id := In_Out_Warnings.Table (J);
3063 begin
3064 -- Suppress warning in specific cases (see details in comments for
3065 -- No_Warn_On_In_Out).
3067 if Warn_On_In_Out (E1) then
3068 -- If -gnatwk is set then output message that it could be IN
3070 if not Is_Trivial_Subprogram (Scope (E1)) then
3071 if Warn_On_Constant then
3072 Error_Msg_N
3073 ("?k?formal parameter & is not modified!", E1);
3074 Error_Msg_N
3075 ("\?k?mode could be IN instead of `IN OUT`!", E1);
3077 -- We do not generate warnings for IN OUT parameters
3078 -- unless we have at least -gnatwu. This is deliberately
3079 -- inconsistent with the treatment of variables, but
3080 -- otherwise we get too many unexpected warnings in
3081 -- default mode.
3083 elsif Check_Unreferenced then
3084 Error_Msg_N
3085 ("?u?formal parameter& is read but "
3086 & "never assigned!", E1);
3087 end if;
3088 end if;
3090 -- Kill any other warnings on this entity, since this is the
3091 -- one that should dominate any other unreferenced warning.
3093 Set_Warnings_Off (E1);
3094 end if;
3095 end;
3096 end loop;
3097 end Output_Non_Modified_In_Out_Warnings;
3099 ----------------------------------------
3100 -- Output_Obsolescent_Entity_Warnings --
3101 ----------------------------------------
3103 procedure Output_Obsolescent_Entity_Warnings (N : Node_Id; E : Entity_Id) is
3104 P : constant Node_Id := Parent (N);
3105 S : Entity_Id;
3107 begin
3108 S := Current_Scope;
3110 -- Do not output message if we are the scope of standard. This means
3111 -- we have a reference from a context clause from when it is originally
3112 -- processed, and that's too early to tell whether it is an obsolescent
3113 -- unit doing the with'ing. In Sem_Ch10.Analyze_Compilation_Unit we make
3114 -- sure that we have a later call when the scope is available. This test
3115 -- also eliminates all messages for use clauses, which is fine (we do
3116 -- not want messages for use clauses, since they are always redundant
3117 -- with respect to the associated with clause).
3119 if S = Standard_Standard then
3120 return;
3121 end if;
3123 -- Do not output message if we are in scope of an obsolescent package
3124 -- or subprogram.
3126 loop
3127 if Is_Obsolescent (S) then
3128 return;
3129 end if;
3131 S := Scope (S);
3132 exit when S = Standard_Standard;
3133 end loop;
3135 -- Here we will output the message
3137 Error_Msg_Sloc := Sloc (E);
3139 -- Case of with clause
3141 if Nkind (P) = N_With_Clause then
3142 if Ekind (E) = E_Package then
3143 Error_Msg_NE
3144 ("?j?with of obsolescent package& declared#", N, E);
3145 elsif Ekind (E) = E_Procedure then
3146 Error_Msg_NE
3147 ("?j?with of obsolescent procedure& declared#", N, E);
3148 else
3149 Error_Msg_NE
3150 ("?j?with of obsolescent function& declared#", N, E);
3151 end if;
3153 -- If we do not have a with clause, then ignore any reference to an
3154 -- obsolescent package name. We only want to give the one warning of
3155 -- withing the package, not one each time it is used to qualify.
3157 elsif Ekind (E) = E_Package then
3158 return;
3160 -- Procedure call statement
3162 elsif Nkind (P) = N_Procedure_Call_Statement then
3163 Error_Msg_NE
3164 ("?j?call to obsolescent procedure& declared#", N, E);
3166 -- Function call
3168 elsif Nkind (P) = N_Function_Call then
3169 Error_Msg_NE
3170 ("?j?call to obsolescent function& declared#", N, E);
3172 -- Reference to obsolescent type
3174 elsif Is_Type (E) then
3175 Error_Msg_NE
3176 ("?j?reference to obsolescent type& declared#", N, E);
3178 -- Reference to obsolescent component
3180 elsif Ekind (E) in E_Component | E_Discriminant then
3181 Error_Msg_NE
3182 ("?j?reference to obsolescent component& declared#", N, E);
3184 -- Reference to obsolescent variable
3186 elsif Ekind (E) = E_Variable then
3187 Error_Msg_NE
3188 ("?j?reference to obsolescent variable& declared#", N, E);
3190 -- Reference to obsolescent constant
3192 elsif Ekind (E) = E_Constant or else Ekind (E) in Named_Kind then
3193 Error_Msg_NE
3194 ("?j?reference to obsolescent constant& declared#", N, E);
3196 -- Reference to obsolescent enumeration literal
3198 elsif Ekind (E) = E_Enumeration_Literal then
3199 Error_Msg_NE
3200 ("?j?reference to obsolescent enumeration literal& declared#",
3201 N, E);
3203 -- Generic message for any other case we missed
3205 else
3206 Error_Msg_NE
3207 ("?j?reference to obsolescent entity& declared#", N, E);
3208 end if;
3210 -- Output additional warning if present
3212 for J in Obsolescent_Warnings.First .. Obsolescent_Warnings.Last loop
3213 if Obsolescent_Warnings.Table (J).Ent = E then
3214 String_To_Name_Buffer (Obsolescent_Warnings.Table (J).Msg);
3215 Error_Msg_Strlen := Name_Len;
3216 Error_Msg_String (1 .. Name_Len) := Name_Buffer (1 .. Name_Len);
3217 Error_Msg_N ("\\?j?~", N);
3218 exit;
3219 end if;
3220 end loop;
3221 end Output_Obsolescent_Entity_Warnings;
3223 ----------------------------------
3224 -- Output_Unreferenced_Messages --
3225 ----------------------------------
3227 procedure Output_Unreferenced_Messages is
3228 begin
3229 for J in Unreferenced_Entities.First .. Unreferenced_Entities.Last loop
3230 Warn_On_Unreferenced_Entity (Unreferenced_Entities.Table (J));
3231 end loop;
3232 end Output_Unreferenced_Messages;
3234 -----------------------------------------
3235 -- Output_Unused_Warnings_Off_Warnings --
3236 -----------------------------------------
3238 procedure Output_Unused_Warnings_Off_Warnings is
3239 begin
3240 for J in Warnings_Off_Pragmas.First .. Warnings_Off_Pragmas.Last loop
3241 declare
3242 Wentry : Warnings_Off_Entry renames Warnings_Off_Pragmas.Table (J);
3243 N : Node_Id renames Wentry.N;
3244 E : Node_Id renames Wentry.E;
3246 begin
3247 -- Turn off Warnings_Off, or we won't get the warning
3249 Set_Warnings_Off (E, False);
3251 -- Nothing to do if pragma was used to suppress a general warning
3253 if Warnings_Off_Used (E) then
3254 null;
3256 -- If pragma was used both in unmodified and unreferenced contexts
3257 -- then that's as good as the general case, no warning.
3259 elsif Warnings_Off_Used_Unmodified (E)
3261 Warnings_Off_Used_Unreferenced (E)
3262 then
3263 null;
3265 -- Used only in context where Unmodified would have worked
3267 elsif Warnings_Off_Used_Unmodified (E) then
3268 Error_Msg_NE
3269 ("?.w?could use Unmodified instead of "
3270 & "Warnings Off for &", Pragma_Identifier (N), E);
3272 -- Used only in context where Unreferenced would have worked
3274 elsif Warnings_Off_Used_Unreferenced (E) then
3275 Error_Msg_NE
3276 ("?.w?could use Unreferenced instead of "
3277 & "Warnings Off for &", Pragma_Identifier (N), E);
3279 -- Not used at all
3281 else
3282 Error_Msg_NE
3283 ("?.w?pragma Warnings Off for & unused, "
3284 & "could be omitted", N, E);
3285 end if;
3286 end;
3287 end loop;
3288 end Output_Unused_Warnings_Off_Warnings;
3290 ---------------------------
3291 -- Referenced_Check_Spec --
3292 ---------------------------
3294 function Referenced_Check_Spec (E : Entity_Id) return Boolean is
3295 begin
3296 if Is_Formal (E) and then Present (Spec_Entity (E)) then
3297 return Referenced (E) or else Referenced (Spec_Entity (E));
3298 else
3299 return Referenced (E);
3300 end if;
3301 end Referenced_Check_Spec;
3303 ----------------------------------
3304 -- Referenced_As_LHS_Check_Spec --
3305 ----------------------------------
3307 function Referenced_As_LHS_Check_Spec (E : Entity_Id) return Boolean is
3308 begin
3309 if Is_Formal (E) and then Present (Spec_Entity (E)) then
3310 return Referenced_As_LHS (E)
3311 or else Referenced_As_LHS (Spec_Entity (E));
3312 else
3313 return Referenced_As_LHS (E);
3314 end if;
3315 end Referenced_As_LHS_Check_Spec;
3317 --------------------------------------------
3318 -- Referenced_As_Out_Parameter_Check_Spec --
3319 --------------------------------------------
3321 function Referenced_As_Out_Parameter_Check_Spec
3322 (E : Entity_Id) return Boolean
3324 begin
3325 if Is_Formal (E) and then Present (Spec_Entity (E)) then
3326 return Referenced_As_Out_Parameter (E)
3327 or else Referenced_As_Out_Parameter (Spec_Entity (E));
3328 else
3329 return Referenced_As_Out_Parameter (E);
3330 end if;
3331 end Referenced_As_Out_Parameter_Check_Spec;
3333 --------------------------------------
3334 -- Warn_On_Constant_Valid_Condition --
3335 --------------------------------------
3337 procedure Warn_On_Constant_Valid_Condition (Op : Node_Id) is
3338 Left : constant Node_Id := Left_Opnd (Op);
3339 Right : constant Node_Id := Right_Opnd (Op);
3341 function Comes_From_Simple_Condition_In_Source
3342 (Op : Node_Id) return Boolean;
3343 -- Return True if Op comes from a simple condition present in the source
3345 -------------------------------------------
3346 -- Comes_From_Simple_Condition_In_Source --
3347 -------------------------------------------
3349 function Comes_From_Simple_Condition_In_Source
3350 (Op : Node_Id) return Boolean
3352 Orig_Op : constant Node_Id := Original_Node (Op);
3354 begin
3355 if not Comes_From_Source (Orig_Op) then
3356 return False;
3357 end if;
3359 -- We do not want to give warnings on a membership test with a mark
3360 -- for a subtype that is predicated, see also Exp_Ch4.Expand_N_In.
3362 if Nkind (Orig_Op) = N_In then
3363 declare
3364 Orig_Rop : constant Node_Id :=
3365 Original_Node (Right_Opnd (Orig_Op));
3366 begin
3367 if Is_Entity_Name (Orig_Rop)
3368 and then Is_Type (Entity (Orig_Rop))
3369 and then Present (Predicate_Function (Entity (Orig_Rop)))
3370 then
3371 return False;
3372 end if;
3373 end;
3374 end if;
3376 return True;
3377 end Comes_From_Simple_Condition_In_Source;
3379 True_Result : Boolean;
3380 False_Result : Boolean;
3382 begin
3383 -- Determine the potential outcome of the comparison assuming that the
3384 -- scalar operands are valid.
3386 if Constant_Condition_Warnings
3387 and then Comes_From_Simple_Condition_In_Source (Op)
3388 and then Is_Scalar_Type (Etype (Left))
3389 and then Is_Scalar_Type (Etype (Right))
3391 -- Do not consider instances because the check was already performed
3392 -- in the generic.
3394 and then not In_Instance
3396 -- Do not consider comparisons between two static expressions such as
3397 -- constants or literals because those values cannot be invalidated.
3399 and then not (Is_Static_Expression (Left)
3400 and then Is_Static_Expression (Right))
3402 -- Do not consider comparison between an attribute reference and a
3403 -- compile-time known value since this is most likely a conditional
3404 -- compilation.
3406 and then not Is_Attribute_And_Known_Value_Comparison (Op)
3408 -- Do not consider internal files to allow for various assertions and
3409 -- safeguards within our runtime.
3411 and then not In_Internal_Unit (Op)
3412 then
3413 Test_Comparison
3414 (Op => Op,
3415 Assume_Valid => True,
3416 True_Result => True_Result,
3417 False_Result => False_Result);
3419 -- Warn on a possible evaluation to False / True in the presence of
3420 -- invalid values. But issue no warning for an assertion expression
3421 -- (or a subexpression thereof); in particular, we don't want a
3422 -- warning about an assertion that will always succeed.
3424 if In_Assertion_Expression_Pragma (Op) then
3425 null;
3427 elsif True_Result then
3428 Error_Msg_N
3429 ("condition can only be False if invalid values present?c?", Op);
3431 elsif False_Result then
3432 Error_Msg_N
3433 ("condition can only be True if invalid values present?c?", Op);
3434 end if;
3435 end if;
3436 end Warn_On_Constant_Valid_Condition;
3438 -----------------------------
3439 -- Warn_On_Known_Condition --
3440 -----------------------------
3442 procedure Warn_On_Known_Condition (C : Node_Id) is
3443 Test_Result : Boolean := False;
3444 -- Force initialization to facilitate static analysis
3446 function Is_Known_Branch return Boolean;
3447 -- If the type of the condition is Boolean, the constant value of the
3448 -- condition is a boolean literal. If the type is a derived boolean
3449 -- type, the constant is wrapped in a type conversion of the derived
3450 -- literal. If the value of the condition is not a literal, no warnings
3451 -- can be produced. This function returns True if the result can be
3452 -- determined, and Test_Result is set True/False accordingly. Otherwise
3453 -- False is returned, and Test_Result is unchanged.
3455 procedure Track (N : Node_Id);
3456 -- Adds continuation warning(s) pointing to reason (assignment or test)
3457 -- for the operand of the conditional having a known value (or at least
3458 -- enough is known about the value to issue the warning).
3460 ---------------------
3461 -- Is_Known_Branch --
3462 ---------------------
3464 function Is_Known_Branch return Boolean is
3465 begin
3466 if Etype (C) = Standard_Boolean
3467 and then Is_Entity_Name (C)
3468 and then
3469 (Entity (C) = Standard_False or else Entity (C) = Standard_True)
3470 then
3471 Test_Result := Entity (C) = Standard_True;
3472 return True;
3474 elsif Is_Boolean_Type (Etype (C))
3475 and then Nkind (C) = N_Unchecked_Type_Conversion
3476 and then Is_Entity_Name (Expression (C))
3477 and then Ekind (Entity (Expression (C))) = E_Enumeration_Literal
3478 then
3479 Test_Result :=
3480 Chars (Entity (Expression (C))) = Chars (Standard_True);
3481 return True;
3483 else
3484 return False;
3485 end if;
3486 end Is_Known_Branch;
3488 -----------
3489 -- Track --
3490 -----------
3492 procedure Track (N : Node_Id) is
3494 procedure Rec (Sub_N : Node_Id);
3495 -- Recursive helper to do the work of Track, so we can refer to N's
3496 -- Sloc in error messages. Sub_N is initially N, and a proper subnode
3497 -- when recursively walking comparison operations.
3499 procedure Rec (Sub_N : Node_Id) is
3500 Orig : constant Node_Id := Original_Node (Sub_N);
3501 begin
3502 if Nkind (Orig) in N_Op_Compare then
3503 Rec (Left_Opnd (Orig));
3504 Rec (Right_Opnd (Orig));
3506 elsif Is_Entity_Name (Orig) and then Is_Object (Entity (Orig)) then
3507 declare
3508 CV : constant Node_Id := Current_Value (Entity (Orig));
3509 begin
3510 if Present (CV) then
3511 Error_Msg_Sloc := Sloc (CV);
3513 if Nkind (CV) not in N_Subexpr then
3514 Error_Msg_N ("\\?c?(see test #)", N);
3516 elsif Nkind (Parent (CV)) =
3517 N_Case_Statement_Alternative
3518 then
3519 Error_Msg_N ("\\?c?(see case alternative #)", N);
3521 else
3522 Error_Msg_N ("\\?c?(see assignment #)", N);
3523 end if;
3524 end if;
3525 end;
3526 end if;
3527 end Rec;
3529 begin
3530 Rec (N);
3531 end Track;
3533 -- Local variables
3535 Orig : constant Node_Id := Original_Node (C);
3536 P : Node_Id;
3538 -- Start of processing for Warn_On_Known_Condition
3540 begin
3541 -- Adjust SCO condition if from source
3543 if Generate_SCO
3544 and then Comes_From_Source (Orig)
3545 and then Is_Known_Branch
3546 then
3547 declare
3548 Atrue : Boolean := Test_Result;
3549 begin
3550 if Present (Parent (C)) and then Nkind (Parent (C)) = N_Op_Not then
3551 Atrue := not Atrue;
3552 end if;
3554 Set_SCO_Condition (Orig, Atrue);
3555 end;
3556 end if;
3558 -- Argument replacement in an inlined body can make conditions static.
3559 -- Do not emit warnings in this case.
3561 if In_Inlined_Body then
3562 return;
3563 end if;
3565 if Constant_Condition_Warnings
3566 and then Is_Known_Branch
3567 and then Comes_From_Source (Orig)
3568 and then Nkind (Orig) in N_Has_Entity
3569 and then not In_Instance
3570 then
3571 -- Don't warn if comparison of result of attribute against a constant
3572 -- value, since this is likely legitimate conditional compilation.
3574 if Is_Attribute_And_Known_Value_Comparison (C) then
3575 return;
3576 end if;
3578 -- See if this is in a statement or a declaration
3580 P := Parent (C);
3581 loop
3582 -- If tree is not attached, do not issue warning (this is very
3583 -- peculiar, and probably arises from some other error condition).
3585 if No (P) then
3586 return;
3588 -- If we are in a declaration, then no warning, since in practice
3589 -- conditionals in declarations are used for intended tests which
3590 -- may be known at compile time, e.g. things like
3592 -- x : constant Integer := 2 + (Word'Size = 32);
3594 -- And a warning is annoying in such cases
3596 elsif Nkind (P) in N_Declaration
3597 or else
3598 Nkind (P) in N_Later_Decl_Item
3599 then
3600 return;
3602 -- Don't warn in assert or check pragma, since presumably tests in
3603 -- such a context are very definitely intended, and might well be
3604 -- known at compile time. Note that we have to test the original
3605 -- node, since assert pragmas get rewritten at analysis time.
3607 elsif Nkind (Original_Node (P)) = N_Pragma
3608 and then
3609 Pragma_Name_Unmapped (Original_Node (P))
3610 in Name_Assert | Name_Check
3611 then
3612 return;
3613 end if;
3615 exit when Is_Statement (P);
3616 P := Parent (P);
3617 end loop;
3619 -- Here we issue the warning unless some sub-operand has warnings
3620 -- set off, in which case we suppress the warning for the node. If
3621 -- the original expression is an inequality, it has been expanded
3622 -- into a negation, and the value of the original expression is the
3623 -- negation of the equality. If the expression is an entity that
3624 -- appears within a negation, it is clearer to flag the negation
3625 -- itself, and report on its constant value.
3627 if not Operand_Has_Warnings_Suppressed (C) then
3628 declare
3629 True_Branch : Boolean := Test_Result;
3630 Cond : Node_Id := C;
3631 begin
3632 if Present (Parent (C))
3633 and then Nkind (Parent (C)) = N_Op_Not
3634 then
3635 True_Branch := not True_Branch;
3636 Cond := Parent (C);
3637 end if;
3639 -- Suppress warning if this is True/False of a derived boolean
3640 -- type with Nonzero_Is_True, which gets rewritten as Boolean
3641 -- True/False.
3643 if Is_Entity_Name (Original_Node (C))
3644 and then Ekind (Entity (Original_Node (C)))
3645 = E_Enumeration_Literal
3646 and then Nonzero_Is_True (Etype (Original_Node (C)))
3647 then
3648 null;
3650 -- Give warning for nontrivial always True/False case
3652 else
3653 if True_Branch then
3654 Error_Msg_N ("condition is always True?c?", Cond);
3655 else
3656 Error_Msg_N ("condition is always False?c?", Cond);
3657 end if;
3659 Track (Cond);
3660 end if;
3661 end;
3662 end if;
3663 end if;
3664 end Warn_On_Known_Condition;
3666 ---------------------------------------
3667 -- Warn_On_Modified_As_Out_Parameter --
3668 ---------------------------------------
3670 function Warn_On_Modified_As_Out_Parameter (E : Entity_Id) return Boolean is
3671 begin
3672 return
3673 (Warn_On_Modified_Unread and then Is_Only_Out_Parameter (E))
3674 or else Warn_On_All_Unread_Out_Parameters;
3675 end Warn_On_Modified_As_Out_Parameter;
3677 ---------------------------------
3678 -- Warn_On_Overlapping_Actuals --
3679 ---------------------------------
3681 procedure Warn_On_Overlapping_Actuals (Subp : Entity_Id; N : Node_Id) is
3682 function Explicitly_By_Reference (Formal_Id : Entity_Id) return Boolean;
3683 -- Returns True iff the type of Formal_Id is explicitly by-reference
3685 function Refer_Same_Object
3686 (Act1 : Node_Id;
3687 Act2 : Node_Id) return Boolean;
3688 -- Two names are known to refer to the same object if the two names
3689 -- are known to denote the same object; or one of the names is a
3690 -- selected_component, indexed_component, or slice and its prefix is
3691 -- known to refer to the same object as the other name; or one of the
3692 -- two names statically denotes a renaming declaration whose renamed
3693 -- object_name is known to refer to the same object as the other name
3694 -- (RM 6.4.1(6.11/3))
3696 -----------------------------
3697 -- Explicitly_By_Reference --
3698 -----------------------------
3700 function Explicitly_By_Reference
3701 (Formal_Id : Entity_Id)
3702 return Boolean
3704 Typ : constant Entity_Id := Underlying_Type (Etype (Formal_Id));
3705 begin
3706 if Present (Typ) then
3707 return Is_By_Reference_Type (Typ)
3708 or else Convention (Typ) = Convention_Ada_Pass_By_Reference;
3709 else
3710 return False;
3711 end if;
3712 end Explicitly_By_Reference;
3714 -----------------------
3715 -- Refer_Same_Object --
3716 -----------------------
3718 function Refer_Same_Object
3719 (Act1 : Node_Id;
3720 Act2 : Node_Id) return Boolean
3722 begin
3723 return
3724 Denotes_Same_Object (Act1, Act2)
3725 or else Denotes_Same_Prefix (Act1, Act2);
3726 end Refer_Same_Object;
3728 -- Local variables
3730 Act1 : Node_Id;
3731 Act2 : Node_Id;
3732 Form1 : Entity_Id;
3733 Form2 : Entity_Id;
3735 -- Start of processing for Warn_On_Overlapping_Actuals
3737 begin
3738 -- Exclude calls rewritten as enumeration literals
3740 if Nkind (N) not in N_Subprogram_Call | N_Entry_Call_Statement then
3741 return;
3743 -- Guard against previous errors
3745 elsif Error_Posted (N) then
3746 return;
3747 end if;
3749 -- If a call C has two or more parameters of mode in out or out that are
3750 -- of an elementary type, then the call is legal only if for each name
3751 -- N that is passed as a parameter of mode in out or out to the call C,
3752 -- there is no other name among the other parameters of mode in out or
3753 -- out to C that is known to denote the same object (RM 6.4.1(6.15/3))
3754 -- This has been clarified in AI12-0216 to indicate that the illegality
3755 -- only occurs if both formals are of an elementary type, because of the
3756 -- nondeterminism on the write-back of the corresponding actuals.
3757 -- Earlier versions of the language made it illegal if only one of the
3758 -- actuals was an elementary parameter that overlapped a composite
3759 -- actual, and both were writable.
3761 -- If appropriate warning switch is set, we also report warnings on
3762 -- overlapping parameters that are composite types. Users find these
3763 -- warnings useful, and they are used in style guides.
3765 -- It is also worthwhile to warn on overlaps of composite objects when
3766 -- only one of the formals is (in)-out. Note that the RM rule above is
3767 -- a legality rule. We choose to implement this check as a warning to
3768 -- avoid major incompatibilities with legacy code.
3770 -- Note also that the rule in 6.4.1 (6.17/3), introduced by AI12-0324,
3771 -- is potentially more expensive to verify, and is not yet implemented.
3773 Form1 := First_Formal (Subp);
3774 Act1 := First_Actual (N);
3775 while Present (Form1) and then Present (Act1) loop
3777 Form2 := Next_Formal (Form1);
3778 Act2 := Next_Actual (Act1);
3779 while Present (Form2) and then Present (Act2) loop
3781 -- Ignore formals of generic types; they will be examined when
3782 -- instantiated.
3784 if Is_Generic_Type (Etype (Form1))
3785 or else Is_Generic_Type (Etype (Form2))
3786 then
3787 null;
3789 elsif Refer_Same_Object (Act1, Act2) then
3791 -- Case 1: two writable elementary parameters that overlap
3793 if (Is_Elementary_Type (Etype (Form1))
3794 and then Is_Elementary_Type (Etype (Form2))
3795 and then Ekind (Form1) /= E_In_Parameter
3796 and then Ekind (Form2) /= E_In_Parameter)
3798 -- Case 2: two composite parameters that overlap, one of
3799 -- which is writable.
3801 or else (Is_Composite_Type (Etype (Form1))
3802 and then Is_Composite_Type (Etype (Form2))
3803 and then (Ekind (Form1) /= E_In_Parameter
3804 or else Ekind (Form2) /= E_In_Parameter))
3806 -- Case 3: an elementary writable parameter that overlaps
3807 -- a composite one.
3809 or else (Is_Elementary_Type (Etype (Form1))
3810 and then Ekind (Form1) /= E_In_Parameter
3811 and then Is_Composite_Type (Etype (Form2)))
3813 or else (Is_Elementary_Type (Etype (Form2))
3814 and then Ekind (Form2) /= E_In_Parameter
3815 and then Is_Composite_Type (Etype (Form1)))
3816 then
3818 -- Guard against previous errors
3820 if No (Etype (Act1))
3821 or else No (Etype (Act2))
3822 then
3823 null;
3825 -- If type is explicitly by-reference, then it is not
3826 -- covered by the legality rule, which only applies to
3827 -- elementary types. Actually, the aliasing is most
3828 -- likely intended, so don't emit a warning either.
3830 elsif Explicitly_By_Reference (Form1)
3831 or else Explicitly_By_Reference (Form2)
3832 then
3833 null;
3835 -- Here we may need to issue overlap message
3837 else
3838 Error_Msg_Warn :=
3840 -- Overlap checking is an error only in Ada 2012. For
3841 -- earlier versions of Ada, this is a warning.
3843 Ada_Version < Ada_2012
3845 -- Overlap is only illegal since Ada 2012 and only for
3846 -- elementary types (passed by copy). For other types
3847 -- we always have a warning in all versions. This is
3848 -- clarified by AI12-0216.
3850 or else not
3851 (Is_Elementary_Type (Etype (Form1))
3852 and then Is_Elementary_Type (Etype (Form2)));
3854 if not Error_Msg_Warn or else Warn_On_Overlap then
3855 -- debug flag -gnatd.E changes the error to a warning
3856 -- even in Ada 2012 mode.
3858 if Error_To_Warning then
3859 Error_Msg_Warn := True;
3860 end if;
3862 -- For greater clarity, give name of formal
3864 Error_Msg_Node_2 := Form2;
3866 -- This is one of the messages
3868 Error_Msg_FE ("<.i<writable actual for & overlaps with"
3869 & " actual for &", Act1, Form1);
3870 end if;
3871 end if;
3872 end if;
3873 end if;
3875 Next_Formal (Form2);
3876 Next_Actual (Act2);
3877 end loop;
3879 Next_Formal (Form1);
3880 Next_Actual (Act1);
3881 end loop;
3882 end Warn_On_Overlapping_Actuals;
3884 ------------------------------
3885 -- Warn_On_Suspicious_Index --
3886 ------------------------------
3888 procedure Warn_On_Suspicious_Index (Name : Entity_Id; X : Node_Id) is
3890 Low_Bound : Uint;
3891 -- Set to lower bound for a suspicious type
3893 Ent : Entity_Id;
3894 -- Entity for array reference
3896 Typ : Entity_Id;
3897 -- Array type
3899 function Is_Suspicious_Type (Typ : Entity_Id) return Boolean;
3900 -- Tests to see if Typ is a type for which we may have a suspicious
3901 -- index, namely an unconstrained array type, whose lower bound is
3902 -- either zero or one. If so, True is returned, and Low_Bound is set
3903 -- to this lower bound. If not, False is returned, and Low_Bound is
3904 -- undefined on return.
3906 -- For now, we limit this to standard string types, so any other
3907 -- unconstrained types return False. We may change our minds on this
3908 -- later on, but strings seem the most important case.
3910 procedure Test_Suspicious_Index;
3911 -- Test if index is of suspicious type and if so, generate warning
3913 ------------------------
3914 -- Is_Suspicious_Type --
3915 ------------------------
3917 function Is_Suspicious_Type (Typ : Entity_Id) return Boolean is
3918 LB : Node_Id;
3920 begin
3921 if Is_Array_Type (Typ)
3922 and then not Is_Constrained (Typ)
3923 and then Number_Dimensions (Typ) = 1
3924 and then Is_Standard_String_Type (Typ)
3925 and then not Has_Warnings_Off (Typ)
3926 then
3927 LB := Type_Low_Bound (Etype (First_Index (Typ)));
3929 if Compile_Time_Known_Value (LB) then
3930 Low_Bound := Expr_Value (LB);
3931 return Low_Bound = Uint_0 or else Low_Bound = Uint_1;
3932 end if;
3933 end if;
3935 return False;
3936 end Is_Suspicious_Type;
3938 ---------------------------
3939 -- Test_Suspicious_Index --
3940 ---------------------------
3942 procedure Test_Suspicious_Index is
3944 function Length_Reference (N : Node_Id) return Boolean;
3945 -- Check if node N is of the form Name'Length
3947 procedure Warn1;
3948 -- Generate first warning line
3950 procedure Warn_On_Index_Below_Lower_Bound;
3951 -- Generate a warning on indexing the array with a literal value
3952 -- below the lower bound of the index type.
3954 procedure Warn_On_Literal_Index;
3955 -- Generate a warning on indexing the array with a literal value
3957 ----------------------
3958 -- Length_Reference --
3959 ----------------------
3961 function Length_Reference (N : Node_Id) return Boolean is
3962 R : constant Node_Id := Original_Node (N);
3963 begin
3964 return
3965 Nkind (R) = N_Attribute_Reference
3966 and then Attribute_Name (R) = Name_Length
3967 and then Is_Entity_Name (Prefix (R))
3968 and then Entity (Prefix (R)) = Ent;
3969 end Length_Reference;
3971 -----------
3972 -- Warn1 --
3973 -----------
3975 procedure Warn1 is
3976 begin
3977 Error_Msg_Uint_1 := Low_Bound;
3978 Error_Msg_FE -- CODEFIX
3979 ("?w?index for& may assume lower bound of^", X, Ent);
3980 end Warn1;
3982 -------------------------------------
3983 -- Warn_On_Index_Below_Lower_Bound --
3984 -------------------------------------
3986 procedure Warn_On_Index_Below_Lower_Bound is
3987 begin
3988 if Is_Standard_String_Type (Typ) then
3989 Discard_Node
3990 (Compile_Time_Constraint_Error
3991 (N => X,
3992 Msg => "?w?string index should be positive"));
3993 else
3994 Discard_Node
3995 (Compile_Time_Constraint_Error
3996 (N => X,
3997 Msg => "?w?index out of the allowed range"));
3998 end if;
3999 end Warn_On_Index_Below_Lower_Bound;
4001 ---------------------------
4002 -- Warn_On_Literal_Index --
4003 ---------------------------
4005 procedure Warn_On_Literal_Index is
4006 begin
4007 Warn1;
4009 -- Case where original form of subscript is an integer literal
4011 if Nkind (Original_Node (X)) = N_Integer_Literal then
4012 if Intval (X) = Low_Bound then
4013 Error_Msg_FE -- CODEFIX
4014 ("\?w?suggested replacement: `&''First`", X, Ent);
4015 else
4016 Error_Msg_Uint_1 := Intval (X) - Low_Bound;
4017 Error_Msg_FE -- CODEFIX
4018 ("\?w?suggested replacement: `&''First + ^`", X, Ent);
4020 end if;
4022 -- Case where original form of subscript is more complex
4024 else
4025 -- Build string X'First - 1 + expression where the expression
4026 -- is the original subscript. If the expression starts with "1
4027 -- + ", then the "- 1 + 1" is elided.
4029 Error_Msg_String (1 .. 13) := "'First - 1 + ";
4030 Error_Msg_Strlen := 13;
4032 declare
4033 Sref : Source_Ptr := Sloc (First_Node (Original_Node (X)));
4034 Tref : constant Source_Buffer_Ptr :=
4035 Source_Text (Get_Source_File_Index (Sref));
4036 -- Tref (Sref) is used to scan the subscript
4038 Pctr : Natural;
4039 -- Parentheses counter when scanning subscript
4041 begin
4042 -- Tref (Sref) points to start of subscript
4044 -- Elide - 1 if subscript starts with 1 +
4046 if Tref (Sref .. Sref + 2) = "1 +" then
4047 Error_Msg_Strlen := Error_Msg_Strlen - 6;
4048 Sref := Sref + 2;
4050 elsif Tref (Sref .. Sref + 1) = "1+" then
4051 Error_Msg_Strlen := Error_Msg_Strlen - 6;
4052 Sref := Sref + 1;
4053 end if;
4055 -- Now we will copy the subscript to the string buffer
4057 Pctr := 0;
4058 loop
4059 -- Count parens, exit if terminating right paren. Note
4060 -- check to ignore paren appearing as character literal.
4062 if Tref (Sref + 1) = '''
4063 and then
4064 Tref (Sref - 1) = '''
4065 then
4066 null;
4067 else
4068 if Tref (Sref) = '(' then
4069 Pctr := Pctr + 1;
4070 elsif Tref (Sref) = ')' then
4071 exit when Pctr = 0;
4072 Pctr := Pctr - 1;
4073 end if;
4074 end if;
4076 -- Done if terminating double dot (slice case)
4078 exit when Pctr = 0
4079 and then (Tref (Sref .. Sref + 1) = ".."
4080 or else
4081 Tref (Sref .. Sref + 2) = " ..");
4083 -- Quit if we have hit EOF character, something wrong
4085 if Tref (Sref) = EOF then
4086 return;
4087 end if;
4089 -- String literals are too much of a pain to handle
4091 if Tref (Sref) = '"' or else Tref (Sref) = '%' then
4092 return;
4093 end if;
4095 -- If we have a 'Range reference, then this is a case
4096 -- where we cannot easily give a replacement. Don't try.
4098 if Tref (Sref .. Sref + 4) = "range"
4099 and then Tref (Sref - 1) < 'A'
4100 and then Tref (Sref + 5) < 'A'
4101 then
4102 return;
4103 end if;
4105 -- Else store next character
4107 Error_Msg_Strlen := Error_Msg_Strlen + 1;
4108 Error_Msg_String (Error_Msg_Strlen) := Tref (Sref);
4109 Sref := Sref + 1;
4111 -- If we get more than 40 characters then the expression
4112 -- is too long to copy, or something has gone wrong. In
4113 -- either case, just skip the attempt at a suggested fix.
4115 if Error_Msg_Strlen > 40 then
4116 return;
4117 end if;
4118 end loop;
4119 end;
4121 -- Replacement subscript is now in string buffer
4123 Error_Msg_FE -- CODEFIX
4124 ("\?w?suggested replacement: `&~`", Original_Node (X), Ent);
4125 end if;
4126 end Warn_On_Literal_Index;
4128 -- Start of processing for Test_Suspicious_Index
4130 begin
4131 -- Nothing to do if subscript does not come from source (we don't
4132 -- want to give garbage warnings on compiler expanded code, e.g. the
4133 -- loops generated for slice assignments. Such junk warnings would
4134 -- be placed on source constructs with no subscript in sight).
4136 if not Comes_From_Source (Original_Node (X)) then
4137 return;
4138 end if;
4140 -- Case where subscript is a constant integer
4142 if Nkind (X) = N_Integer_Literal then
4144 -- Case where subscript is lower than the lowest possible bound.
4145 -- This might be the case for example when programmers try to
4146 -- access a string at index 0, as they are used to in other
4147 -- programming languages like C.
4149 if Intval (X) < Low_Bound then
4150 Warn_On_Index_Below_Lower_Bound;
4151 else
4152 Warn_On_Literal_Index;
4153 end if;
4155 -- Case where subscript is of the form X'Length
4157 elsif Length_Reference (X) then
4158 Warn1;
4159 Error_Msg_Node_2 := Ent;
4160 Error_Msg_FE
4161 ("\?w?suggest replacement of `&''Length` by `&''Last`",
4162 X, Ent);
4164 -- Case where subscript is of the form X'Length - expression
4166 elsif Nkind (X) = N_Op_Subtract
4167 and then Length_Reference (Left_Opnd (X))
4168 then
4169 Warn1;
4170 Error_Msg_Node_2 := Ent;
4171 Error_Msg_FE
4172 ("\?w?suggest replacement of `&''Length` by `&''Last`",
4173 Left_Opnd (X), Ent);
4174 end if;
4175 end Test_Suspicious_Index;
4177 -- Start of processing for Warn_On_Suspicious_Index
4179 begin
4180 -- Only process if warnings activated
4182 if Warn_On_Assumed_Low_Bound then
4184 -- Test if array is simple entity name
4186 if Is_Entity_Name (Name) then
4188 -- Test if array is parameter of unconstrained string type
4190 Ent := Entity (Name);
4191 Typ := Etype (Ent);
4193 if Is_Formal (Ent)
4194 and then Is_Suspicious_Type (Typ)
4195 and then not Low_Bound_Tested (Ent)
4196 then
4197 Test_Suspicious_Index;
4198 end if;
4199 end if;
4200 end if;
4201 end Warn_On_Suspicious_Index;
4203 -------------------------------
4204 -- Warn_On_Suspicious_Update --
4205 -------------------------------
4207 procedure Warn_On_Suspicious_Update (N : Node_Id) is
4208 Par : constant Node_Id := Parent (N);
4209 Arg : Node_Id;
4211 begin
4212 -- Only process if warnings activated
4214 if Warn_On_Suspicious_Contract then
4215 if Nkind (Par) in N_Op_Eq | N_Op_Ne then
4216 if N = Left_Opnd (Par) then
4217 Arg := Right_Opnd (Par);
4218 else
4219 Arg := Left_Opnd (Par);
4220 end if;
4222 if Same_Object (Prefix (N), Arg) then
4223 if Nkind (Par) = N_Op_Eq then
4224 Error_Msg_N
4225 ("suspicious equality test with modified version of "
4226 & "same object?.t?", Par);
4227 else
4228 Error_Msg_N
4229 ("suspicious inequality test with modified version of "
4230 & "same object?.t?", Par);
4231 end if;
4232 end if;
4233 end if;
4234 end if;
4235 end Warn_On_Suspicious_Update;
4237 --------------------------------------
4238 -- Warn_On_Unassigned_Out_Parameter --
4239 --------------------------------------
4241 procedure Warn_On_Unassigned_Out_Parameter
4242 (Return_Node : Node_Id;
4243 Scope_Id : Entity_Id)
4245 Form : Entity_Id;
4247 begin
4248 -- Ignore if procedure or return statement does not come from source
4250 if not Comes_From_Source (Scope_Id)
4251 or else not Comes_From_Source (Return_Node)
4252 then
4253 return;
4254 end if;
4256 -- Before we issue the warning, add an ad hoc defence against the most
4257 -- common case of false positives with this warning which is the case
4258 -- where there is a Boolean OUT parameter that has been set, and whose
4259 -- meaning is "ignore the values of the other parameters". We can't of
4260 -- course reliably tell this case at compile time, but the following
4261 -- test kills a lot of false positives, without generating a significant
4262 -- number of false negatives (missed real warnings).
4264 Form := First_Formal (Scope_Id);
4265 while Present (Form) loop
4266 if Ekind (Form) = E_Out_Parameter
4267 and then Root_Type (Etype (Form)) = Standard_Boolean
4268 and then not Never_Set_In_Source_Check_Spec (Form)
4269 then
4270 return;
4271 end if;
4273 Next_Formal (Form);
4274 end loop;
4276 -- Loop through formals
4278 Form := First_Formal (Scope_Id);
4279 while Present (Form) loop
4281 -- We are only interested in OUT parameters that come from source
4282 -- and are never set in the source, and furthermore only in scalars
4283 -- since non-scalars generate too many false positives.
4285 if Ekind (Form) = E_Out_Parameter
4286 and then Never_Set_In_Source_Check_Spec (Form)
4287 and then Is_Scalar_Type (Etype (Form))
4288 and then No (Unset_Reference (Form))
4289 then
4290 -- Here all conditions are met, record possible unset reference
4292 Set_Unset_Reference (Form, Return_Node);
4293 end if;
4295 Next_Formal (Form);
4296 end loop;
4297 end Warn_On_Unassigned_Out_Parameter;
4299 ---------------------------------
4300 -- Warn_On_Unreferenced_Entity --
4301 ---------------------------------
4303 procedure Warn_On_Unreferenced_Entity
4304 (Spec_E : Entity_Id;
4305 Body_E : Entity_Id := Empty)
4307 E : Entity_Id := Spec_E;
4309 begin
4310 if not Referenced_Check_Spec (E)
4311 and then not Has_Pragma_Unreferenced_Check_Spec (E)
4312 and then not Warnings_Off_Check_Spec (E)
4313 and then not Has_Junk_Name (Spec_E)
4314 and then not Is_Exported (Spec_E)
4315 then
4316 case Ekind (E) is
4317 when E_Variable =>
4319 -- Case of variable that is assigned but not read. We suppress
4320 -- the message if the variable is volatile, has an address
4321 -- clause, is aliased, or is a renaming, or is imported.
4323 if Referenced_As_LHS_Check_Spec (E) then
4324 if Warn_On_Modified_Unread
4325 and then No (Address_Clause (E))
4326 and then not Is_Volatile (E)
4327 and then not Is_Imported (E)
4328 and then not Is_Aliased (E)
4329 and then No (Renamed_Object (E))
4330 then
4331 if not Has_Pragma_Unmodified_Check_Spec (E) then
4332 Error_Msg_N -- CODEFIX
4333 ("?m?variable & is assigned but never read!", E);
4334 end if;
4336 Set_Last_Assignment (E, Empty);
4337 end if;
4339 -- Normal case of neither assigned nor read (exclude variables
4340 -- referenced as out parameters, since we already generated
4341 -- appropriate warnings at the call point in this case).
4343 elsif not Referenced_As_Out_Parameter (E) then
4345 -- We suppress the message for types for which a valid
4346 -- pragma Unreferenced_Objects has been given, otherwise
4347 -- we go ahead and give the message.
4349 if not Has_Pragma_Unreferenced_Objects (Etype (E)) then
4351 -- Distinguish renamed case in message
4353 if Present (Renamed_Object (E))
4354 and then Comes_From_Source (Renamed_Object (E))
4355 then
4356 Error_Msg_N -- CODEFIX
4357 ("?u?renamed variable & is not referenced!", E);
4358 else
4359 Error_Msg_N -- CODEFIX
4360 ("?u?variable & is not referenced!", E);
4361 end if;
4362 end if;
4363 end if;
4365 when E_Constant =>
4366 if not Has_Pragma_Unreferenced_Objects (Etype (E)) then
4367 if Present (Renamed_Object (E))
4368 and then Comes_From_Source (Renamed_Object (E))
4369 then
4370 Error_Msg_N -- CODEFIX
4371 ("?u?renamed constant & is not referenced!", E);
4372 else
4373 Error_Msg_N -- CODEFIX
4374 ("?u?constant & is not referenced!", E);
4375 end if;
4376 end if;
4378 when E_In_Out_Parameter
4379 | E_In_Parameter
4381 -- Do not emit message for formals of a renaming, because they
4382 -- are never referenced explicitly.
4384 if Nkind (Original_Node (Unit_Declaration_Node (Scope (E)))) /=
4385 N_Subprogram_Renaming_Declaration
4386 then
4387 -- Suppress this message for an IN OUT parameter of a
4388 -- non-scalar type, since it is normal to have only an
4389 -- assignment in such a case.
4391 if Ekind (E) = E_In_Parameter
4392 or else not Referenced_As_LHS_Check_Spec (E)
4393 or else Is_Scalar_Type (Etype (E))
4394 then
4395 if Present (Body_E) then
4396 E := Body_E;
4397 end if;
4399 declare
4400 S : Node_Id := Scope (E);
4401 begin
4402 if Ekind (S) = E_Subprogram_Body then
4403 S := Parent (S);
4405 while Nkind (S) not in
4406 N_Expression_Function |
4407 N_Subprogram_Body |
4408 N_Subprogram_Renaming_Declaration |
4409 N_Empty
4410 loop
4411 S := Parent (S);
4412 end loop;
4414 if Present (S) then
4415 S := Corresponding_Spec (S);
4416 end if;
4417 end if;
4419 -- Do not warn for dispatching operations, because
4420 -- that causes too much noise. Also do not warn for
4421 -- trivial subprograms (e.g. stubs).
4423 if (No (S) or else not Is_Dispatching_Operation (S))
4424 and then not Is_Trivial_Subprogram (Scope (E))
4425 and then Check_Unreferenced_Formals
4426 then
4427 Error_Msg_NE -- CODEFIX
4428 ("?f?formal parameter & is not referenced!",
4429 E, Spec_E);
4430 end if;
4431 end;
4432 end if;
4433 end if;
4435 when E_Out_Parameter =>
4436 null;
4438 when E_Discriminant =>
4439 Error_Msg_N ("?u?discriminant & is not referenced!", E);
4441 when E_Named_Integer
4442 | E_Named_Real
4444 Error_Msg_N -- CODEFIX
4445 ("?u?named number & is not referenced!", E);
4447 when Formal_Object_Kind =>
4448 Error_Msg_N -- CODEFIX
4449 ("?u?formal object & is not referenced!", E);
4451 when E_Enumeration_Literal =>
4452 Error_Msg_N -- CODEFIX
4453 ("?u?literal & is not referenced!", E);
4455 when E_Function =>
4456 if not Is_Abstract_Subprogram (E) then
4457 Error_Msg_N -- CODEFIX
4458 ("?u?function & is not referenced!", E);
4459 end if;
4461 when E_Procedure =>
4462 if not Is_Abstract_Subprogram (E) then
4463 Error_Msg_N -- CODEFIX
4464 ("?u?procedure & is not referenced!", E);
4465 end if;
4467 when E_Package =>
4468 Error_Msg_N -- CODEFIX
4469 ("?u?package & is not referenced!", E);
4471 when E_Exception =>
4472 Error_Msg_N -- CODEFIX
4473 ("?u?exception & is not referenced!", E);
4475 when E_Label =>
4476 Error_Msg_N -- CODEFIX
4477 ("?u?label & is not referenced!", E);
4479 when E_Generic_Procedure =>
4480 Error_Msg_N -- CODEFIX
4481 ("?u?generic procedure & is never instantiated!", E);
4483 when E_Generic_Function =>
4484 Error_Msg_N -- CODEFIX
4485 ("?u?generic function & is never instantiated!", E);
4487 when Type_Kind =>
4488 Error_Msg_N -- CODEFIX
4489 ("?u?type & is not referenced!", E);
4491 when others =>
4492 Error_Msg_N -- CODEFIX
4493 ("?u?& is not referenced!", E);
4494 end case;
4496 -- Kill warnings on the entity on which the message has been posted
4497 -- (nothing is posted on out parameters because back end might be
4498 -- able to uncover an uninitialized path, and warn accordingly).
4500 if Ekind (E) /= E_Out_Parameter then
4501 Set_Warnings_Off (E);
4502 end if;
4503 end if;
4504 end Warn_On_Unreferenced_Entity;
4506 --------------------------------
4507 -- Warn_On_Useless_Assignment --
4508 --------------------------------
4510 procedure Warn_On_Useless_Assignment
4511 (Ent : Entity_Id;
4512 N : Node_Id := Empty)
4514 P : Node_Id;
4515 X : Node_Id;
4517 function Check_Ref (N : Node_Id) return Traverse_Result;
4518 -- Used to instantiate Traverse_Func. Returns Abandon if a reference to
4519 -- the entity in question is found.
4521 function Test_No_Refs is new Traverse_Func (Check_Ref);
4523 ---------------
4524 -- Check_Ref --
4525 ---------------
4527 function Check_Ref (N : Node_Id) return Traverse_Result is
4528 begin
4529 -- Check reference to our identifier. We use name equality here
4530 -- because the exception handlers have not yet been analyzed. This
4531 -- is not quite right, but it really does not matter that we fail
4532 -- to output the warning in some obscure cases of name clashes.
4534 if Nkind (N) = N_Identifier and then Chars (N) = Chars (Ent) then
4535 return Abandon;
4536 else
4537 return OK;
4538 end if;
4539 end Check_Ref;
4541 -- Start of processing for Warn_On_Useless_Assignment
4543 begin
4544 -- Check if this is a case we want to warn on, a scalar or access
4545 -- variable with the last assignment field set, with warnings enabled,
4546 -- and which is not imported or exported. We also check that it is OK
4547 -- to capture the value. We are not going to capture any value, but
4548 -- the warning message depends on the same kind of conditions.
4550 -- If the assignment appears as an out-parameter in a call within an
4551 -- expression function it may be detected twice: once when expression
4552 -- itself is analyzed, and once when the constructed body is analyzed.
4553 -- We don't want to emit a spurious warning in this case.
4555 if Is_Assignable (Ent)
4556 and then not Is_Return_Object (Ent)
4557 and then Present (Last_Assignment (Ent))
4558 and then Last_Assignment (Ent) /= N
4559 and then not Is_Imported (Ent)
4560 and then not Is_Exported (Ent)
4561 and then Safe_To_Capture_Value (N, Ent)
4562 and then not Has_Pragma_Unreferenced_Check_Spec (Ent)
4563 and then not Has_Junk_Name (Ent)
4564 then
4565 -- Before we issue the message, check covering exception handlers.
4566 -- Search up tree for enclosing statement sequences and handlers.
4568 P := Parent (Last_Assignment (Ent));
4569 while Present (P) loop
4571 -- Something is really wrong if we don't find a handled statement
4572 -- sequence, so just suppress the warning.
4574 if No (P) then
4575 Set_Last_Assignment (Ent, Empty);
4576 return;
4578 -- When we hit a package/subprogram body, issue warning and exit
4580 elsif Nkind (P) in N_Entry_Body
4581 | N_Package_Body
4582 | N_Subprogram_Body
4583 | N_Task_Body
4584 then
4585 -- Case of assigned value never referenced
4587 if No (N) then
4588 declare
4589 LA : constant Node_Id := Last_Assignment (Ent);
4591 begin
4592 -- Don't give this for OUT and IN OUT formals, since
4593 -- clearly caller may reference the assigned value. Also
4594 -- never give such warnings for internal variables. In
4595 -- either case, word the warning in a conditional way,
4596 -- because in the case of a component of a controlled
4597 -- type, the assigned value might be referenced in the
4598 -- Finalize operation, so we can't make a definitive
4599 -- statement that it's never referenced.
4601 if Ekind (Ent) = E_Variable
4602 and then not Is_Internal_Name (Chars (Ent))
4603 then
4604 -- Give appropriate message, distinguishing between
4605 -- assignment statements and out parameters.
4607 if Nkind (Parent (LA)) in N_Parameter_Association
4608 | N_Procedure_Call_Statement
4609 then
4610 if Warn_On_All_Unread_Out_Parameters then
4611 Error_Msg_NE
4612 ("?.o?& modified by call, but value might not "
4613 & "be referenced", LA, Ent);
4614 end if;
4615 else
4616 Error_Msg_NE -- CODEFIX
4617 ("?m?possibly useless assignment to&, value "
4618 & "might not be referenced!", LA, Ent);
4619 end if;
4620 end if;
4621 end;
4623 -- Case of assigned value overwritten
4625 else
4626 declare
4627 LA : constant Node_Id := Last_Assignment (Ent);
4629 begin
4630 Error_Msg_Sloc := Sloc (N);
4632 -- Give appropriate message, distinguishing between
4633 -- assignment statements and out parameters.
4635 if Nkind (Parent (LA)) in N_Procedure_Call_Statement
4636 | N_Parameter_Association
4637 then
4638 Error_Msg_NE
4639 ("?m?& modified by call, but value overwritten #!",
4640 LA, Ent);
4641 else
4642 Error_Msg_NE -- CODEFIX
4643 ("?m?useless assignment to&, value overwritten #!",
4644 LA, Ent);
4645 end if;
4646 end;
4647 end if;
4649 -- Clear last assignment indication and we are done
4651 Set_Last_Assignment (Ent, Empty);
4652 return;
4654 -- Enclosing handled sequence of statements
4656 elsif Nkind (P) = N_Handled_Sequence_Of_Statements then
4658 -- Check exception handlers present
4660 if Present (Exception_Handlers (P)) then
4662 -- If we are not at the top level, we regard an inner
4663 -- exception handler as a decisive indicator that we should
4664 -- not generate the warning, since the variable in question
4665 -- may be accessed after an exception in the outer block.
4667 if Nkind (Parent (P)) not in N_Entry_Body
4668 | N_Package_Body
4669 | N_Subprogram_Body
4670 | N_Task_Body
4671 then
4672 Set_Last_Assignment (Ent, Empty);
4673 return;
4675 -- Otherwise we are at the outer level. An exception
4676 -- handler is significant only if it references the
4677 -- variable in question, or if the entity in question
4678 -- is an OUT or IN OUT parameter, in which case
4679 -- the caller can reference it after the exception
4680 -- handler completes.
4682 else
4683 if Is_Formal (Ent) then
4684 Set_Last_Assignment (Ent, Empty);
4685 return;
4687 else
4688 X := First (Exception_Handlers (P));
4689 while Present (X) loop
4690 if Test_No_Refs (X) = Abandon then
4691 Set_Last_Assignment (Ent, Empty);
4692 return;
4693 end if;
4695 Next (X);
4696 end loop;
4697 end if;
4698 end if;
4699 end if;
4700 end if;
4702 P := Parent (P);
4703 end loop;
4704 end if;
4705 end Warn_On_Useless_Assignment;
4707 ---------------------------------
4708 -- Warn_On_Useless_Assignments --
4709 ---------------------------------
4711 procedure Warn_On_Useless_Assignments (E : Entity_Id) is
4712 Ent : Entity_Id;
4714 begin
4715 if Warn_On_Modified_Unread
4716 and then In_Extended_Main_Source_Unit (E)
4717 then
4718 Ent := First_Entity (E);
4719 while Present (Ent) loop
4720 Warn_On_Useless_Assignment (Ent);
4721 Next_Entity (Ent);
4722 end loop;
4723 end if;
4724 end Warn_On_Useless_Assignments;
4726 -----------------------------
4727 -- Warnings_Off_Check_Spec --
4728 -----------------------------
4730 function Warnings_Off_Check_Spec (E : Entity_Id) return Boolean is
4731 begin
4732 if Is_Formal (E) and then Present (Spec_Entity (E)) then
4734 -- Note: use of OR here instead of OR ELSE is deliberate, we want
4735 -- to mess with flags on both entities.
4737 return Has_Warnings_Off (E)
4739 Has_Warnings_Off (Spec_Entity (E));
4741 else
4742 return Has_Warnings_Off (E);
4743 end if;
4744 end Warnings_Off_Check_Spec;
4746 end Sem_Warn;