cpplib.h (CPP_N_DFLOAT): New.

* include/cpplib.h (CPP_N_DFLOAT): New.
	* expr.c (interpret_float_suffix): Identify df, dd, and dl
	suffixes as decimal floating point constants.
	(cpp_classify_number): Disallow hexadecimal DFP constants.

Co-Authored-By: Ben Elliston <bje@au.ibm.com>

From-SVN: r108133
This commit is contained in:
Jon Grimm 2005-12-06 23:13:15 +00:00 committed by Ben Elliston
parent 2b948876d8
commit ad6ed77efd
3 changed files with 31 additions and 2 deletions

View File

@ -1,3 +1,11 @@
2005-12-07 Jon Grimm <jgrimm2@us.ibm.com>
Ben Elliston <bje@au.ibm.com>
* include/cpplib.h (CPP_N_DFLOAT): New.
* expr.c (interpret_float_suffix): Identify df, dd, and dl
suffixes as decimal floating point constants.
(cpp_classify_number): Disallow hexadecimal DFP constants.
2005-11-14 Gerald Pfeifer <gerald@pfeifer.com>
Ian Lance Taylor <ian@airs.com>

View File

@ -82,7 +82,7 @@ static void check_promotion (cpp_reader *, const struct op *);
static unsigned int
interpret_float_suffix (const uchar *s, size_t len)
{
size_t f = 0, l = 0, i = 0;
size_t f = 0, l = 0, i = 0, d = 0;
while (len--)
switch (s[len])
@ -91,6 +91,12 @@ interpret_float_suffix (const uchar *s, size_t len)
case 'l': case 'L': l++; break;
case 'i': case 'I':
case 'j': case 'J': i++; break;
case 'd': case 'D':
/* Disallow fd, ld suffixes. */
if (d && (f || l))
return 0;
d++;
break;
default:
return 0;
}
@ -98,9 +104,14 @@ interpret_float_suffix (const uchar *s, size_t len)
if (f + l > 1 || i > 1)
return 0;
/* Allow dd, df, dl suffixes for decimal float constants. */
if (d && ((d + f + l != 2) || i))
return 0;
return ((i ? CPP_N_IMAGINARY : 0)
| (f ? CPP_N_SMALL :
l ? CPP_N_LARGE : CPP_N_MEDIUM));
l ? CPP_N_LARGE : CPP_N_MEDIUM)
| (d ? CPP_N_DFLOAT : 0));
}
/* Subroutine of cpp_classify_number. S points to an integer suffix
@ -250,6 +261,15 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token)
"traditional C rejects the \"%.*s\" suffix",
(int) (limit - str), str);
/* Radix must be 10 for decimal floats. */
if ((result & CPP_N_DFLOAT) && radix != 10)
{
cpp_error (pfile, CPP_DL_ERROR,
"invalid suffix \"%.*s\" with hexadecimal floating constant",
(int) (limit - str), str);
return CPP_N_INVALID;
}
result |= CPP_N_FLOATING;
}
else

View File

@ -743,6 +743,7 @@ struct cpp_num
#define CPP_N_UNSIGNED 0x1000 /* Properties. */
#define CPP_N_IMAGINARY 0x2000
#define CPP_N_DFLOAT 0x4000
/* Classify a CPP_NUMBER token. The return value is a combination of
the flags from the above sets. */