]> granicus.if.org Git - clang/commitdiff
Don't crash when transforming an ill-formed pseudo-destructor
authorDouglas Gregor <dgregor@apple.com>
Wed, 9 Nov 2011 02:19:47 +0000 (02:19 +0000)
committerDouglas Gregor <dgregor@apple.com>
Wed, 9 Nov 2011 02:19:47 +0000 (02:19 +0000)
expression. Fixes PR11339.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@144159 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/TreeTransform.h
test/SemaCXX/pseudo-destructors.cpp

index f55e2a706bbd0967b4d93586734542c87dd35eda..7c1dafb87ffa4ba5a0ce971666513f7c5b969bc1 100644 (file)
@@ -7218,7 +7218,7 @@ TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
     if (!DestroyedTypeInfo)
       return ExprError();
     Destroyed = DestroyedTypeInfo;
-  } else if (ObjectType->isDependentType()) {
+  } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
     // We aren't likely to be able to resolve the identifier down to a type
     // now anyway, so just retain the identifier.
     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
index d71304e28b11200cb6a1a0c7d0d2d53e89b13ccf..bd3984817512613c3187b7f428ff1a71f9e84ca1 100644 (file)
@@ -68,3 +68,12 @@ void test_X0(N1::X0 &x0) {
   x0.~X0();
 }
 
+namespace PR11339 {
+  template<class T>
+  void destroy(T* p) {
+    p->~T(); // ok
+    p->~oops(); // expected-error{{expected the class name after '~' to name a destructor}}
+  }
+
+  template void destroy(int*); // expected-note{{in instantiation of function template specialization}}
+}