aboutsummaryrefslogtreecommitdiff
path: root/gcc/java/lex.c
diff options
context:
space:
mode:
authorTom Tromey <tromey@cygnus.com>2000-11-06 05:35:53 +0000
committerTom Tromey <tromey@gcc.gnu.org>2000-11-06 05:35:53 +0000
commit099a51500cccdff68d8dfeec726f29b60ad1d546 (patch)
treee88453b5e6bdbc6ca750c761f042b84588f3f601 /gcc/java/lex.c
parentf83c165658cdd9d8d658426f3b066b820113d6e0 (diff)
downloadgcc-099a51500cccdff68d8dfeec726f29b60ad1d546.zip
gcc-099a51500cccdff68d8dfeec726f29b60ad1d546.tar.gz
gcc-099a51500cccdff68d8dfeec726f29b60ad1d546.tar.bz2
lex.h (JAVA_FLOAT_RANGE_ERROR): Typo fix.
* 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
Diffstat (limited to 'gcc/java/lex.c')
-rw-r--r--gcc/java/lex.c34
1 files changed, 32 insertions, 2 deletions
diff --git a/gcc/java/lex.c b/gcc/java/lex.c
index 1450570..be1fcf8 100644
--- a/gcc/java/lex.c
+++ b/gcc/java/lex.c
@@ -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);
}