diff options
author | Joseph Myers <joseph@codesourcery.com> | 2009-04-25 19:46:03 +0100 |
---|---|---|
committer | Joseph Myers <jsm28@gcc.gnu.org> | 2009-04-25 19:46:03 +0100 |
commit | f88d07724fad4b84d8e73ff30b6f3c16cd832ef3 (patch) | |
tree | a0a78183eae0cbfd3a9ea596201c0a1fd30642d9 /libcpp/expr.c | |
parent | a3710436b62ad4c025de1b3b5a97e6d3eb820edf (diff) | |
download | gcc-f88d07724fad4b84d8e73ff30b6f3c16cd832ef3.zip gcc-f88d07724fad4b84d8e73ff30b6f3c16cd832ef3.tar.gz gcc-f88d07724fad4b84d8e73ff30b6f3c16cd832ef3.tar.bz2 |
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
Diffstat (limited to 'libcpp/expr.c')
-rw-r--r-- | libcpp/expr.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/libcpp/expr.c b/libcpp/expr.c index b9a17db..f65fae0 100644 --- a/libcpp/expr.c +++ b/libcpp/expr.c @@ -538,8 +538,27 @@ cpp_interpret_integer (cpp_reader *pfile, const cpp_token *token, && pfile->state.in_directive) && !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) - 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"); result.unsignedp = true; } |