mirror of git://gcc.gnu.org/git/gcc.git
re PR preprocessor/39559 (constants too large for intmax_t need pedwarns)
libcpp: PR preprocessor/39559 * expr.c (cpp_interpret_integer): Use a pedwarn for decimal constants larger than intmax_t in C99 mode. gcc/testsuite: * gcc.dg/c99-intconst-2.c: New test. From-SVN: r146777
This commit is contained in:
parent
a3710436b6
commit
f88d07724f
|
@ -1,3 +1,8 @@
|
||||||
|
2009-04-25 Joseph Myers <joseph@codesourcery.com>
|
||||||
|
|
||||||
|
PR preprocessor/39559
|
||||||
|
* gcc.dg/c99-intconst-2.c: New test.
|
||||||
|
|
||||||
2009-04-25 Jan Hubicka <jh@suse.cz>
|
2009-04-25 Jan Hubicka <jh@suse.cz>
|
||||||
|
|
||||||
* g++.dg/tree-ssa/ehcleanup-1.C: Update.
|
* g++.dg/tree-ssa/ehcleanup-1.C: Update.
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
/* Test for integer constant types: diagnostics for constants outside
|
||||||
|
range of intmax_t must be pedwarns. PR 39559. */
|
||||||
|
/* { dg-do compile } */
|
||||||
|
/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
|
||||||
|
|
||||||
|
#if 9223372036854775808LL /* { dg-error "integer constant is so large that it is unsigned" } */
|
||||||
|
unsigned long long l = 9223372036854775808LL; /* { dg-error "integer constant is so large that it is unsigned" } */
|
||||||
|
#endif
|
|
@ -1,3 +1,9 @@
|
||||||
|
2009-04-25 Joseph Myers <joseph@codesourcery.com>
|
||||||
|
|
||||||
|
PR preprocessor/39559
|
||||||
|
* expr.c (cpp_interpret_integer): Use a pedwarn for decimal
|
||||||
|
constants larger than intmax_t in C99 mode.
|
||||||
|
|
||||||
2009-04-21 Taras Glek <tglek@mozilla.com>
|
2009-04-21 Taras Glek <tglek@mozilla.com>
|
||||||
|
|
||||||
* include/cpp-id-data.h: Update GTY annotations to new syntax.
|
* include/cpp-id-data.h: Update GTY annotations to new syntax.
|
||||||
|
|
|
@ -538,8 +538,27 @@ cpp_interpret_integer (cpp_reader *pfile, const cpp_token *token,
|
||||||
&& pfile->state.in_directive)
|
&& pfile->state.in_directive)
|
||||||
&& !num_positive (result, precision))
|
&& !num_positive (result, precision))
|
||||||
{
|
{
|
||||||
|
/* This is for constants within the range of uintmax_t but
|
||||||
|
not that or intmax_t. For such decimal constants, a
|
||||||
|
diagnostic is required for C99 as the selected type must
|
||||||
|
be signed and not having a type is a constraint violation
|
||||||
|
(DR#298, TC3), so this must be a pedwarn. For C90,
|
||||||
|
unsigned long is specified to be used for a constant that
|
||||||
|
does not fit in signed long; if uintmax_t has the same
|
||||||
|
range as unsigned long this means only a warning is
|
||||||
|
appropriate here. C90 permits the preprocessor to use a
|
||||||
|
wider range than unsigned long in the compiler, so if
|
||||||
|
uintmax_t is wider than unsigned long no diagnostic is
|
||||||
|
required for such constants in preprocessor #if
|
||||||
|
expressions and the compiler will pedwarn for such
|
||||||
|
constants outside the range of unsigned long that reach
|
||||||
|
the compiler so a diagnostic is not required there
|
||||||
|
either; thus, pedwarn for C99 but use a plain warning for
|
||||||
|
C90. */
|
||||||
if (base == 10)
|
if (base == 10)
|
||||||
cpp_error (pfile, CPP_DL_WARNING,
|
cpp_error (pfile, (CPP_OPTION (pfile, c99)
|
||||||
|
? CPP_DL_PEDWARN
|
||||||
|
: CPP_DL_WARNING),
|
||||||
"integer constant is so large that it is unsigned");
|
"integer constant is so large that it is unsigned");
|
||||||
result.unsignedp = true;
|
result.unsignedp = true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue