diff options
author | Douglas Gregor <dgregor@apple.com> | 2011-11-09 02:19:47 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2011-11-09 02:19:47 +0000 |
commit | 6b18e740495b67b439fa366367242110365cc4d9 (patch) | |
tree | 0eea63721adf7e7e68b972e94593e9a046af0a9a | |
parent | 3382f65767976f4839bbe463966976e9215672cf (diff) |
Don't crash when transforming an ill-formed pseudo-destructor
expression. Fixes PR11339.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@144159 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Sema/TreeTransform.h | 2 | ||||
-rw-r--r-- | test/SemaCXX/pseudo-destructors.cpp | 9 |
2 files changed, 10 insertions, 1 deletions
diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h index f55e2a706b..7c1dafb87f 100644 --- a/lib/Sema/TreeTransform.h +++ b/lib/Sema/TreeTransform.h @@ -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(), diff --git a/test/SemaCXX/pseudo-destructors.cpp b/test/SemaCXX/pseudo-destructors.cpp index d71304e28b..bd39848175 100644 --- a/test/SemaCXX/pseudo-destructors.cpp +++ b/test/SemaCXX/pseudo-destructors.cpp @@ -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}} +} |