Hi,

per the preceding discussion. Tested x86_64-linux.

Ok for mainline?

Thanks,
Paolo.

///////////////////////
/cp
2011-09-21  Paolo Carlini  <paolo.carl...@oracle.com>

        PR c++/50454
        * decl.c (grokdeclarator): Consistently handle both __int128
        and unsigned __int128 with -pedantic; suppress diagnostic in
        system headers.

/testsuite
2011-09-21  Paolo Carlini  <paolo.carl...@oracle.com>

        PR c++/50454
        * g++.dg/ext/int128-1.C: New.
        * g++.dg/ext/int128-2.C: Likewise.
        * g++.dg/ext/int128-2.h: Likewise.
Index: testsuite/g++.dg/ext/int128-1.C
===================================================================
--- testsuite/g++.dg/ext/int128-1.C     (revision 0)
+++ testsuite/g++.dg/ext/int128-1.C     (revision 0)
@@ -0,0 +1,11 @@
+// PR c++/50454
+// { dg-do compile { target int128 } }
+
+template<typename T>
+  struct limits;
+
+template<>
+  struct limits<__int128> { }; // { dg-error "does not support" }
+
+template<>
+  struct limits<unsigned __int128> { }; // { dg-error "does not support" }
Index: testsuite/g++.dg/ext/int128-2.C
===================================================================
--- testsuite/g++.dg/ext/int128-2.C     (revision 0)
+++ testsuite/g++.dg/ext/int128-2.C     (revision 0)
@@ -0,0 +1,4 @@
+// PR c++/50454
+// { dg-do compile { target int128 } }
+
+#include "int128-2.h"
Index: testsuite/g++.dg/ext/int128-2.h
===================================================================
--- testsuite/g++.dg/ext/int128-2.h     (revision 0)
+++ testsuite/g++.dg/ext/int128-2.h     (revision 0)
@@ -0,0 +1,10 @@
+#pragma GCC system_header
+
+template<typename T>
+  struct limits;
+
+template<>
+  struct limits<__int128> { };
+
+template<>
+  struct limits<unsigned __int128> { };
Index: cp/decl.c
===================================================================
--- cp/decl.c   (revision 179024)
+++ cp/decl.c   (working copy)
@@ -8640,6 +8640,15 @@ grokdeclarator (const cp_declarator *declarator,
 
   ctype = NULL_TREE;
 
+  if (explicit_int128)
+    {
+      if (int128_integer_type_node == NULL_TREE)
+       error ("%<__int128%> is not supported by this target");
+      else if (pedantic && ! in_system_header)
+       pedwarn (input_location, OPT_pedantic,
+                "ISO C++ does not support %<__int128%> for %qs", name);
+    }
+
   /* Now process the modifiers that were specified
      and check for invalid combinations.  */
 
@@ -8695,22 +8704,6 @@ grokdeclarator (const cp_declarator *declarator,
              if (flag_pedantic_errors)
                ok = 0;
            }
-         if (explicit_int128)
-           {
-             if (int128_integer_type_node == NULL_TREE)
-               {
-                 error ("%<__int128%> is not supported by this target");
-                 ok = 0;
-               }
-             else if (pedantic)
-               {
-                 pedwarn (input_location, OPT_pedantic,
-                          "ISO C++ does not support %<__int128%> for %qs",
-                          name);
-                 if (flag_pedantic_errors)
-                   ok = 0;
-               }
-           }
        }
 
       /* Discard the type modifiers if they are invalid.  */

Reply via email to