diff mbox series

[Ada] Spurious ineffective with clause warnings on use type clause

Message ID 20200603100304.GA6642@adacore.com
State New
Headers show
Series [Ada] Spurious ineffective with clause warnings on use type clause | expand

Commit Message

Pierre-Marie de Rodat June 3, 2020, 10:03 a.m. UTC
This patch fixes an issue whereby the compiler generates spurious
ineffective with_clause warnings under -gnatwr when the only use of the
with'ed package occurs in a use_type clause in the context area of the
body of the target package and such use_type clause has multiple
prefixes.

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

2020-06-03  Justin Squirek  <squirek@adacore.com>

gcc/ada/

	* sem_ch10.adb (Process_Body_Clauses): Add loop to interate
	through all prefixes in a use_type clause so that all packages
	in the expanded name get examined for effectiveness.
diff mbox series

Patch

--- gcc/ada/sem_ch10.adb
+++ gcc/ada/sem_ch10.adb
@@ -320,7 +320,6 @@  package body Sem_Ch10 is
             Nam_Ent   : constant Entity_Id := Entity (Name (Clause));
             Cont_Item : Node_Id;
             Prag_Unit : Node_Id;
-            Subt_Mark : Node_Id;
             Use_Item  : Node_Id;
 
             function Same_Unit (N : Node_Id; P : Entity_Id) return Boolean;
@@ -390,12 +389,24 @@  package body Sem_Ch10 is
                elsif Nkind (Cont_Item) = N_Use_Type_Clause
                  and then not Used_Type_Or_Elab
                then
-                  Subt_Mark := Subtype_Mark (Cont_Item);
-                  if not Used_Type_Or_Elab
-                    and then Same_Unit (Prefix (Subt_Mark), Nam_Ent)
-                  then
-                     Used_Type_Or_Elab := True;
-                  end if;
+                  declare
+                     UE : Node_Id;
+
+                  begin
+                     --  Loop through prefixes looking for a match
+
+                     UE := Prefix (Subtype_Mark (Cont_Item));
+                     loop
+                        if not Used_Type_Or_Elab
+                          and then Same_Unit (UE, Nam_Ent)
+                        then
+                           Used_Type_Or_Elab := True;
+                        end if;
+
+                        exit when Nkind (UE) /= N_Expanded_Name;
+                        UE := Prefix (UE);
+                     end loop;
+                  end;
 
                --  Pragma Elaborate or Elaborate_All