[Ada] Missing detection of unused with_clause
authorArnaud Charlet <charlet@adacore.com>
Fri, 28 Aug 2020 12:20:44 +0000 (08:20 -0400)
committerPierre-Marie de Rodat <derodat@adacore.com>
Fri, 23 Oct 2020 08:24:50 +0000 (04:24 -0400)
gcc/ada/

* sem_ch4.adb (Complete_Object_Operation): Only mark entities
referenced if we are compiling the extended main unit.
* sem_attr.adb (Analyze_Attribute [Attribute_Tag]): Record a
reference on the type and its scope.

gcc/ada/sem_attr.adb
gcc/ada/sem_ch4.adb

index c80cc06804d1696f79b2e1f6c755baea9e6bea39..7a488a772034aba52716858e4900287680573577 100644 (file)
@@ -6288,6 +6288,15 @@ package body Sem_Attr is
 
          if Comes_From_Source (N) then
             Check_Not_Incomplete_Type;
+
+            --  'Tag requires visibility on the corresponding package holding
+            --  the tag, so record a reference here, to avoid spurious unused
+            --  with_clause reported when compiling the main unit.
+
+            if In_Extended_Main_Source_Unit (Current_Scope) then
+               Set_Referenced (P_Type, True);
+               Set_Referenced (Scope (P_Type), True);
+            end if;
          end if;
 
          --  Set appropriate type
index 61c7b4c42d49b78dc4a8b91a9fc7b3218ff0929b..8d743383075ad54a0b7c32b7eb7ab0eaa914d1ea 100644 (file)
@@ -9010,16 +9010,20 @@ package body Sem_Ch4 is
             Rewrite (First_Actual, Obj);
          end if;
 
-         --  The operation is obtained from the dispatch table and not by
-         --  visibility, and may be declared in a unit that is not explicitly
-         --  referenced in the source, but is nevertheless required in the
-         --  context of the current unit. Indicate that operation and its scope
-         --  are referenced, to prevent spurious and misleading warnings. If
-         --  the operation is overloaded, all primitives are in the same scope
-         --  and we can use any of them.
-
-         Set_Referenced (Entity (Subprog), True);
-         Set_Referenced (Scope (Entity (Subprog)), True);
+         if In_Extended_Main_Source_Unit (Current_Scope) then
+            --  The operation is obtained from the dispatch table and not by
+            --  visibility, and may be declared in a unit that is not
+            --  explicitly referenced in the source, but is nevertheless
+            --  required in the context of the current unit. Indicate that
+            --  operation and its scope are referenced, to prevent spurious and
+            --  misleading warnings. If the operation is overloaded, all
+            --  primitives are in the same scope and we can use any of them.
+            --  Don't do that outside the main unit since otherwise this will
+            --  e.g. prevent the detection of some unused with clauses.
+
+            Set_Referenced (Entity (Subprog), True);
+            Set_Referenced (Scope (Entity (Subprog)), True);
+         end if;
 
          Rewrite (Node_To_Replace, Call_Node);