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 <[email protected]>
* 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;