This patch allows a better detection of unused formals in subprogram bodies. Previously the use of a formal as the selector in a parameter association was treated as a proper reference, thus missing otherwise unused entities.
The following command : gcc -c -gnatwa k.adb must yield: k.adb:2:22: warning: formal parameter "X" is not referenced --- procedure K is procedure Suspect (X : Integer) is begin for I in 1 .. 10 loop null; end loop; end; begin Suspect (X => 15); Suspect (X => 15); Suspect (X => 15); end; Tested on x86_64-pc-linux-gnu, committed on trunk 2011-09-06 Ed Schonberg <schonb...@adacore.com> * lib-xref.adb (OK_To_Set_Referenced): A reference to a formal in a parameter association must not set the Referenced flag on the formal. * prj-nmsc.adb (Check_File_Naming_Schemes): Remove useless formal
Index: prj-nmsc.adb =================================================================== --- prj-nmsc.adb (revision 178585) +++ prj-nmsc.adb (working copy) @@ -376,8 +376,7 @@ -- otherwise only those currently set in the Source_Names hash table. procedure Check_File_Naming_Schemes - (In_Tree : Project_Tree_Ref; - Project : Project_Processing_Data; + (Project : Project_Processing_Data; File_Name : File_Name_Type; Alternate_Languages : out Language_List; Language : out Language_Ptr; @@ -6619,8 +6618,7 @@ ------------------------------- procedure Check_File_Naming_Schemes - (In_Tree : Project_Tree_Ref; - Project : Project_Processing_Data; + (Project : Project_Processing_Data; File_Name : File_Name_Type; Alternate_Languages : out Language_List; Language : out Language_Ptr; @@ -6923,8 +6921,7 @@ if Check_Name then Check_File_Naming_Schemes - (In_Tree => Data.Tree, - Project => Project, + (Project => Project, File_Name => File_Name, Alternate_Languages => Alternate_Languages, Language => Language, Index: lib-xref.adb =================================================================== --- lib-xref.adb (revision 178578) +++ lib-xref.adb (working copy) @@ -512,6 +512,16 @@ return False; end if; end if; + + -- A reference to a formal in a named parameter association does + -- not make the formal referenced. Formals that are unused in the + -- subprogram body are properly flagged as such, even if calls + -- elsewhere use named notation. + + elsif Nkind (P) = N_Parameter_Association + and then N = Selector_Name (P) + then + return False; end if; end if;