Skip to content

Commit 50f700f

Browse files
committed
Extract duplicated destructor lookups
1 parent bda4b67 commit 50f700f

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
@@ -5286,6 +5286,17 @@ Sema::SetDelegatingInitializer(CXXConstructorDecl *Constructor,
52865286
return false;
52875287
}
52885288

5289+
static CXXDestructorDecl *LookupDestructorIfRelevant(Sema &S,
5290+
CXXRecordDecl *Class) {
5291+
if (Class->isInvalidDecl())
5292+
return nullptr;
5293+
if (Class->hasIrrelevantDestructor())
5294+
return nullptr;
5295+
5296+
// Dtor might still be missing, e.g because it's invalid.
5297+
return S.LookupDestructor(Class);
5298+
}
5299+
52895300
static void MarkFieldDestructorReferenced(Sema &S, SourceLocation Location,
52905301
FieldDecl *Field) {
52915302
if (Field->isInvalidDecl())
@@ -5297,23 +5308,18 @@ static void MarkFieldDestructorReferenced(Sema &S, SourceLocation Location,
52975308

52985309
QualType FieldType = S.Context.getBaseElementType(Field->getType());
52995310

5300-
const RecordType *RT = FieldType->getAs<RecordType>();
5301-
if (!RT)
5311+
auto *FieldClassDecl = FieldType->getAsCXXRecordDecl();
5312+
if (!FieldClassDecl)
53025313
return;
53035314

5304-
CXXRecordDecl *FieldClassDecl = cast<CXXRecordDecl>(RT->getDecl());
5305-
if (FieldClassDecl->isInvalidDecl())
5306-
return;
5307-
if (FieldClassDecl->hasIrrelevantDestructor())
5308-
return;
53095315
// The destructor for an implicit anonymous union member is never invoked.
53105316
if (FieldClassDecl->isUnion() && FieldClassDecl->isAnonymousStructOrUnion())
53115317
return;
53125318

5313-
CXXDestructorDecl *Dtor = S.LookupDestructor(FieldClassDecl);
5314-
// Dtor might still be missing, e.g because it's invalid.
5319+
auto *Dtor = LookupDestructorIfRelevant(S, FieldClassDecl);
53155320
if (!Dtor)
53165321
return;
5322+
53175323
S.CheckDestructorAccess(Field->getLocation(), Dtor,
53185324
S.PDiag(diag::err_access_dtor_field)
53195325
<< Field->getDeclName() << FieldType);
@@ -5340,30 +5346,22 @@ static void MarkBaseDestructorsReferenced(Sema &S, SourceLocation Location,
53405346
VisitVirtualBases = false;
53415347
}
53425348

5343-
llvm::SmallPtrSet<const RecordType *, 8> DirectVirtualBases;
5349+
llvm::SmallPtrSet<const CXXRecordDecl *, 8> DirectVirtualBases;
53445350

53455351
// Bases.
53465352
for (const auto &Base : ClassDecl->bases()) {
5347-
const RecordType *RT = Base.getType()->getAs<RecordType>();
5348-
if (!RT)
5353+
auto *BaseClassDecl = Base.getType()->getAsCXXRecordDecl();
5354+
if (!BaseClassDecl)
53495355
continue;
53505356

53515357
// Remember direct virtual bases.
53525358
if (Base.isVirtual()) {
53535359
if (!VisitVirtualBases)
53545360
continue;
5355-
DirectVirtualBases.insert(RT);
5361+
DirectVirtualBases.insert(BaseClassDecl);
53565362
}
53575363

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

@@ -5562,8 +5560,7 @@ bool Sema::SetCtorInitializers(CXXConstructorDecl *Constructor, bool AnyErrors,
55625560
// C++ [class.base.init]p12:
55635561
// In a non-delegating constructor, the destructor for each
55645562
// potentially constructed subobject of class type is potentially
5565-
// invoked
5566-
// ([class.dtor]).
5563+
// invoked.
55675564
MarkFieldDestructorReferenced(*this, Location, Field);
55685565
}
55695566

@@ -5894,27 +5891,21 @@ void Sema::MarkBaseAndMemberDestructorsReferenced(SourceLocation Location,
58945891

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

5907-
CXXRecordDecl *BaseClassDecl = cast<CXXRecordDecl>(RT->getDecl());
5908-
// If our base class is invalid, we probably can't get its dtor anyway.
5909-
if (BaseClassDecl->isInvalidDecl())
5910-
continue;
5911-
if (BaseClassDecl->hasIrrelevantDestructor())
5901+
// Ignore already visited direct virtual bases.
5902+
if (DirectVirtualBases && DirectVirtualBases->count(BaseClassDecl))
59125903
continue;
59135904

5914-
CXXDestructorDecl *Dtor = LookupDestructor(BaseClassDecl);
5915-
// Dtor might still be missing, e.g because it's invalid.
5905+
auto *Dtor = LookupDestructorIfRelevant(*this, BaseClassDecl);
59165906
if (!Dtor)
59175907
continue;
5908+
59185909
if (CheckDestructorAccess(
59195910
ClassDecl->getLocation(), Dtor,
59205911
PDiag(diag::err_access_dtor_vbase)

0 commit comments

Comments
 (0)