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 <squi...@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.
--- 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;