Commit e26ceb28 by Richard Stallman

(yylex): Handle i together with f or l in float constant.

From-SVN: r5501
parent 2da63e2a
...@@ -1477,46 +1477,85 @@ yylex () ...@@ -1477,46 +1477,85 @@ yylex ()
} }
else else
{ {
int fflag = 0, lflag = 0;
/* Copy token_buffer now, while it has just the number
and not the suffixes; once we add `f' or `i',
REAL_VALUE_ATOF may not work any more. */
char *copy = (char *) alloca (p - token_buffer + 1);
bcopy (token_buffer, copy, p - token_buffer + 1);
set_float_handler (handler); set_float_handler (handler);
/* The second argument, machine_mode, of REAL_VALUE_ATOF tells the while (1)
desired precision of the binary result of decimal-to-binary conversion. */ {
int lose = 0;
/* Read the suffixes to choose a data type. */ /* Read the suffixes to choose a data type. */
switch (c) switch (c)
{ {
case 'f': case 'F': case 'f': case 'F':
type = float_type_node; if (fflag)
value = REAL_VALUE_ATOF (token_buffer, TYPE_MODE (type)); error ("more than one `f' in numeric constant");
if (TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT fflag = 1;
&& REAL_VALUE_ISINF (value) && pedantic)
pedwarn ("floating point number exceeds range of `float'");
garbage_chars = -1;
break; break;
case 'l': case 'L': case 'l': case 'L':
type = long_double_type_node; if (lflag)
value = REAL_VALUE_ATOF (token_buffer, TYPE_MODE (type)); error ("more than one `l' in numeric constant");
if (TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT lflag = 1;
&& REAL_VALUE_ISINF (value) && pedantic)
pedwarn (
"floating point number exceeds range of `long double'");
garbage_chars = -1;
break; break;
case 'i': case 'I': case 'i': case 'I':
if (imag) if (imag)
error ("more than one `i' or `j' in numeric constant"); error ("more than one `i' or `j' in numeric constant");
imag = 1; imag = 1;
garbage_chars = -1;
break; break;
default: default:
value = REAL_VALUE_ATOF (token_buffer, TYPE_MODE (type)); lose = 1;
}
if (lose)
break;
if (p >= token_buffer + maxtoken - 3)
p = extend_token_buffer (p);
*p++ = c;
*p = 0;
c = getc (finput);
}
/* The second argument, machine_mode, of REAL_VALUE_ATOF
tells the desired precision of the binary result
of decimal-to-binary conversion. */
if (fflag)
{
if (lflag)
error ("both `f' and `l' in floating constant");
type = float_type_node;
value = REAL_VALUE_ATOF (copy, TYPE_MODE (type));
if (TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT
&& REAL_VALUE_ISINF (value) && pedantic)
pedwarn ("floating point number exceeds range of `float'");
}
else if (lflag)
{
type = long_double_type_node;
value = REAL_VALUE_ATOF (copy, TYPE_MODE (type));
if (TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT
&& REAL_VALUE_ISINF (value) && pedantic)
pedwarn ("floating point number exceeds range of `long double'");
}
else
{
value = REAL_VALUE_ATOF (copy, TYPE_MODE (type));
if (TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT if (TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT
&& REAL_VALUE_ISINF (value) && pedantic) && REAL_VALUE_ISINF (value) && pedantic)
pedwarn ("floating point number exceeds range of `double'"); pedwarn ("floating point number exceeds range of `double'");
} }
set_float_handler (NULL_PTR); set_float_handler (NULL_PTR);
} }
#ifdef ERANGE #ifdef ERANGE
...@@ -1533,7 +1572,7 @@ yylex () ...@@ -1533,7 +1572,7 @@ yylex ()
} }
} }
#endif #endif
/* Note: garbage_chars is -1 if first char is *not* garbage. */ garbage_chars = 0;
while (isalnum (c) || c == '.' || c == '_' while (isalnum (c) || c == '.' || c == '_'
|| (!flag_traditional && (c == '+' || c == '-') || (!flag_traditional && (c == '+' || c == '-')
&& (p[-1] == 'e' || p[-1] == 'E'))) && (p[-1] == 'e' || p[-1] == 'E')))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment