re PR c++/34336 (4.2.2 internal error in stabilize_expr)
authorJakub Jelinek <jakub@redhat.com>
Thu, 6 Dec 2007 09:33:26 +0000 (10:33 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 6 Dec 2007 09:33:26 +0000 (10:33 +0100)
PR c++/34336
* tree.c (stabilize_call, stabilize_init): Do nothing if
processing_template_decl.

* g++.dg/template/new8.C: New test.

From-SVN: r130645

gcc/cp/ChangeLog
gcc/cp/tree.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/new8.C [new file with mode: 0644]

index 98316fedad71855b0a272c41513cd7fddb4b87e3..f7e8904909f17a1963b701293bf6004214e1ecd3 100644 (file)
@@ -1,3 +1,9 @@
+2007-12-06  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/34336
+       * tree.c (stabilize_call, stabilize_init): Do nothing if
+       processing_template_decl.
+
 2007-12-05  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/34271
index c885d0888780cd54103dfc23d992e50524f2bedf..843f6c45590cf17ffead22155d03ba5a873d8333 100644 (file)
@@ -2602,8 +2602,11 @@ stabilize_call (tree call, tree *initp)
   int i;
   int nargs = call_expr_nargs (call);
 
-  if (call == error_mark_node)
-    return;
+  if (call == error_mark_node || processing_template_decl)
+    {
+      *initp = NULL_TREE;
+      return;
+    }
 
   gcc_assert (TREE_CODE (call) == CALL_EXPR);
 
@@ -2662,7 +2665,7 @@ stabilize_init (tree init, tree *initp)
 
   *initp = NULL_TREE;
 
-  if (t == error_mark_node)
+  if (t == error_mark_node || processing_template_decl)
     return true;
 
   if (TREE_CODE (t) == INIT_EXPR
index e63a9f1f15315fad1936dc9ae202a3435972dd6e..94e727337ded6563df6ca8d5851daea84d957f84 100644 (file)
@@ -1,3 +1,8 @@
+2007-12-06  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/34336
+       * g++.dg/template/new8.C: New test.
+
 2007-12-06  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/34333
diff --git a/gcc/testsuite/g++.dg/template/new8.C b/gcc/testsuite/g++.dg/template/new8.C
new file mode 100644 (file)
index 0000000..b8f3f97
--- /dev/null
@@ -0,0 +1,29 @@
+// PR c++/34336
+// { dg-do compile }
+
+struct A;
+
+template <class T>
+struct S
+{
+  T *m;
+  T &operator* () { return *m; }
+};
+
+struct B
+{
+  B (const A &);
+};
+
+template <class T>
+struct C
+{
+  C ();
+  S<A> c;
+};
+
+template <class T>
+C<T>::C ()
+{
+  B *b = new B (*c);
+}