diff options
author | rms <rms@138bc75d-0d04-0410-961f-82ee72b054a4> | 1993-09-28 01:02:31 +0000 |
---|---|---|
committer | rms <rms@138bc75d-0d04-0410-961f-82ee72b054a4> | 1993-09-28 01:02:31 +0000 |
commit | 594606db14c1d04991982a5c90af540c61852d28 (patch) | |
tree | c319633d9356c927ffd28ed1e6575c8757cdd3be /gcc/c-lex.c | |
parent | 8bb62f3d5ea76f0f4d73510a6a62fb15a0b5df4c (diff) | |
download | ppe42-gcc-594606db14c1d04991982a5c90af540c61852d28.tar.gz ppe42-gcc-594606db14c1d04991982a5c90af540c61852d28.zip |
(yylex): Handle i together with f or l in float constant.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@5501 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/c-lex.c')
-rw-r--r-- | gcc/c-lex.c | 117 |
1 files changed, 78 insertions, 39 deletions
diff --git a/gcc/c-lex.c b/gcc/c-lex.c index f5f88721ffd..fe59c1c130c 100644 --- a/gcc/c-lex.c +++ b/gcc/c-lex.c @@ -1477,47 +1477,86 @@ yylex () } 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); -/* The second argument, machine_mode, of REAL_VALUE_ATOF tells the - desired precision of the binary result of decimal-to-binary conversion. */ + while (1) + { + int lose = 0; - /* Read the suffixes to choose a data type. */ - switch (c) - { - case 'f': case 'F': - type = float_type_node; - value = REAL_VALUE_ATOF (token_buffer, TYPE_MODE (type)); - if (TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT - && REAL_VALUE_ISINF (value) && pedantic) - pedwarn ("floating point number exceeds range of `float'"); - garbage_chars = -1; - break; - - case 'l': case 'L': - type = long_double_type_node; - value = REAL_VALUE_ATOF (token_buffer, TYPE_MODE (type)); - if (TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT - && REAL_VALUE_ISINF (value) && pedantic) - pedwarn ( - "floating point number exceeds range of `long double'"); - garbage_chars = -1; - break; - - case 'i': case 'I': - if (imag) - error ("more than one `i' or `j' in numeric constant"); - imag = 1; - garbage_chars = -1; - break; - - default: - value = REAL_VALUE_ATOF (token_buffer, TYPE_MODE (type)); - if (TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT - && REAL_VALUE_ISINF (value) && pedantic) - pedwarn ("floating point number exceeds range of `double'"); - } - set_float_handler (NULL_PTR); + /* Read the suffixes to choose a data type. */ + switch (c) + { + case 'f': case 'F': + if (fflag) + error ("more than one `f' in numeric constant"); + fflag = 1; + break; + + case 'l': case 'L': + if (lflag) + error ("more than one `l' in numeric constant"); + lflag = 1; + break; + + case 'i': case 'I': + if (imag) + error ("more than one `i' or `j' in numeric constant"); + imag = 1; + break; + + default: + 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 + && REAL_VALUE_ISINF (value) && pedantic) + pedwarn ("floating point number exceeds range of `double'"); + } + + set_float_handler (NULL_PTR); } #ifdef ERANGE if (errno == ERANGE && !flag_traditional && pedantic) @@ -1533,7 +1572,7 @@ yylex () } } #endif - /* Note: garbage_chars is -1 if first char is *not* garbage. */ + garbage_chars = 0; while (isalnum (c) || c == '.' || c == '_' || (!flag_traditional && (c == '+' || c == '-') && (p[-1] == 'e' || p[-1] == 'E'))) |