sem_warn.adb (Check_One_Unit): If the unit appears in a limited_with clause...

2006-02-13  Ed Schonberg  <schonberg@adacore.com>

	* sem_warn.adb (Check_One_Unit): If the unit appears in a limited_with
	clause, use the limited view to determine whether any entity from it
	is referenced.

From-SVN: r111097
This commit is contained in:
Ed Schonberg 2006-02-15 10:45:43 +01:00 committed by Arnaud Charlet
parent 4e73070af6
commit 0456836930

View file

@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
-- Copyright (C) 1999-2005, Free Software Foundation, Inc. --
-- Copyright (C) 1999-2006, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
@ -58,26 +58,26 @@ package body Sem_Warn is
-- Handling of Conditionals --
------------------------------
-- Note: this is work in progress, the data structures and general
-- approach are defined, but are not in use yet. ???
-- Note: this is work in progress, the data structures and general approach
-- are defined, but are not in use yet. ???
-- One entry is made in the following table for each branch of
-- a conditional, e.g. an if-then-elsif-else-endif structure
-- creates three entries in this table.
-- An entry is made in the following table for each branch of conditional,
-- e.g. an if-then-elsif-else-endif structure creates three entries in this
-- table.
type Branch_Entry is record
Sloc : Source_Ptr;
-- Location for warnings associated with this branch
Defs : Elist_Id;
-- List of entities defined for the first time in this branch. On
-- exit from a conditional structure, any entity that is in the
-- list of all branches is removed (and the entity flagged as
-- defined by the conditional as a whole). Thus after processing
-- a conditional, Defs contains a list of entities defined in this
-- branch for the first time, but not defined at all in some other
-- branch of the same conditional. A value of No_Elist is used to
-- represent the initial empty list.
-- List of entities defined for the first time in this branch. On exit
-- from a conditional structure, any entity that is in the list of all
-- branches is removed (and the entity flagged as defined by the
-- conditional as a whole). Thus after processing a conditional, Defs
-- contains a list of entities defined in this branch for the first
-- time, but not defined at all in some other branch of the same
-- conditional. A value of No_Elist is used to represent the initial
-- empty list.
Next : Nat;
-- Index of next branch for this conditional, zero = last branch
@ -91,8 +91,8 @@ package body Sem_Warn is
Table_Increment => Alloc.Branches_Increment,
Table_Name => "Branches");
-- The following table is used to represent conditionals, there is
-- one entry in this table for each conditional structure.
-- The following table is used to represent conditionals, there is one
-- entry in this table for each conditional structure.
type Conditional_Entry is record
If_Stmt : Boolean;
@ -114,9 +114,9 @@ package body Sem_Warn is
Table_Name => "Conditionals");
-- The following table is a stack that keeps track of the current
-- conditional. The Last entry is the top of the stack. An Empty
-- entry represents the start of a compilation unit. Non-zero
-- entries in the stack are indexes into the conditional table.
-- conditional. The Last entry is the top of the stack. An Empty entry
-- represents the start of a compilation unit. Non-zero entries in the
-- stack are indexes into the conditional table.
package Conditional_Stack is new Table.Table (
Table_Component_Type => Nat,
@ -143,10 +143,10 @@ package body Sem_Warn is
-- for the instance, when we will know more.
function Operand_Has_Warnings_Suppressed (N : Node_Id) return Boolean;
-- This function traverses the expression tree represented by the node
-- N and determines if any sub-operand is a reference to an entity for
-- which the Warnings_Off flag is set. True is returned if such an
-- entity is encountered, and False otherwise.
-- This function traverses the expression tree represented by the node N
-- and determines if any sub-operand is a reference to an entity for which
-- the Warnings_Off flag is set. True is returned if such an entity is
-- encountered, and False otherwise.
----------------------
-- Check_References --
@ -158,18 +158,18 @@ package body Sem_Warn is
function Missing_Subunits return Boolean;
-- We suppress warnings when there are missing subunits, because this
-- may generate too many false positives: entities in a parent may
-- only be referenced in one of the subunits. We make an exception
-- for subunits that contain no other stubs.
-- may generate too many false positives: entities in a parent may only
-- be referenced in one of the subunits. We make an exception for
-- subunits that contain no other stubs.
procedure Output_Reference_Error (M : String);
-- Used to output an error message. Deals with posting the error on
-- the body formal in the accept case.
-- Used to output an error message. Deals with posting the error on the
-- body formal in the accept case.
function Publicly_Referenceable (Ent : Entity_Id) return Boolean;
-- This is true if the entity in question is potentially referenceable
-- from another unit. This is true for entities in packages that are
-- at the library level.
-- from another unit. This is true for entities in packages that are at
-- the library level.
----------------------
-- Missing_Subunits --
@ -193,7 +193,6 @@ package body Sem_Warn is
elsif Nkind (Unit_Declaration_Node (E)) in N_Proper_Body then
D := First (Declarations (Unit_Declaration_Node (E)));
while Present (D) loop
-- No warnings if the proper body contains nested stubs
@ -208,7 +207,7 @@ package body Sem_Warn is
return False;
else
-- Missing stubs elsewhere
-- Missing stubs elsewhere
return True;
end if;
@ -238,7 +237,6 @@ package body Sem_Warn is
if Present (Parameter_Specifications (Anod)) then
Parm := First (Parameter_Specifications (Anod));
while Present (Parm) loop
Defid := Defining_Identifier (Parm);
@ -265,9 +263,9 @@ package body Sem_Warn is
Prev : Node_Id;
begin
-- Examine parents to look for a library level package spec
-- But if we find a body or block or other similar construct
-- along the way, we cannot be referenced.
-- Examine parents to look for a library level package spec. But if
-- we find a body or block or other similar construct along the way,
-- we cannot be referenced.
Prev := Ent;
P := Parent (Ent);
@ -283,7 +281,8 @@ package body Sem_Warn is
-- consider this referenceable, since any instantiation will
-- have access to the entities in the generic package. Note
-- that the package itself may not be instantiated, but then
-- we will get a warning for the package entity
-- we will get a warning for the package entity.
-- Note that generic formal parameters are themselves not
-- publicly referenceable in an instance, and warnings on
-- them are useful.
@ -341,9 +340,9 @@ package body Sem_Warn is
-- Start of processing for Check_References
begin
-- No messages if warnings are suppressed, or if we have detected
-- any real errors so far (this last check avoids junk messages
-- resulting from errors, e.g. a subunit that is not loaded).
-- No messages if warnings are suppressed, or if we have detected any
-- real errors so far (this last check avoids junk messages resulting
-- from errors, e.g. a subunit that is not loaded).
if Warning_Mode = Suppress
or else Serious_Errors_Detected /= 0
@ -376,9 +375,9 @@ package body Sem_Warn is
(Ekind (E1) = E_Out_Parameter
and then not Is_Protected_Type (Current_Scope))
then
-- Post warning if this object not assigned. Note that we
-- do not consider the implicit initialization of an access
-- type to be the assignment of a value for this purpose.
-- Post warning if this object not assigned. Note that we do
-- not consider the implicit initialization of an access type
-- to be the assignment of a value for this purpose.
if Ekind (E1) = E_Out_Parameter
and then Present (Spec_Entity (E1))
@ -401,14 +400,13 @@ package body Sem_Warn is
and then Is_Access_Type (Etype (E1))
then
-- For access types, the only time we made a UR
-- entry was for a dereference, and so we post
-- the appropriate warning here (note that the
-- dereference may not be explicit in the source,
-- for example in the case of a dispatching call
-- with an anonymous access controlling formal, or
-- of an assignment of a pointer involving a
-- discriminant check on the designated object).
-- For access types, the only time we made a UR entry was
-- for a dereference, and so we post the appropriate warning
-- here (note that the dereference may not be explicit in
-- the source, for example in the case of a dispatching call
-- with an anonymous access controlling formal, or of an
-- assignment of a pointer involving discriminant check on
-- the designated object).
Error_Msg_NE ("& may be null?", UR, E1);
goto Continue;
@ -502,14 +500,13 @@ package body Sem_Warn is
UR := Expression (UR);
end loop;
-- Here we issue the warning, all checks completed
-- If the unset reference is prefix of a selected
-- component that comes from source, mention the
-- component as well. If the selected component comes
-- from expansion, all we know is that the entity is
-- not fully initialized at the point of the reference.
-- Locate an unintialized component to get a better
-- error message.
-- Here we issue the warning, all checks completed If the
-- unset reference is prefix of a selected component that
-- comes from source, mention the component as well. If the
-- selected component comes from expansion, all we know is
-- that the entity is not fully initialized at the point of
-- the reference. Locate an unintialized component to get a
-- better error message.
if Nkind (Parent (UR)) = N_Selected_Component then
Error_Msg_Node_2 := Selector_Name (Parent (UR));
@ -565,9 +562,9 @@ package body Sem_Warn is
and then Referenced_As_LHS (E1)))
-- Labels, and enumeration literals, and exceptions. The
-- warnings are also placed on local packages that cannot
-- be referenced from elsewhere, including those declared
-- within a package body.
-- warnings are also placed on local packages that cannot be
-- referenced from elsewhere, including those declared within a
-- package body.
and then (Is_Object (E1)
or else
@ -591,8 +588,8 @@ package body Sem_Warn is
or else Ekind (E) = E_Subprogram_Body
or else Ekind (E) = E_Block)))
-- Exclude instantiations, since there is no reason why
-- every entity in an instantiation should be referenced.
-- Exclude instantiations, since there is no reason why every
-- entity in an instantiation should be referenced.
and then Instantiation_Location (Sloc (E1)) = No_Location
@ -628,49 +625,49 @@ package body Sem_Warn is
and then not Is_Dispatching_Operation (E1)
-- Check entity that can be publicly referenced (we do not
-- give messages for such entities, since there could be
-- other units, not involved in this compilation, that
-- contain relevant references.
-- Check entity that can be publicly referenced (we do not give
-- messages for such entities, since there could be other
-- units, not involved in this compilation, that contain
-- relevant references.
and then not Publicly_Referenceable (E1)
-- Class wide types are marked as source entities, but
-- they are not really source entities, and are always
-- created, so we do not care if they are not referenced.
-- Class wide types are marked as source entities, but they are
-- not really source entities, and are always created, so we do
-- not care if they are not referenced.
and then Ekind (E1) /= E_Class_Wide_Type
-- Objects other than parameters of task types are allowed
-- to be non-referenced, since they start up tasks!
-- Objects other than parameters of task types are allowed to
-- be non-referenced, since they start up tasks!
and then ((Ekind (E1) /= E_Variable
and then Ekind (E1) /= E_Constant
and then Ekind (E1) /= E_Component)
or else not Is_Task_Type (Etype (E1)))
-- For subunits, only place warnings on the main unit
-- itself, since parent units are not completely compiled
-- For subunits, only place warnings on the main unit itself,
-- since parent units are not completely compiled
and then (Nkind (Unit (Cunit (Main_Unit))) /= N_Subunit
or else
Get_Source_Unit (E1) = Main_Unit)
then
-- Suppress warnings in internal units if not in -gnatg
-- mode (these would be junk warnings for an applications
-- program, since they refer to problems in internal units)
-- Suppress warnings in internal units if not in -gnatg mode
-- (these would be junk warnings for an applications program,
-- since they refer to problems in internal units)
if GNAT_Mode
or else not
Is_Internal_File_Name
(Unit_File_Name (Get_Source_Unit (E1)))
then
-- We do not immediately flag the error. This is because
-- we have not expanded generic bodies yet, and they may
-- have the missing reference. So instead we park the
-- entity on a list, for later processing. However, for
-- the accept case, post the error right here, since we
-- have the information now in this case.
-- We do not immediately flag the error. This is because we
-- have not expanded generic bodies yet, and they may have
-- the missing reference. So instead we park the entity on a
-- list, for later processing. However, for the accept case,
-- post the error right here, since we have the information
-- now in this case.
if Present (Anod) then
Output_Reference_Error ("& is not referenced?");
@ -682,10 +679,10 @@ package body Sem_Warn is
end if;
end if;
-- Generic units are referenced in the generic body,
-- but if they are not public and never instantiated
-- we want to force a warning on them. We treat them
-- as redundant constructs to minimize noise.
-- Generic units are referenced in the generic body, but if they
-- are not public and never instantiated we want to force a
-- warning on them. We treat them as redundant constructs to
-- minimize noise.
elsif Is_Generic_Subprogram (E1)
and then not Is_Instantiated (E1)
@ -733,9 +730,9 @@ package body Sem_Warn is
return;
end if;
-- Ignore reference to non-scalar if not from source. Almost always
-- such references are bogus (e.g. calls to init procs to set
-- default discriminant values).
-- Ignore reference to non-scalar if not from source. Almost always such
-- references are bogus (e.g. calls to init procs to set default
-- discriminant values).
if not Comes_From_Source (N)
and then not Is_Scalar_Type (Etype (N))
@ -765,16 +762,16 @@ package body Sem_Warn is
(Sloc (N), Sloc (Unset_Reference (E))))
and then not Warnings_Off (E)
then
-- We may have an unset reference. The first test is
-- whether we are accessing a discriminant of a record
-- or a component with default initialization. Both of
-- these cases can be ignored, since the actual object
-- that is referenced is definitely initialized. Note
-- that this covers the case of reading discriminants
-- of an out parameter, which is OK even in Ada 83.
-- We may have an unset reference. The first test is whether
-- we are accessing a discriminant of a record or a
-- component with default initialization. Both of these
-- cases can be ignored, since the actual object that is
-- referenced is definitely initialized. Note that this
-- covers the case of reading discriminants of an out
-- parameter, which is OK even in Ada 83.
-- Note that we are only interested in a direct reference
-- to a record component here. If the reference is via an
-- Note that we are only interested in a direct reference to
-- a record component here. If the reference is via an
-- access type, then the access object is being referenced,
-- not the record, and still deserves an unset reference.
@ -797,11 +794,11 @@ package body Sem_Warn is
-- Here we have a potential unset reference. But before we
-- get worried about it, we have to make sure that the
-- entity declaration is in the same procedure as the
-- reference, since if they are in separate procedures,
-- then we have no idea about sequential execution.
-- reference, since if they are in separate procedures, then
-- we have no idea about sequential execution.
-- The tests in the loop below catch all such cases, but
-- do allow the reference to appear in a loop, block, or
-- The tests in the loop below catch all such cases, but do
-- allow the reference to appear in a loop, block, or
-- package spec that is nested within the declaring scope.
-- As always, it is possible to construct cases where the
-- warning is wrong, that is why it is a warning!
@ -824,25 +821,29 @@ package body Sem_Warn is
SR := Scope (SR);
end loop;
-- Case of reference has an access type. This is a
-- special case since access types are always set to
-- null so cannot be truly uninitialized, but we still
-- want to warn about cases of obvious null dereference.
-- Case of reference has an access type. This is special
-- case since access types are always set to null so
-- cannot be truly uninitialized, but we still want to
-- warn about cases of obvious null dereference.
if Is_Access_Type (Etype (N)) then
declare
Access_Type_Case : declare
P : Node_Id;
function Process
(N : Node_Id)
return Traverse_Result;
-- Process function for instantation of Traverse
-- below. Checks if N contains reference to E
-- other than a dereference.
-- below. Checks if N contains reference to other
-- than a dereference.
function Ref_In (Nod : Node_Id) return Boolean;
-- Determines whether Nod contains a reference
-- to the entity E that is not a dereference.
-- Determines whether Nod contains a reference to
-- the entity E that is not a dereference.
-------------
-- Process --
-------------
function Process
(N : Node_Id)
@ -859,13 +860,18 @@ package body Sem_Warn is
end if;
end Process;
------------
-- Ref_In --
------------
function Ref_In (Nod : Node_Id) return Boolean is
function Traverse is new Traverse_Func (Process);
begin
return Traverse (Nod) = Abandon;
end Ref_In;
-- Start of processing for Access_Type_Case
begin
-- Don't bother if we are inside an instance,
-- since the compilation of the generic template
@ -918,7 +924,7 @@ package body Sem_Warn is
return;
end if;
end loop;
end;
end Access_Type_Case;
end if;
-- Here we definitely have a case for giving a warning
@ -1035,7 +1041,6 @@ package body Sem_Warn is
begin
if Nkind (N) = N_Use_Package_Clause then
Nam := First (Names (N));
while Present (Nam) loop
if Entity (Nam) = Pack then
Error_Msg_Qual_Level := 1;
@ -1056,7 +1061,6 @@ package body Sem_Warn is
begin
E := First_Entity (Pack);
while Present (E) loop
if Referenced (E) then
return;
@ -1065,9 +1069,9 @@ package body Sem_Warn is
Next_Entity (E);
end loop;
-- No entities of the package are referenced. Check whether
-- the reference to the package itself is a use clause, and
-- if so place a warning on it.
-- No entities of the package are referenced. Check whether the
-- reference to the package itself is a use clause, and if so
-- place a warning on it.
Check_Use_Clauses (Un);
end Check_Inner_Package;
@ -1085,7 +1089,6 @@ package body Sem_Warn is
and then Present_System_Aux
then
Ent := First_Entity (System_Aux_Id);
while Present (Ent) loop
if Referenced (Ent) then
return True;
@ -1111,8 +1114,8 @@ package body Sem_Warn is
begin
Is_Visible_Renaming := False;
E1 := First_Entity (P);
E1 := First_Entity (P);
while Present (E1) loop
if Ekind (E1) = E_Package
and then Renamed_Object (E1) = L
@ -1143,17 +1146,17 @@ package body Sem_Warn is
begin
Cnode := Cunit (Unit);
-- Only do check in units that are part of the extended main
-- unit. This is actually a necessary restriction, because in
-- the case of subprogram acting as its own specification,
-- there can be with's in subunits that we will not see.
-- Only do check in units that are part of the extended main unit.
-- This is actually a necessary restriction, because in the case of
-- subprogram acting as its own specification, there can be with's in
-- subunits that we will not see.
if not In_Extended_Main_Source_Unit (Cnode) then
return;
-- In configurable run time mode, we remove the bodies of
-- non-inlined subprograms, which may lead to spurious warnings,
-- which are clearly undesirable.
-- In configurable run time mode, we remove the bodies of non-inlined
-- subprograms, which may lead to spurious warnings, which are
-- clearly undesirable.
elsif Configurable_Run_Time_Mode
and then Is_Predefined_File_Name (Unit_File_Name (Unit))
@ -1175,16 +1178,16 @@ package body Sem_Warn is
if not Referenced (Lunit) then
-- Suppress warnings in internal units if not in -gnatg
-- mode (these would be junk warnings for an applications
-- program, since they refer to problems in internal units)
-- Suppress warnings in internal units if not in -gnatg mode
-- (these would be junk warnings for an application program,
-- since they refer to problems in internal units)
if GNAT_Mode
or else not Is_Internal_File_Name (Unit_File_Name (Unit))
then
-- Here we definitely have a non-referenced unit. If
-- it is the special call for a spec unit, then just
-- set the flag to be read later.
-- Here we definitely have a non-referenced unit. If it
-- is the special call for a spec unit, then just set the
-- flag to be read later.
if Unit = Spec_Unit then
Set_Unreferenced_In_Spec (Item);
@ -1205,26 +1208,26 @@ package body Sem_Warn is
then
null;
-- If this unit is referenced, and it is a package, we
-- do another test, to see if any of the entities in the
-- package are referenced. If none of the entities are
-- referenced, we still post a warning. This occurs if
-- the only use of the package is in a use clause, or
-- in a package renaming declaration.
-- If this unit is referenced, and it is a package, we do
-- another test, to see if any of the entities in the package
-- are referenced. If none of the entities are referenced, we
-- still post a warning. This occurs if the only use of the
-- package is in a use clause, or in a package renaming
-- declaration.
elsif Ekind (Lunit) = E_Package then
-- If Is_Instantiated is set, it means that the package
-- is implicitly instantiated (this is the case of a
-- parent instance or an actual for a generic package
-- formal), and this counts as a reference.
-- If Is_Instantiated is set, it means that the package is
-- implicitly instantiated (this is the case of parent
-- instance or an actual for a generic package formal), and
-- this counts as a reference.
if Is_Instantiated (Lunit) then
null;
-- If no entities in package, and there is a pragma
-- Elaborate_Body present, then assume that this with
-- is done for purposes of this elaboration.
-- Elaborate_Body present, then assume that this with is
-- done for purposes of this elaboration.
elsif No (First_Entity (Lunit))
and then Has_Pragma_Elaborate_Body (Lunit)
@ -1234,12 +1237,16 @@ package body Sem_Warn is
-- Otherwise see if any entities have been referenced
else
Ent := First_Entity (Lunit);
if Limited_Present (Item) then
Ent := First_Entity (Limited_View (Lunit));
else
Ent := First_Entity (Lunit);
end if;
loop
-- No more entities, and we did not find one
-- that was referenced. Means we have a definite
-- case of a with none of whose entities was
-- referenced.
-- No more entities, and we did not find one that was
-- referenced. Means we have a definite case of a with
-- none of whose entities was referenced.
if No (Ent) then
@ -1258,10 +1265,10 @@ package body Sem_Warn is
("no entities of & are referenced?",
Name (Item));
-- Look for renamings of this package, and
-- flag them as well. If the original package
-- has warnings off, we suppress the warning
-- on the renaming as well.
-- Look for renamings of this package, and flag
-- them as well. If the original package has
-- warnings off, we suppress the warning on the
-- renaming as well.
Pack := Find_Package_Renaming (Munite, Lunit);
@ -1282,16 +1289,16 @@ package body Sem_Warn is
elsif Referenced (Ent)
or else Referenced_As_LHS (Ent)
then
-- This means that the with is indeed fine, in
-- that it is definitely needed somewhere, and
-- we can quite worrying about this one.
-- This means that the with is indeed fine, in that
-- it is definitely needed somewhere, and we can
-- quite worrying about this one.
-- Except for one little detail, if either of
-- the flags was set during spec processing,
-- this is where we complain that the with
-- could be moved from the spec. If the spec
-- contains a visible renaming of the package,
-- inhibit warning to move with_clause to body.
-- Except for one little detail, if either of the
-- flags was set during spec processing, this is
-- where we complain that the with could be moved
-- from the spec. If the spec contains a visible
-- renaming of the package, inhibit warning to move
-- with_clause to body.
if Ekind (Munite) = E_Package_Body then
Pack :=
@ -1334,8 +1341,8 @@ package body Sem_Warn is
end if;
-- For a generic package, the only interesting kind of
-- reference is an instantiation, since entities cannot
-- be referenced directly.
-- reference is an instantiation, since entities cannot be
-- referenced directly.
elsif Is_Generic_Unit (Lunit) then
@ -1350,9 +1357,9 @@ package body Sem_Warn is
("unit& is never instantiated?", Name (Item));
end if;
-- If unit was indeed instantiated, make sure that
-- flag is not set showing it was uninstantiated in
-- the spec, and if so, give warning.
-- If unit was indeed instantiated, make sure that flag is
-- not set showing it was uninstantiated in the spec, and if
-- so, give warning.
elsif Unreferenced_In_Spec (Item) then
Error_Msg_N
@ -1377,11 +1384,11 @@ package body Sem_Warn is
return;
end if;
-- Flag any unused with clauses, but skip this step if we are
-- compiling a subunit on its own, since we do not have enough
-- information to determine whether with's are used. We will get
-- the relevant warnings when we compile the parent. This is the
-- normal style of GNAT compilation in any case.
-- Flag any unused with clauses, but skip this step if we are compiling
-- a subunit on its own, since we do not have enough information to
-- determine whether with's are used. We will get the relevant warnings
-- when we compile the parent. This is the normal style of GNAT
-- compilation in any case.
if Nkind (Unit (Cunit (Main_Unit))) = N_Subunit then
return;
@ -1417,7 +1424,6 @@ package body Sem_Warn is
else
S := Scope (E);
loop
if S = Standard_Standard then
return False;
@ -1500,8 +1506,8 @@ package body Sem_Warn is
when E_Variable =>
-- Case of variable that is assigned but not read. We
-- suppress the message if the variable is volatile,
-- has an address clause, or is imported.
-- suppress the message if the variable is volatile, has an
-- address clause, or is imported.
if Referenced_As_LHS (E)
and then No (Address_Clause (E))
@ -1511,8 +1517,8 @@ package body Sem_Warn is
and then not Is_Imported (E)
-- Suppress the message for aliased or renamed
-- variables, since there may be other entities
-- read the same memory location.
-- variables, since there may be other entities read
-- the same memory location.
and then not Is_Aliased (E)
and then No (Renamed_Object (E))
@ -1784,8 +1790,8 @@ package body Sem_Warn is
P : Node_Id;
begin
-- Argument replacement in an inlined body can make conditions
-- static. Do not emit warnings in this case.
-- Argument replacement in an inlined body can make conditions static.
-- Do not emit warnings in this case.
if In_Inlined_Body then
return;