]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/58843 (ICE with broken destructor call)
authorPaolo Carlini <paolo.carlini@oracle.com>
Thu, 30 Jan 2014 14:32:25 +0000 (14:32 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Thu, 30 Jan 2014 14:32:25 +0000 (14:32 +0000)
/cp
2014-01-30  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/58843
* typeck.c (lookup_destructor): Check dtor_type for error_mark_node.

/testsuite
2014-01-30  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/58843
* g++.dg/lookup/crash8.C: New.

From-SVN: r207305

gcc/cp/ChangeLog
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/lookup/crash8.C [new file with mode: 0644]

index ff696e3e88484a87c99abd596937fadfe40bf097..f49e2e55c4b21d9f7376df25b292b1b0c7dcf374 100644 (file)
@@ -1,3 +1,8 @@
+2014-01-30  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/58843
+       * typeck.c (lookup_destructor): Check dtor_type for error_mark_node.
+
 2014-01-30  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/58649
index 6268f7bfbba8acdac9d43e7f6149be334b377cd0..b6f47384f31c58edcac746f3ce4b88b9a7891b0b 100644 (file)
@@ -2486,6 +2486,10 @@ lookup_destructor (tree object, tree scope, tree dtor_name,
   tree dtor_type = TREE_OPERAND (dtor_name, 0);
   tree expr;
 
+  /* We've already complained about this destructor.  */
+  if (dtor_type == error_mark_node)
+    return error_mark_node;
+
   if (scope && !check_dtor_name (scope, dtor_type))
     {
       if (complain & tf_error)
index ce37ff1813992671d47413969b7b03081b0e41c9..22a79d4d971250aaf13546617ac17e13ab539757 100644 (file)
@@ -1,3 +1,8 @@
+2014-01-30  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/58843
+       * g++.dg/lookup/crash8.C: New.
+
 2014-01-30  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/58649
diff --git a/gcc/testsuite/g++.dg/lookup/crash8.C b/gcc/testsuite/g++.dg/lookup/crash8.C
new file mode 100644 (file)
index 0000000..7dce9cb
--- /dev/null
@@ -0,0 +1,13 @@
+// PR c++/58843
+
+struct A {};
+
+template<typename T> void foo(T t)
+{
+  t.T::~X();  // { dg-error "no type" }
+}
+
+void bar()
+{
+  foo(A());
+}