From: Bruno Ricci Date: Thu, 24 Jan 2019 13:52:47 +0000 (+0000) Subject: [Sema] Don't crash when recovering from a misspelled pseudo destructor call to an... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=76252b07cbbbaff6e4c84033a940f08b35f55cd5;p=clang [Sema] Don't crash when recovering from a misspelled pseudo destructor call to an incomplete type. When attempting to correct a misspelled pseudo destructor call as in: struct Foo; void foo(Foo *p) { p.~Foo(); } a call is made in canRecoverDotPseudoDestructorCallsOnPointerObjects to LookupDestructor without checking that the record has a definition. This causes an assertion later in LookupSpecialMember which assumes that the record has a definition. Patch By Roman Zhikharevich! Differential Revision: https://reviews.llvm.org/D57111 Reviewed By: riccibruno git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@352047 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp index d54696bbef..5ac248d36b 100644 --- a/lib/Sema/SemaExprCXX.cpp +++ b/lib/Sema/SemaExprCXX.cpp @@ -6854,8 +6854,9 @@ canRecoverDotPseudoDestructorCallsOnPointerObjects(Sema &SemaRef, QualType DestructedType) { // If this is a record type, check if its destructor is callable. if (auto *RD = DestructedType->getAsCXXRecordDecl()) { - if (CXXDestructorDecl *D = SemaRef.LookupDestructor(RD)) - return SemaRef.CanUseDecl(D, /*TreatUnavailableAsInvalid=*/false); + if (RD->hasDefinition()) + if (CXXDestructorDecl *D = SemaRef.LookupDestructor(RD)) + return SemaRef.CanUseDecl(D, /*TreatUnavailableAsInvalid=*/false); return false; } diff --git a/test/SemaCXX/incomplete-call.cpp b/test/SemaCXX/incomplete-call.cpp index 6f5169ee8a..0fb1ef5f07 100644 --- a/test/SemaCXX/incomplete-call.cpp +++ b/test/SemaCXX/incomplete-call.cpp @@ -48,6 +48,10 @@ void test_incomplete_object_call(C& c) { c(); // expected-error{{incomplete type in call to object of type}} } +void test_incomplete_object_dtor(C *p) { + p.~C(); // expected-error{{member reference type 'C *' is a pointer; did you mean to use '->'?}} +} + namespace pr18542 { struct X { int count;