diff mbox

[C++] PR 50454 [Take 2]

Message ID 4E7931E9.8020002@oracle.com
State New
Headers show

Commit Message

Paolo Carlini Sept. 21, 2011, 12:38 a.m. UTC
Hi,

per the preceding discussion. Tested x86_64-linux.

Ok for mainline?

Thanks,
Paolo.

///////////////////////
/cp
2011-09-21  Paolo Carlini  <paolo.carlini@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.carlini@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.

Comments

Jason Merrill Sept. 21, 2011, 1:25 a.m. UTC | #1
On 09/20/2011 08:38 PM, Paolo Carlini wrote:
> +      if (int128_integer_type_node == NULL_TREE)
> +	error ("%<__int128%>  is not supported by this target");

In this case we should unset explicit_int128.

Also remove this code:

>       else if (explicit_int128 && TREE_CODE (type) != INTEGER_TYPE)
>         error ("%<__int128%> invalid for %qs", name);

and the modification of explicit_int128 here:

>       /* Discard the type modifiers if they are invalid.  */
>       if (! ok)
>         {
>           unsigned_p = false;
>           signed_p = false;
>           long_p = false;
>           short_p = false;
>           longlong = 0;
>           explicit_int128 = false;

Jason
diff mbox

Patch

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.  */