[Ada] Spurious ineffective use_clause warning
authorJustin Squirek <squirek@adacore.com>
Wed, 18 Sep 2019 08:33:23 +0000 (08:33 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Wed, 18 Sep 2019 08:33:23 +0000 (08:33 +0000)
This patch fixes an issue whereby expansion of post conditions may lead
to spurious ineffective use_clause warnings when a use type clause is
present in a package specification and a use package clause exists in
the package body on the package containing said type.

2019-09-18  Justin Squirek  <squirek@adacore.com>

gcc/ada/

* sem_ch8.adb (Use_One_Type): Add guard to prevent warning on a
reundant use package clause where there is no previous
use_clause in the chain.

gcc/testsuite/

* gnat.dg/warn30.adb, gnat.dg/warn30.ads: New testcase.

From-SVN: r275861

gcc/ada/ChangeLog
gcc/ada/sem_ch8.adb
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/warn30.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/warn30.ads [new file with mode: 0644]

index cbb1e1639600e656c1666bccd9b1e24209f620b3..682397277cc40a450b37b37a1f4af6921a7569a2 100644 (file)
@@ -1,3 +1,9 @@
+2019-09-18  Justin Squirek  <squirek@adacore.com>
+
+       * sem_ch8.adb (Use_One_Type): Add guard to prevent warning on a
+       reundant use package clause where there is no previous
+       use_clause in the chain.
+
 2019-09-18  Justin Squirek  <squirek@adacore.com>
 
        * exp_ch4.adb (Expand_N_Type_Conversion): Add calculation of an
index a7918dacbcf5ede80f994a9d2758519246c16d67..5d03f835c8bd1ed48093e7f1f776b336e5a1a9ee 100644 (file)
@@ -10337,11 +10337,18 @@ package body Sem_Ch8 is
          --  The package where T is declared is already used
 
          elsif In_Use (Scope (T)) then
-            Error_Msg_Sloc :=
-              Sloc (Find_Most_Prev (Current_Use_Clause (Scope (T))));
-            Error_Msg_NE -- CODEFIX
-              ("& is already use-visible through package use clause #??",
-               Id, T);
+            --  Due to expansion of contracts we could be attempting to issue
+            --  a spurious warning - so verify there is a previous use clause.
+
+            if Current_Use_Clause (Scope (T)) /=
+                 Find_Most_Prev (Current_Use_Clause (Scope (T)))
+            then
+               Error_Msg_Sloc :=
+                 Sloc (Find_Most_Prev (Current_Use_Clause (Scope (T))));
+               Error_Msg_NE -- CODEFIX
+                 ("& is already use-visible through package use clause #??",
+                  Id, T);
+            end if;
 
          --  The current scope is the package where T is declared
 
index bf677223c321b55ed842f8fee0df751dea3614dc..e9966b28145cc980a2b85b572d6926a964b57fbf 100644 (file)
@@ -1,3 +1,7 @@
+2019-09-18  Justin Squirek  <squirek@adacore.com>
+
+       * gnat.dg/warn30.adb, gnat.dg/warn30.ads: New testcase.
+
 2019-09-18  Justin Squirek  <squirek@adacore.com>
 
        * gnat.dg/access8.adb, gnat.dg/access8_pkg.adb,
diff --git a/gcc/testsuite/gnat.dg/warn30.adb b/gcc/testsuite/gnat.dg/warn30.adb
new file mode 100644 (file)
index 0000000..841c70e
--- /dev/null
@@ -0,0 +1,10 @@
+--  { dg-do compile }
+--  { dg-options "-gnatwa" }
+with Interfaces; use Interfaces;
+
+package body Warn30 is
+   procedure Incr (X : in out Interfaces.Integer_64) is
+   begin
+      X := X + 1;
+   end Incr;
+end Warn30;
\ No newline at end of file
diff --git a/gcc/testsuite/gnat.dg/warn30.ads b/gcc/testsuite/gnat.dg/warn30.ads
new file mode 100644 (file)
index 0000000..3b60816
--- /dev/null
@@ -0,0 +1,6 @@
+with Interfaces; use type Interfaces.Integer_64;
+
+package Warn30 is
+   procedure Incr (X : in out Interfaces.Integer_64) with
+     Post => X = X'Old + 1;
+end Warn30;