Patchwork [C++] Don't ICE on POINTER_PLUS_EXPR during tsubst* (PR c++/59268)

login
register
mail settings
Submitter Jakub Jelinek
Date Dec. 3, 2013, 10:39 p.m.
Message ID <20131203223955.GG892@tucnak.redhat.com>
Download mbox | patch
Permalink /patch/296344/
State New
Headers show

Comments

Jakub Jelinek - Dec. 3, 2013, 10:39 p.m.
Hi!

The following testcase ICEs because dfs_accumulate_vtbl_inits
creates a POINTER_PLUS_EXPR (not type dependent) which is then fed
through tsubst_copy_and_build during instantiation.

The following patch teaches tsubst_copy_and_build to handle it.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk/4.8?

2013-12-03  Jakub Jelinek  <jakub@redhat.com>

	PR c++/59268
	* pt.c (tsubst_copy_and_build): Handle POINTER_PLUS_EXPR.

	* g++.dg/cpp0x/constexpr-template6.C: New test.


	Jakub
Jason Merrill - Dec. 4, 2013, 5:53 p.m.
OK.

Jason

Patch

--- gcc/cp/pt.c.jj	2013-11-25 18:30:19.000000000 +0100
+++ gcc/cp/pt.c	2013-12-03 17:24:57.276468904 +0100
@@ -14159,6 +14159,10 @@  tsubst_copy_and_build (tree t,
 	RETURN (r);
       }
 
+    case POINTER_PLUS_EXPR:
+      return fold_build_pointer_plus (RECUR (TREE_OPERAND (t, 0)),
+				      RECUR (TREE_OPERAND (t, 1)));
+
     case SCOPE_REF:
       RETURN (tsubst_qualified_id (t, args, complain, in_decl, /*done=*/true,
 				  /*address_p=*/false));
--- gcc/testsuite/g++.dg/cpp0x/constexpr-template6.C.jj	2013-12-03 17:27:59.896539499 +0100
+++ gcc/testsuite/g++.dg/cpp0x/constexpr-template6.C	2013-12-03 17:26:56.000000000 +0100
@@ -0,0 +1,20 @@ 
+// PR c++/59268
+// { dg-do compile }
+// { dg-options "-std=c++11" }
+
+template <typename>
+struct A
+{
+  constexpr A (int) {}
+  virtual void foo ()
+  {
+    constexpr A<void> a (0);
+  }
+};
+
+void
+bar ()
+{
+  A<int> a (3);
+  a.foo ();
+}