c-tree.h (warn_float_equal): Declare.
authorDirk Zoller <duz@rtsffm.com>
Thu, 30 Sep 1999 06:19:54 +0000 (06:19 +0000)
committerJeff Law <law@gcc.gnu.org>
Thu, 30 Sep 1999 06:19:54 +0000 (00:19 -0600)
        * c-tree.h (warn_float_equal): Declare.
        * c-decl.c (warn_float_equal): Define.
        (c_decode_option): Recognize -W[no-]float-equal.
        * c-typeck.c (build_binary_op): Conditionally warn
        about equality tests of floating point types.
        * toplev.c (documented_lan_options): Add -W[no-]float-equal.

From-SVN: r29722

gcc/ChangeLog
gcc/c-decl.c
gcc/c-tree.h
gcc/c-typeck.c
gcc/toplev.c

index ced478aa943a2fb1b296e34caa66a83cd3b02b44..08eecb4a7215115e65cda1be0eae9a8baef85a46 100644 (file)
@@ -1,3 +1,12 @@
+Thu Sep 30 00:13:27 1999  Dirk Zoller  <duz@rtsffm.com>
+
+       * c-tree.h (warn_float_equal): Declare.
+       * c-decl.c (warn_float_equal): Define.
+       (c_decode_option): Recognize -W[no-]float-equal.
+       * c-typeck.c (build_binary_op): Conditionally warn
+       about equality tests of floating point types.
+       * toplev.c (documented_lan_options): Add -W[no-]float-equal.
+
 Wed Sep 29 23:43:39 1999  Jeffrey A Law  (law@cygnus.com)
 
        * cse.c (struct set): Delete inner_dest_loc field. 
index 433030db2fa729e93fcdc07f21127d94f4b92ceb..ca8f26b88c082de92b5ddc5e6a66d4828b43d32e 100644 (file)
@@ -446,6 +446,10 @@ int warn_unknown_pragmas = 0; /* Tri state variable.  */
 
 int warn_sign_compare = -1;
 
+/* Warn about testing equality of floating point numbers. */
+
+int warn_float_equal = 0;
+
 /* Nonzero means warn about use of multicharacter literals.  */
 
 int warn_multichar = 1;
@@ -724,6 +728,10 @@ c_decode_option (argc, argv)
     warn_sign_compare = 1;
   else if (!strcmp (p, "-Wno-sign-compare"))
     warn_sign_compare = 0;
+  else if (!strcmp (p, "-Wfloat-equal"))
+    warn_float_equal = 1;
+  else if (!strcmp (p, "-Wno-float-equal"))
+    warn_float_equal = 0;
   else if (!strcmp (p, "-Wmultichar"))
     warn_multichar = 1;
   else if (!strcmp (p, "-Wno-multichar"))
index 44ec800cc00848709880f27b1ce1a0808ad24ef5..0d2dd63715ce156beea737649e7558255a8aa50f 100644 (file)
@@ -422,6 +422,10 @@ extern int warn_missing_braces;
 
 extern int warn_sign_compare;
 
+/* Warn about testing equality of floating point numbers. */
+
+extern int warn_float_equal;
+
 /* Warn about multicharacter constants.  */
 
 extern int warn_multichar;
index 07836838f41469f7c16eed300ac4cf1470255b09..0d6ec004946880b55facf850610acac9132f0605 100644 (file)
@@ -2099,6 +2099,8 @@ build_binary_op (code, orig_op0, orig_op1, convert_p)
 
     case EQ_EXPR:
     case NE_EXPR:
+      if (warn_float_equal && (code0 == REAL_TYPE || code1 == REAL_TYPE))
+       warning ("comparing floating point with == or != is unsafe");
       /* Result of comparison is always int,
         but don't convert the args to int!  */
       build_type = integer_type_node;
index b4e65c7ff7cbc0edc8c7a5915d9450ad35d82f06..99efdb3db99a69442eb517b7234ab4d9984254d7 100644 (file)
@@ -1100,6 +1100,8 @@ documented_lang_options[] =
   { "-Wno-redundant-decls", "" },
   { "-Wsign-compare", "Warn about signed/unsigned comparisons" },
   { "-Wno-sign-compare", "" },
+  { "-Wfloat-equal", "Warn about testing equality of floating point numbers" },
+  { "-Wno-float-equal", "" },
   { "-Wunknown-pragmas", "Warn about unrecognised pragmas" },
   { "-Wno-unknown-pragmas", "" },
   { "-Wstrict-prototypes", "Warn about non-prototyped function decls" },