forked from OSchip/llvm-project
[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:
parent
30b206b5da
commit
4eb701c0c6
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue