[Ada] Spurious ineffective use_clause warning
authorJustin Squirek <squirek@adacore.com>
Wed, 26 Sep 2018 09:19:53 +0000 (09:19 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Wed, 26 Sep 2018 09:19:53 +0000 (09:19 +0000)
This patch fixes an issue whereby user-defined subprograms used as
generic actuals with corresponding formals containing other formal types
led to spurious ineffective use_clause warnings.

2018-09-26  Justin Squirek  <squirek@adacore.com>

gcc/ada/

* sem_ch8.adb (Analyze_Subprogram_Renaming): Add extra condition
to check for unmarked subprogram references coming from
renamings.

gcc/testsuite/

* gnat.dg/warn16.adb: New testcase.

From-SVN: r264635

gcc/ada/ChangeLog
gcc/ada/sem_ch8.adb
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/warn16.adb [new file with mode: 0644]

index 5e0adf4bab680ccbe1006a418e539b33a604902b..f460963d5902cf44aefdf69e090a1683a717f7ed 100644 (file)
@@ -1,3 +1,9 @@
+2018-09-26  Justin Squirek  <squirek@adacore.com>
+
+       * sem_ch8.adb (Analyze_Subprogram_Renaming): Add extra condition
+       to check for unmarked subprogram references coming from
+       renamings.
+
 2018-09-26  Arnaud Charlet  <charlet@adacore.com>
 
        * back_end.adb (Scan_Compiler_Arguments): Store -G xxx switches.
index f5381447b32867266247a9ed17edb0c3a22bbdf1..fb4dcb547f01c517165ff125e37b8e02163607c0 100644 (file)
@@ -3692,8 +3692,16 @@ package body Sem_Ch8 is
       --  and mark any use_package_clauses that affect the visibility of the
       --  implicit generic actual.
 
+      --  Also, we may be looking at an internal renaming of a user-defined
+      --  subprogram created for a generic formal subprogram association,
+      --  which will also have to be marked here. This can occur when the
+      --  corresponding formal subprogram contains references to other generic
+      --  formals.
+
       if Is_Generic_Actual_Subprogram (New_S)
-        and then (Is_Intrinsic_Subprogram (New_S) or else From_Default (N))
+        and then (Is_Intrinsic_Subprogram (New_S)
+                   or else From_Default (N)
+                   or else Nkind (N) = N_Subprogram_Renaming_Declaration)
       then
          Mark_Use_Clauses (New_S);
 
index cf904eb8466834218e07e88d2378b372e175f8c4..be0c2c3d1ba0df75ffde671ef156c3666c02c6f8 100644 (file)
@@ -1,3 +1,7 @@
+2018-09-26  Justin Squirek  <squirek@adacore.com>
+
+       * gnat.dg/warn16.adb: New testcase.
+
 2018-09-26  Hristian Kirtchev  <kirtchev@adacore.com>
 
        * gnat.dg/elab7.adb, gnat.dg/elab7_pkg1.adb,
diff --git a/gcc/testsuite/gnat.dg/warn16.adb b/gcc/testsuite/gnat.dg/warn16.adb
new file mode 100644 (file)
index 0000000..cee84dd
--- /dev/null
@@ -0,0 +1,38 @@
+--  { dg-do compile }
+--  { dg-options "-gnatwa" }
+
+procedure Warn16 is
+
+   package Define is
+      type Key_Type is record
+         Value : Integer := 0;
+      end record;
+
+      function "=" (Left  : in Key_Type;
+                    Right : in Key_Type)
+                    return Boolean;
+   end;
+   package body Define is
+      function "=" (Left  : in Key_Type;
+                    Right : in Key_Type)
+                    return Boolean is
+      begin
+         return Left.Value = Right.Value;
+      end;
+   end;
+
+   generic
+      type Key_Type is private;
+      with function "=" (Left  : in Key_Type;
+                         Right : in Key_Type)
+                         return Boolean;
+   package Oper is end;
+
+   use type Define.Key_Type; -- !!!
+
+   package Inst is new Oper (Key_Type => Define.Key_Type,
+                             "="      => "=");
+   pragma Unreferenced (Inst);
+begin
+   null;
+end;