@@ -29,6 +29,7 @@ with Einfo; use Einfo;
with Einfo.Utils; use Einfo.Utils;
with Elists; use Elists;
with Errout; use Errout;
+with Exp_Tss; use Exp_Tss;
with Lib.Util; use Lib.Util;
with Nlists; use Nlists;
with Opt; use Opt;
@@ -789,10 +790,15 @@ package body Lib.Xref is
elsif Kind = E_In_Out_Parameter
and then Is_Assignable (E)
then
- -- For sure this counts as a normal read reference
+ -- We count it as a read reference unless we're calling a
+ -- type support subprogram such as deep finalize.
- Set_Referenced (E);
- Set_Last_Assignment (E, Empty);
+ if not Is_Entity_Name (Name (Call))
+ or else Get_TSS_Name (Entity (Name (Call))) = TSS_Null
+ then
+ Set_Referenced (E);
+ Set_Last_Assignment (E, Empty);
+ end if;
-- We count it as being referenced as an out parameter if the
-- option is set to warn on all out parameters, except that we
From: Bob Duff <duff@adacore.com> For an actual passed as an 'in out' parameter of a type support subprogram such as deep finalize, do not count it as a read reference of the actual. Clearly these should not count. Furthermore, counting them causes different warnings in -gnatc mode compared to normal mode, because the calls only exist in normal mode, which would disable the warnings. Such warnings now occur in both modes, instead of just with -gnatc. gcc/ada/ * lib-xref.adb (Generate_Reference): Do not count it as a read reference if we're calling a TSS. Tested on x86_64-pc-linux-gnu, committed on master. --- gcc/ada/lib-xref.adb | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)