lex.h (JAVA_FLOAT_RANGE_ERROR): Typo fix.
authorTom Tromey <tromey@cygnus.com>
Mon, 6 Nov 2000 05:35:53 +0000 (05:35 +0000)
committerTom Tromey <tromey@gcc.gnu.org>
Mon, 6 Nov 2000 05:35:53 +0000 (05:35 +0000)
* lex.h (JAVA_FLOAT_RANGE_ERROR): Typo fix.
* lex.c (IS_ZERO): New define.
(java_perform_atof): Error on floating point underflow.

From-SVN: r37269

gcc/java/ChangeLog
gcc/java/lex.c
gcc/java/lex.h

index 5b77604a661ee3cd5835a2bbee754789c7a3df53..46fe17d1df2622be2c65c643cc80109809f390d7 100644 (file)
@@ -1,3 +1,9 @@
+2000-11-05  Tom Tromey  <tromey@cygnus.com>
+
+       * lex.h (JAVA_FLOAT_RANGE_ERROR): Typo fix.
+       * lex.c (IS_ZERO): New define.
+       (java_perform_atof): Error on floating point underflow.
+
 2000-11-04  Tom Tromey  <tromey@cygnus.com>
 
        * lex.c (java_parse_escape_sequence): Only read two octal
index 1450570806567dc0777240c33bfbf7afa6af3ff5..be1fcf8e76fa2d349b3031a4b62758d8070cf8ca 100644 (file)
@@ -774,6 +774,12 @@ struct jpa_args
   int number_beginning;
 };
 
+#ifdef REAL_ARITHMETIC
+#define IS_ZERO(X) (ereal_cmp (X, dconst0) == 0)
+#else
+#define IS_ZERO(X) ((X) == 0)
+#endif
+
 static void java_perform_atof  PARAMS ((PTR));
 
 static void
@@ -789,12 +795,36 @@ java_perform_atof (av)
   SET_REAL_VALUE_ATOF (value,
                       REAL_VALUE_ATOF (a->literal_token, TYPE_MODE (type)));
 
-  if (REAL_VALUE_ISINF (value)
-      || REAL_VALUE_ISNAN (value))
+  if (REAL_VALUE_ISINF (value) || REAL_VALUE_ISNAN (value))
     {
       JAVA_FLOAT_RANGE_ERROR ((a->fflag ? "float" : "double"));
       value = DCONST0;
     }
+  else if (IS_ZERO (value))
+    {
+      /* We check to see if the value is really 0 or if we've found an
+        underflow.  We do this in the most primitive imaginable way.  */
+      int really_zero = 1;
+      char *p = a->literal_token;
+      if (*p == '-')
+       ++p;
+      while (*p && *p != 'e' && *p != 'E')
+       {
+         if (*p != '0' && *p != '.')
+           {
+             really_zero = 0;
+             break;
+           }
+         ++p;
+       }
+      if (! really_zero)
+       {
+         int i = ctxp->c_line->current;
+         ctxp->c_line->current = number_beginning;
+         java_lex_error ("Floating point literal underflow", 0);
+         ctxp->c_line->current = i;
+       }
+    }
 
   SET_LVAL_NODE_TYPE (build_real (type, value), type);
 }
index b43061e45ee9e2bcfccfb3670dca397e7b25f87f..baa08c99e644ebe942e3f336bb4e01b3a0b52927 100644 (file)
@@ -234,7 +234,7 @@ extern void set_float_handler PARAMS ((jmp_buf));
     char msg [1024];                                                     \
     int i = ctxp->c_line->current;                                       \
     ctxp->c_line->current = number_beginning;                            \
-    sprintf (msg, "Floating pointer literal exceeds range of `%s'", (m)); \
+    sprintf (msg, "Floating point literal exceeds range of `%s'", (m)); \
     java_lex_error (msg, 0);                                             \
     ctxp->c_line->current = i;                                           \
   }