[Ada] Misleading warning on variable not assigned
authorEd Schonberg <schonberg@adacore.com>
Mon, 22 Jul 2019 13:57:51 +0000 (13:57 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Mon, 22 Jul 2019 13:57:51 +0000 (13:57 +0000)
This patch removes a warning on a referenced entity with no explicit
prior assignment, if the type of the entity has
Preelaborable_Initialixation, such as Exception_Occurrence.

2019-07-22  Ed Schonberg  <schonberg@adacore.com>

gcc/ada/

* sem_warn.adb (Check_References): Do not emit s warning on a
referenced entity with no explicit assignment if the type of the
entity has Preelaborable_Initialixation, such as
Exception_Occurrence.

gcc/testsuite/

* gnat.dg/warn25.adb: New testcase.

From-SVN: r273686

gcc/ada/ChangeLog
gcc/ada/sem_warn.adb
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/warn25.adb [new file with mode: 0644]

index ac990bee17cca6d93e0b0449a256d8f70bbb94c6..12ea5adb30e562b9aafe4a8ba9081169e1d4cc7c 100644 (file)
@@ -1,3 +1,10 @@
+2019-07-22  Ed Schonberg  <schonberg@adacore.com>
+
+       * sem_warn.adb (Check_References): Do not emit s warning on a
+       referenced entity with no explicit assignment if the type of the
+       entity has Preelaborable_Initialixation, such as
+       Exception_Occurrence.
+
 2019-07-22  Javier Miranda  <miranda@adacore.com>
 
        * exp_ch4.adb (Size_In_Storage_Elements): Improve the expansion
index 0e1e292bd796de0a1e3fb9d1986fd323636d5193..ab85162c786648a1542edee7c6bfbf07f5a948a5 100644 (file)
@@ -1413,9 +1413,13 @@ package body Sem_Warn is
                   goto Continue;
                end if;
 
-               --  Check for unset reference
+               --  Check for unset reference. If type of object has
+               --  preelaborable initialization, warning is misleading.
 
-               if Warn_On_No_Value_Assigned and then Present (UR) then
+               if Warn_On_No_Value_Assigned
+                 and then Present (UR)
+                 and then not Known_To_Have_Preelab_Init (Etype (E1))
+               then
 
                   --  For other than access type, go back to original node to
                   --  deal with case where original unset reference has been
index 079f6e9d6f3f4f7ffa12a77c88cef37a246029f5..c9679c756c8bb2b35d0e4e1c99766e51c4129dda 100644 (file)
@@ -1,3 +1,7 @@
+2019-07-22  Ed Schonberg  <schonberg@adacore.com>
+
+       * gnat.dg/warn25.adb: New testcase.
+
 2019-07-22  Yannick Moy  <moy@adacore.com>
 
        * gnat.dg/warn24.adb: New testcase.
diff --git a/gcc/testsuite/gnat.dg/warn25.adb b/gcc/testsuite/gnat.dg/warn25.adb
new file mode 100644 (file)
index 0000000..e784870
--- /dev/null
@@ -0,0 +1,23 @@
+--  { dg-do compile }
+--  { dg-options "-gnatwa" }
+
+with Ada.Exceptions;
+procedure Warn25 is
+    CASA_Unavailable : Ada.Exceptions.Exception_Occurrence;
+    use Ada.Exceptions;
+begin
+   while True loop
+    declare
+    begin
+       if Exception_Identity (CASA_Unavailable) = Null_Id then
+         exit;
+     end if;
+     exception
+       when E : others =>
+         Save_Occurrence (Source => E, Target => CASA_Unavailable);
+     end;
+   end loop;
+   if Exception_Identity (CASA_Unavailable) /= Null_Id then
+      Reraise_Occurrence (CASA_Unavailable);
+   end if;
+end;