This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

C++ PATCH for c++/47705 (ICE with non-pointer argument to pointer template parameter)


We were asserting that any argument to a non-type template parameter of pointer type must be an address. Which is true of valid code (apart from null pointer values), but not necessarily of invalid code, where we should complain rather than crash.

Tested x86_64-pc-linux-gnu, applied to trunk.
commit 0aa8b389e5b3d863edd4e9969cadf2af5f2c1907
Author: Jason Merrill <jason@redhat.com>
Date:   Tue Mar 8 11:02:49 2011 -0500

    	PR c++/47705
    	* pt.c (convert_nontype_argument): Don't crash on non-pointer
    	argument to pointer parameter.

diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 48f9382..cda9df8 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -5369,15 +5369,20 @@ convert_nontype_argument (tree type, tree expr, tsubst_flags_t complain)
 	 qualification conversion. Let's strip everything.  */
       else if (TYPE_PTROBV_P (type))
 	{
-	  STRIP_NOPS (expr);
-	  gcc_assert (TREE_CODE (expr) == ADDR_EXPR);
-	  gcc_assert (TREE_CODE (TREE_TYPE (expr)) == POINTER_TYPE);
-	  /* Skip the ADDR_EXPR only if it is part of the decay for
-	     an array. Otherwise, it is part of the original argument
-	     in the source code.  */
-	  if (TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0))) == ARRAY_TYPE)
-	    expr = TREE_OPERAND (expr, 0);
-	  expr_type = TREE_TYPE (expr);
+	  tree sub = expr;
+	  STRIP_NOPS (sub);
+	  if (TREE_CODE (sub) == ADDR_EXPR)
+	    {
+	      gcc_assert (TREE_CODE (TREE_TYPE (sub)) == POINTER_TYPE);
+	      /* Skip the ADDR_EXPR only if it is part of the decay for
+		 an array. Otherwise, it is part of the original argument
+		 in the source code.  */
+	      if (TREE_CODE (TREE_TYPE (TREE_OPERAND (sub, 0))) == ARRAY_TYPE)
+		expr = TREE_OPERAND (sub, 0);
+	      else
+		expr = sub;
+	      expr_type = TREE_TYPE (expr);
+	    }
 	}
     }
 
diff --git a/gcc/testsuite/g++.dg/template/nontype21.C b/gcc/testsuite/g++.dg/template/nontype21.C
new file mode 100644
index 0000000..c8e73d2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/nontype21.C
@@ -0,0 +1,10 @@
+// PR c++/47705
+
+template<char const * const x> class Something {
+};
+
+extern char const xyz;
+
+class SomethingElse:public Something<xyz> { // { dg-error "const char *" }
+};
+

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]