[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

llvm-svn: 352047
This commit is contained in:
Bruno Ricci 2019-01-24 13:52:47 +00:00
parent 30b206b5da
commit 4eb701c0c6
2 changed files with 7 additions and 2 deletions

View File

@ -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;
}

View File

@ -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;