diff mbox series

[Ada] Spurious ineffective use_clause warning

Message ID 20180926093430.GA126322@adacore.com
State New
Headers show
Series [Ada] Spurious ineffective use_clause warning | expand

Commit Message

Pierre-Marie de Rodat Sept. 26, 2018, 9:34 a.m. UTC
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.

Tested on x86_64-pc-linux-gnu, committed on trunk

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.
diff mbox series

Patch

--- gcc/ada/sem_ch8.adb
+++ gcc/ada/sem_ch8.adb
@@ -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);
 

--- /dev/null
new file mode 100644
+++ gcc/testsuite/gnat.dg/warn16.adb
@@ -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;