aboutsummaryrefslogtreecommitdiff
path: root/libcpp/expr.c
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2009-04-25 19:46:03 +0100
committerJoseph Myers <jsm28@gcc.gnu.org>2009-04-25 19:46:03 +0100
commitf88d07724fad4b84d8e73ff30b6f3c16cd832ef3 (patch)
treea0a78183eae0cbfd3a9ea596201c0a1fd30642d9 /libcpp/expr.c
parenta3710436b62ad4c025de1b3b5a97e6d3eb820edf (diff)
downloadgcc-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.c21
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;
}