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;
 

Reply via email to