sem_warn.adb (Warn_On_Known_Condition): If the constant expression appears within...
authorEd Schonberg <schonberg@adacore.com>
Thu, 16 Jun 2005 08:46:48 +0000 (10:46 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Thu, 16 Jun 2005 08:46:48 +0000 (10:46 +0200)
2005-06-14  Ed Schonberg  <schonberg@adacore.com>

* sem_warn.adb (Warn_On_Known_Condition): If the constant expression
appears within a negation (either from source or as a rewriting of
inequality) adjust text of warning accordingly.

From-SVN: r101061

gcc/ada/sem_warn.adb

index 371060669cbf81bc219bcacc7720b6260b152655..28cb9ded1ee3f38e0d972659fd725f507d46ae54 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1999-2004 Free Software Foundation, Inc.          --
+--          Copyright (C) 1999-2005 Free Software Foundation, Inc.          --
 --                                                                          --
 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
 -- terms of the  GNU General Public License as published  by the Free Soft- --
@@ -1627,14 +1627,32 @@ package body Sem_Warn is
          end loop;
 
          --  Here we issue the warning unless some sub-operand has warnings
-         --  set off, in which case we suppress the warning for the node.
+         --  set off, in which case we suppress the warning for the node. If
+         --  the original expression is an inequality, it has been expanded
+         --  into a negation, and the value of the original expression is the
+         --  negation of the equality. If the expression is an entity that
+         --  appears within a negation, it is clearer to flag the negation
+         --  itself, and report on its constant value.
 
          if not Operand_Has_Warnings_Suppressed (C) then
-            if Entity (C) = Standard_True then
-               Error_Msg_N ("condition is always True?", C);
-            else
-               Error_Msg_N ("condition is always False?", C);
-            end if;
+            declare
+               True_Branch : Boolean := Entity (C) = Standard_True;
+               Cond        : Node_Id := C;
+
+            begin
+               if Present (Parent (C))
+                 and then Nkind (Parent (C)) = N_Op_Not
+               then
+                  True_Branch := not True_Branch;
+                  Cond        := Parent (C);
+               end if;
+
+               if True_Branch then
+                  Error_Msg_N ("condition is always True?", Cond);
+               else
+                  Error_Msg_N ("condition is always False?", Cond);
+               end if;
+            end;
          end if;
       end if;
    end Warn_On_Known_Condition;