OSDN Git Service

libcpp:
authorjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 25 Apr 2009 18:46:03 +0000 (18:46 +0000)
committerjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 25 Apr 2009 18:46:03 +0000 (18:46 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@146777 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/c99-intconst-2.c [new file with mode: 0644]
libcpp/ChangeLog
libcpp/expr.c

index c05006b..f2fdc93 100644 (file)
@@ -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>
 
        * g++.dg/tree-ssa/ehcleanup-1.C: Update.
diff --git a/gcc/testsuite/gcc.dg/c99-intconst-2.c b/gcc/testsuite/gcc.dg/c99-intconst-2.c
new file mode 100644 (file)
index 0000000..3492367
--- /dev/null
@@ -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
index a9ccc59..24f3f8d 100644 (file)
@@ -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>
 
        * include/cpp-id-data.h: Update GTY annotations to new syntax.
index b9a17db..f65fae0 100644 (file)
@@ -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;
        }