Add support for "d" floating-point suffix, as defined by draft N1312
of TR 24732. Emit pedantic warning if the feature is being used. Should solve GCC bug 39027. Obtained from: OpenBSD MFC after: 2 weeks
This commit is contained in:
parent
e4132b573c
commit
691f7fadcd
@ -640,6 +640,13 @@ interpret_float (const cpp_token *token, unsigned int flags)
|
||||
char *copy;
|
||||
size_t copylen;
|
||||
|
||||
/* Default (no suffix) is double. */
|
||||
if (flags & CPP_N_DEFAULT)
|
||||
{
|
||||
flags ^= CPP_N_DEFAULT;
|
||||
flags |= CPP_N_MEDIUM;
|
||||
}
|
||||
|
||||
/* Decode type based on width and properties. */
|
||||
if (flags & CPP_N_DFLOAT)
|
||||
if ((flags & CPP_N_WIDTH) == CPP_N_LARGE)
|
||||
|
@ -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, d = 0;
|
||||
size_t f = 0, l = 0, i = 0, d = 0, d0 = 0;
|
||||
|
||||
while (len--)
|
||||
switch (s[len])
|
||||
@ -101,7 +101,12 @@ interpret_float_suffix (const uchar *s, size_t len)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (f + l > 1 || i > 1)
|
||||
if (d == 1 && !f && !l) {
|
||||
d = 0;
|
||||
d0 = 1;
|
||||
}
|
||||
|
||||
if (f + d0 + l > 1 || i > 1)
|
||||
return 0;
|
||||
|
||||
/* Allow dd, df, dl suffixes for decimal float constants. */
|
||||
@ -110,7 +115,8 @@ interpret_float_suffix (const uchar *s, size_t len)
|
||||
|
||||
return ((i ? CPP_N_IMAGINARY : 0)
|
||||
| (f ? CPP_N_SMALL :
|
||||
l ? CPP_N_LARGE : CPP_N_MEDIUM)
|
||||
d0 ? CPP_N_MEDIUM :
|
||||
l ? CPP_N_LARGE : CPP_N_DEFAULT)
|
||||
| (d ? CPP_N_DFLOAT : 0));
|
||||
}
|
||||
|
||||
@ -261,6 +267,13 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token)
|
||||
"traditional C rejects the \"%.*s\" suffix",
|
||||
(int) (limit - str), str);
|
||||
|
||||
/* A suffix for double is a GCC extension via decimal float support.
|
||||
If the suffix also specifies an imaginary value we'll catch that
|
||||
later. */
|
||||
if ((result == CPP_N_MEDIUM) && CPP_PEDANTIC (pfile))
|
||||
cpp_error (pfile, CPP_DL_PEDWARN,
|
||||
"suffix for double constant is a GCC extension");
|
||||
|
||||
/* Radix must be 10 for decimal floats. */
|
||||
if ((result & CPP_N_DFLOAT) && radix != 10)
|
||||
{
|
||||
|
@ -749,6 +749,7 @@ struct cpp_num
|
||||
#define CPP_N_UNSIGNED 0x1000 /* Properties. */
|
||||
#define CPP_N_IMAGINARY 0x2000
|
||||
#define CPP_N_DFLOAT 0x4000
|
||||
#define CPP_N_DEFAULT 0x8000
|
||||
|
||||
/* Classify a CPP_NUMBER token. The return value is a combination of
|
||||
the flags from the above sets. */
|
||||
|
Loading…
Reference in New Issue
Block a user