Commit 0ebf09ed by Justin Squirek Committed by Pierre-Marie de Rodat

[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  <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
parent cec0185c
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.
......
......@@ -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);
......
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,
......
-- { 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;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment