From f6640da5cd79f99e92ea7e78af48b3fcef430a3f Mon Sep 17 00:00:00 2001 From: pmderodat Date: Wed, 26 Sep 2018 09:19:53 +0000 Subject: [PATCH] [Ada] Spurious ineffective use_clause warning 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 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@264635 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ada/ChangeLog | 6 ++++++ gcc/ada/sem_ch8.adb | 10 +++++++++- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gnat.dg/warn16.adb | 38 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gnat.dg/warn16.adb diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 5e0adf4bab6..f460963d590 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,9 @@ +2018-09-26 Justin Squirek + + * sem_ch8.adb (Analyze_Subprogram_Renaming): Add extra condition + to check for unmarked subprogram references coming from + renamings. + 2018-09-26 Arnaud Charlet * back_end.adb (Scan_Compiler_Arguments): Store -G xxx switches. diff --git a/gcc/ada/sem_ch8.adb b/gcc/ada/sem_ch8.adb index f5381447b32..fb4dcb547f0 100644 --- a/gcc/ada/sem_ch8.adb +++ b/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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index cf904eb8466..be0c2c3d1ba 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2018-09-26 Justin Squirek + + * gnat.dg/warn16.adb: New testcase. + 2018-09-26 Hristian Kirtchev * 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 index 00000000000..cee84ddb2f2 --- /dev/null +++ b/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; -- 2.11.4.GIT