re PR c++/47971 (ICE: in tsubst_copy, at cp/pt.c:11725 on valid code)
authorJason Merrill <jason@redhat.com>
Fri, 4 Mar 2011 15:18:07 +0000 (10:18 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 4 Mar 2011 15:18:07 +0000 (10:18 -0500)
PR c++/47971
* pt.c (tsubst_copy_and_build) [PSEUDO_DTOR_EXPR]: Use tsubst for type.
(tsubst_copy) [default]: Just return t if !ENABLE_CHECKING.

From-SVN: r170677

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

index ce4ade16a84d4c16c3ea7228d901fcdc099f4fea..572090ad9a793239f9972cb3bc704af7d3ee7c51 100644 (file)
@@ -1,5 +1,9 @@
 2011-03-04  Jason Merrill  <jason@redhat.com>
 
+       PR c++/47971
+       * pt.c (tsubst_copy_and_build) [PSEUDO_DTOR_EXPR]: Use tsubst for type.
+       (tsubst_copy) [default]: Just return t if !ENABLE_CHECKING.
+
        PR c++/46220
        * search.c (check_final_overrider): Allow pointer to same incomplete
        class type with different cv-quals.
index c52bb74eba80183b906e8497b7da6616b9d031ff..dfc972870f45a28aadee8477945fe2a3cc73578f 100644 (file)
@@ -11727,7 +11727,9 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl)
       return t;
 
     default:
-      gcc_unreachable ();
+      /* We shouldn't get here, but keep going if !ENABLE_CHECKING.  */
+      gcc_checking_assert (false);
+      return t;
     }
 }
 
@@ -12984,7 +12986,7 @@ tsubst_copy_and_build (tree t,
       return finish_pseudo_destructor_expr
        (RECUR (TREE_OPERAND (t, 0)),
         RECUR (TREE_OPERAND (t, 1)),
-        RECUR (TREE_OPERAND (t, 2)));
+        tsubst (TREE_OPERAND (t, 2), args, complain, in_decl));
 
     case TREE_LIST:
       {
index c56bea48f04b78277940a1201fb4cf9f3ccc5a61..1e541053e136ea67fb7cfe7c4eebb9baa54ffa01 100644 (file)
@@ -1,5 +1,7 @@
 2011-03-04  Jason Merrill  <jason@redhat.com>
 
+       * g++.dg/template/pseudodtor6.C: New.
+
        * g++.dg/inherit/covariant19.C: New.
 
 2011-03-04  Richard Guenther  <rguenther@suse.de>
diff --git a/gcc/testsuite/g++.dg/template/pseudodtor6.C b/gcc/testsuite/g++.dg/template/pseudodtor6.C
new file mode 100644 (file)
index 0000000..4438b6f
--- /dev/null
@@ -0,0 +1,9 @@
+// PR c++/47971
+
+template <typename> struct S
+{
+  typedef double T;
+  S () { T ().~T (); }
+};
+
+S<double> s;