Skip to content

Commit 71d0597

Browse files
committed
Extract duplicated destructor lookups
1 parent 001d1bc commit 71d0597

File tree

2 files changed

+30
-38
lines changed

2 files changed

+30
-38
lines changed

clang/include/clang/Sema/Sema.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5451,7 +5451,8 @@ class Sema final : public SemaBase {
54515451
/// destructor is referenced.
54525452
void MarkVirtualBaseDestructorsReferenced(
54535453
SourceLocation Location, CXXRecordDecl *ClassDecl,
5454-
llvm::SmallPtrSetImpl<const RecordType *> *DirectVirtualBases = nullptr);
5454+
llvm::SmallPtrSetImpl<const CXXRecordDecl *> *DirectVirtualBases =
5455+
nullptr);
54555456

54565457
/// Do semantic checks to allow the complete destructor variant to be emitted
54575458
/// when the destructor is defined in another translation unit. In the Itanium

clang/lib/Sema/SemaDeclCXX.cpp

Lines changed: 28 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -5289,6 +5289,17 @@ Sema::SetDelegatingInitializer(CXXConstructorDecl *Constructor,
52895289
return false;
52905290
}
52915291

5292+
static CXXDestructorDecl *LookupDestructorIfRelevant(Sema &S,
5293+
CXXRecordDecl *Class) {
5294+
if (Class->isInvalidDecl())
5295+
return nullptr;
5296+
if (Class->hasIrrelevantDestructor())
5297+
return nullptr;
5298+
5299+
// Dtor might still be missing, e.g because it's invalid.
5300+
return S.LookupDestructor(Class);
5301+
}
5302+
52925303
static void MarkFieldDestructorReferenced(Sema &S, SourceLocation Location,
52935304
FieldDecl *Field) {
52945305
if (Field->isInvalidDecl())
@@ -5300,23 +5311,18 @@ static void MarkFieldDestructorReferenced(Sema &S, SourceLocation Location,
53005311

53015312
QualType FieldType = S.Context.getBaseElementType(Field->getType());
53025313

5303-
const RecordType *RT = FieldType->getAs<RecordType>();
5304-
if (!RT)
5314+
auto *FieldClassDecl = FieldType->getAsCXXRecordDecl();
5315+
if (!FieldClassDecl)
53055316
return;
53065317

5307-
CXXRecordDecl *FieldClassDecl = cast<CXXRecordDecl>(RT->getDecl());
5308-
if (FieldClassDecl->isInvalidDecl())
5309-
return;
5310-
if (FieldClassDecl->hasIrrelevantDestructor())
5311-
return;
53125318
// The destructor for an implicit anonymous union member is never invoked.
53135319
if (FieldClassDecl->isUnion() && FieldClassDecl->isAnonymousStructOrUnion())
53145320
return;
53155321

5316-
CXXDestructorDecl *Dtor = S.LookupDestructor(FieldClassDecl);
5317-
// Dtor might still be missing, e.g because it's invalid.
5322+
auto *Dtor = LookupDestructorIfRelevant(S, FieldClassDecl);
53185323
if (!Dtor)
53195324
return;
5325+
53205326
S.CheckDestructorAccess(Field->getLocation(), Dtor,
53215327
S.PDiag(diag::err_access_dtor_field)
53225328
<< Field->getDeclName() << FieldType);
@@ -5343,30 +5349,22 @@ static void MarkBaseDestructorsReferenced(Sema &S, SourceLocation Location,
53435349
VisitVirtualBases = false;
53445350
}
53455351

5346-
llvm::SmallPtrSet<const RecordType *, 8> DirectVirtualBases;
5352+
llvm::SmallPtrSet<const CXXRecordDecl *, 8> DirectVirtualBases;
53475353

53485354
// Bases.
53495355
for (const auto &Base : ClassDecl->bases()) {
5350-
const RecordType *RT = Base.getType()->getAs<RecordType>();
5351-
if (!RT)
5356+
auto *BaseClassDecl = Base.getType()->getAsCXXRecordDecl();
5357+
if (!BaseClassDecl)
53525358
continue;
53535359

53545360
// Remember direct virtual bases.
53555361
if (Base.isVirtual()) {
53565362
if (!VisitVirtualBases)
53575363
continue;
5358-
DirectVirtualBases.insert(RT);
5364+
DirectVirtualBases.insert(BaseClassDecl);
53595365
}
53605366

5361-
CXXRecordDecl *BaseClassDecl = cast<CXXRecordDecl>(RT->getDecl());
5362-
// If our base class is invalid, we probably can't get its dtor anyway.
5363-
if (BaseClassDecl->isInvalidDecl())
5364-
continue;
5365-
if (BaseClassDecl->hasIrrelevantDestructor())
5366-
continue;
5367-
5368-
CXXDestructorDecl *Dtor = S.LookupDestructor(BaseClassDecl);
5369-
// Dtor might still be missing, e.g because it's invalid.
5367+
auto *Dtor = LookupDestructorIfRelevant(S, BaseClassDecl);
53705368
if (!Dtor)
53715369
continue;
53725370

@@ -5565,8 +5563,7 @@ bool Sema::SetCtorInitializers(CXXConstructorDecl *Constructor, bool AnyErrors,
55655563
// C++ [class.base.init]p12:
55665564
// In a non-delegating constructor, the destructor for each
55675565
// potentially constructed subobject of class type is potentially
5568-
// invoked
5569-
// ([class.dtor]).
5566+
// invoked.
55705567
MarkFieldDestructorReferenced(*this, Location, Field);
55715568
}
55725569

@@ -5897,27 +5894,21 @@ void Sema::MarkBaseAndMemberDestructorsReferenced(SourceLocation Location,
58975894

58985895
void Sema::MarkVirtualBaseDestructorsReferenced(
58995896
SourceLocation Location, CXXRecordDecl *ClassDecl,
5900-
llvm::SmallPtrSetImpl<const RecordType *> *DirectVirtualBases) {
5897+
llvm::SmallPtrSetImpl<const CXXRecordDecl *> *DirectVirtualBases) {
59015898
// Virtual bases.
59025899
for (const auto &VBase : ClassDecl->vbases()) {
5903-
// Bases are always records in a well-formed non-dependent class.
5904-
const RecordType *RT = VBase.getType()->castAs<RecordType>();
5905-
5906-
// Ignore already visited direct virtual bases.
5907-
if (DirectVirtualBases && DirectVirtualBases->count(RT))
5900+
auto *BaseClassDecl = VBase.getType()->getAsCXXRecordDecl();
5901+
if (!BaseClassDecl)
59085902
continue;
59095903

5910-
CXXRecordDecl *BaseClassDecl = cast<CXXRecordDecl>(RT->getDecl());
5911-
// If our base class is invalid, we probably can't get its dtor anyway.
5912-
if (BaseClassDecl->isInvalidDecl())
5913-
continue;
5914-
if (BaseClassDecl->hasIrrelevantDestructor())
5904+
// Ignore already visited direct virtual bases.
5905+
if (DirectVirtualBases && DirectVirtualBases->count(BaseClassDecl))
59155906
continue;
59165907

5917-
CXXDestructorDecl *Dtor = LookupDestructor(BaseClassDecl);
5918-
// Dtor might still be missing, e.g because it's invalid.
5908+
auto *Dtor = LookupDestructorIfRelevant(*this, BaseClassDecl);
59195909
if (!Dtor)
59205910
continue;
5911+
59215912
if (CheckDestructorAccess(
59225913
ClassDecl->getLocation(), Dtor,
59235914
PDiag(diag::err_access_dtor_vbase)

0 commit comments

Comments
 (0)