Skip to content

Commit 1416566

Browse files
authored
Reland: [clang] NFC: Clear some uses of MemberPointerType::getClass (#132317)
Relands Original PR: #131965 Addresses #131965 (comment) * Fixes isIncompleteType for injected classes This clears up some uses of getClass on MemberPointerType when equivalent uses of getMostRecentCXXRecordDecl would be just as simple or simpler. This is split-off from a larger patch which removes getClass, in order to facilitate review.
1 parent ac9049d commit 1416566

20 files changed

+123
-112
lines changed

clang-tools-extra/clang-tidy/bugprone/ComparePointerToMemberVirtualFunctionCheck.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,7 @@ void ComparePointerToMemberVirtualFunctionCheck::check(
7070
// compare with variable which type is pointer to member function.
7171
llvm::SmallVector<SourceLocation, 12U> SameSignatureVirtualMethods{};
7272
const auto *MPT = cast<MemberPointerType>(DRE->getType().getCanonicalType());
73-
const Type *T = MPT->getClass();
74-
if (T == nullptr)
75-
return;
76-
const CXXRecordDecl *RD = T->getAsCXXRecordDecl();
73+
const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl();
7774
if (RD == nullptr)
7875
return;
7976

clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -219,8 +219,8 @@ bool isQualificationConvertiblePointer(QualType From, QualType To,
219219

220220
if (P1->isMemberPointerType())
221221
return P2->isMemberPointerType() &&
222-
P1->getAs<MemberPointerType>()->getClass() ==
223-
P2->getAs<MemberPointerType>()->getClass();
222+
P1->getAs<MemberPointerType>()->getMostRecentCXXRecordDecl() ==
223+
P2->getAs<MemberPointerType>()->getMostRecentCXXRecordDecl();
224224

225225
if (P1->isConstantArrayType())
226226
return P2->isConstantArrayType() &&

clang/include/clang/AST/CanonicalType.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,8 @@ struct CanProxyAdaptor<MemberPointerType>
454454
: public CanProxyBase<MemberPointerType> {
455455
LLVM_CLANG_CANPROXY_TYPE_ACCESSOR(getPointeeType)
456456
LLVM_CLANG_CANPROXY_SIMPLE_ACCESSOR(const Type *, getClass)
457+
LLVM_CLANG_CANPROXY_SIMPLE_ACCESSOR(const CXXRecordDecl *,
458+
getMostRecentCXXRecordDecl)
457459
};
458460

459461
// CanProxyAdaptors for arrays are intentionally unimplemented because

clang/include/clang/Sema/Sema.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5769,10 +5769,11 @@ class Sema final : public SemaBase {
57695769

57705770
/// Determine whether the type \p Derived is a C++ class that is
57715771
/// derived from the type \p Base.
5772+
bool IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived,
5773+
CXXRecordDecl *Base, CXXBasePaths &Paths);
5774+
bool IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived,
5775+
CXXRecordDecl *Base);
57725776
bool IsDerivedFrom(SourceLocation Loc, QualType Derived, QualType Base);
5773-
5774-
/// Determine whether the type \p Derived is a C++ class that is
5775-
/// derived from the type \p Base.
57765777
bool IsDerivedFrom(SourceLocation Loc, QualType Derived, QualType Base,
57775778
CXXBasePaths &Paths);
57785779

clang/lib/AST/ByteCode/Compiler.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -238,8 +238,9 @@ bool Compiler<Emitter>::VisitCastExpr(const CastExpr *CE) {
238238
const auto *FromMP = SubExpr->getType()->getAs<MemberPointerType>();
239239
const auto *ToMP = CE->getType()->getAs<MemberPointerType>();
240240

241-
unsigned DerivedOffset = collectBaseOffset(QualType(ToMP->getClass(), 0),
242-
QualType(FromMP->getClass(), 0));
241+
unsigned DerivedOffset =
242+
Ctx.collectBaseOffset(ToMP->getMostRecentCXXRecordDecl(),
243+
FromMP->getMostRecentCXXRecordDecl());
243244

244245
if (!this->delegate(SubExpr))
245246
return false;
@@ -253,8 +254,9 @@ bool Compiler<Emitter>::VisitCastExpr(const CastExpr *CE) {
253254
const auto *FromMP = SubExpr->getType()->getAs<MemberPointerType>();
254255
const auto *ToMP = CE->getType()->getAs<MemberPointerType>();
255256

256-
unsigned DerivedOffset = collectBaseOffset(QualType(FromMP->getClass(), 0),
257-
QualType(ToMP->getClass(), 0));
257+
unsigned DerivedOffset =
258+
Ctx.collectBaseOffset(FromMP->getMostRecentCXXRecordDecl(),
259+
ToMP->getMostRecentCXXRecordDecl());
258260

259261
if (!this->delegate(SubExpr))
260262
return false;

clang/lib/AST/ExprConstant.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10556,8 +10556,9 @@ bool MemberPointerExprEvaluator::VisitCastExpr(const CastExpr *E) {
1055610556
if (!Result.castToDerived(Derived))
1055710557
return Error(E);
1055810558
}
10559-
const Type *FinalTy = E->getType()->castAs<MemberPointerType>()->getClass();
10560-
if (!Result.castToDerived(FinalTy->getAsCXXRecordDecl()))
10559+
if (!Result.castToDerived(E->getType()
10560+
->castAs<MemberPointerType>()
10561+
->getMostRecentCXXRecordDecl()))
1056110562
return Error(E);
1056210563
return true;
1056310564
}

clang/lib/AST/MicrosoftMangle.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -695,7 +695,7 @@ void MicrosoftCXXNameMangler::mangleVariableEncoding(const VarDecl *VD) {
695695
mangleQualifiers(MPT->getPointeeType().getQualifiers(), true);
696696
// Member pointers are suffixed with a back reference to the member
697697
// pointer's class name.
698-
mangleName(MPT->getClass()->getAsCXXRecordDecl());
698+
mangleName(MPT->getMostRecentCXXRecordDecl());
699699
} else
700700
mangleQualifiers(Ty->getPointeeType().getQualifiers(), false);
701701
} else if (const ArrayType *AT = getASTContext().getAsArrayType(Ty)) {
@@ -3331,11 +3331,11 @@ void MicrosoftCXXNameMangler::mangleType(const MemberPointerType *T,
33313331
manglePointerExtQualifiers(Quals, PointeeType);
33323332
if (const FunctionProtoType *FPT = PointeeType->getAs<FunctionProtoType>()) {
33333333
Out << '8';
3334-
mangleName(T->getClass()->castAs<RecordType>()->getDecl());
3334+
mangleName(T->getMostRecentCXXRecordDecl());
33353335
mangleFunctionType(FPT, nullptr, true);
33363336
} else {
33373337
mangleQualifiers(PointeeType.getQualifiers(), true);
3338-
mangleName(T->getClass()->castAs<RecordType>()->getDecl());
3338+
mangleName(T->getMostRecentCXXRecordDecl());
33393339
mangleType(PointeeType, Range, QMM_Drop);
33403340
}
33413341
}
@@ -4309,11 +4309,11 @@ void MicrosoftCXXNameMangler::mangleAutoReturnType(const MemberPointerType *T,
43094309
manglePointerExtQualifiers(Quals, PointeeType);
43104310
if (const FunctionProtoType *FPT = PointeeType->getAs<FunctionProtoType>()) {
43114311
Out << '8';
4312-
mangleName(T->getClass()->castAs<RecordType>()->getDecl());
4312+
mangleName(T->getMostRecentCXXRecordDecl());
43134313
mangleFunctionType(FPT, nullptr, true);
43144314
} else {
43154315
mangleQualifiers(PointeeType.getQualifiers(), true);
4316-
mangleName(T->getClass()->castAs<RecordType>()->getDecl());
4316+
mangleName(T->getMostRecentCXXRecordDecl());
43174317
mangleAutoReturnType(PointeeType, QMM_Drop);
43184318
}
43194319
}

clang/lib/AST/Type.cpp

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2446,19 +2446,17 @@ bool Type::isIncompleteType(NamedDecl **Def) const {
24462446
// Member pointers in the MS ABI have special behavior in
24472447
// RequireCompleteType: they attach a MSInheritanceAttr to the CXXRecordDecl
24482448
// to indicate which inheritance model to use.
2449-
auto *MPTy = cast<MemberPointerType>(CanonicalType);
2450-
const Type *ClassTy = MPTy->getClass();
2449+
// The inheritance attribute might only be present on the most recent
2450+
// CXXRecordDecl.
2451+
const CXXRecordDecl *RD =
2452+
cast<MemberPointerType>(CanonicalType)->getMostRecentCXXRecordDecl();
24512453
// Member pointers with dependent class types don't get special treatment.
2452-
if (ClassTy->isDependentType())
2454+
if (!RD || RD->isDependentType())
24532455
return false;
2454-
const CXXRecordDecl *RD = ClassTy->getAsCXXRecordDecl();
24552456
ASTContext &Context = RD->getASTContext();
24562457
// Member pointers not in the MS ABI don't get special treatment.
24572458
if (!Context.getTargetInfo().getCXXABI().isMicrosoft())
24582459
return false;
2459-
// The inheritance attribute might only be present on the most recent
2460-
// CXXRecordDecl, use that one.
2461-
RD = RD->getMostRecentNonInjectedDecl();
24622460
// Nothing interesting to do if the inheritance attribute is already set.
24632461
if (RD->hasAttr<MSInheritanceAttr>())
24642462
return false;
@@ -4713,7 +4711,8 @@ LinkageInfo LinkageComputer::computeTypeLinkageInfo(const Type *T) {
47134711
return computeTypeLinkageInfo(cast<ReferenceType>(T)->getPointeeType());
47144712
case Type::MemberPointer: {
47154713
const auto *MPT = cast<MemberPointerType>(T);
4716-
LinkageInfo LV = computeTypeLinkageInfo(MPT->getClass());
4714+
LinkageInfo LV =
4715+
getDeclLinkageAndVisibility(MPT->getMostRecentCXXRecordDecl());
47174716
LV.merge(computeTypeLinkageInfo(MPT->getPointeeType()));
47184717
return LV;
47194718
}
@@ -5179,7 +5178,10 @@ QualType::DestructionKind QualType::isDestructedTypeImpl(QualType type) {
51795178
}
51805179

51815180
CXXRecordDecl *MemberPointerType::getMostRecentCXXRecordDecl() const {
5182-
return getClass()->getAsCXXRecordDecl()->getMostRecentNonInjectedDecl();
5181+
auto *RD = getClass()->getAsCXXRecordDecl();
5182+
if (!RD)
5183+
return nullptr;
5184+
return RD->getMostRecentNonInjectedDecl();
51835185
}
51845186

51855187
void clang::FixedPointValueToString(SmallVectorImpl<char> &Str,

clang/lib/CodeGen/CGCXXABI.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,7 @@ CGCallee CGCXXABI::EmitLoadOfMemberFunctionPointer(
5050
llvm::Value *MemPtr, const MemberPointerType *MPT) {
5151
ErrorUnsupportedABI(CGF, "calls through member pointers");
5252

53-
const auto *RD =
54-
cast<CXXRecordDecl>(MPT->getClass()->castAs<RecordType>()->getDecl());
53+
const auto *RD = MPT->getMostRecentCXXRecordDecl();
5554
ThisPtrForCall =
5655
CGF.getAsNaturalPointerTo(This, CGF.getContext().getRecordType(RD));
5756
const FunctionProtoType *FPT =
@@ -294,7 +293,7 @@ llvm::Constant *CGCXXABI::getMemberPointerAdjustment(const CastExpr *E) {
294293
derivedType = E->getType();
295294

296295
const CXXRecordDecl *derivedClass =
297-
derivedType->castAs<MemberPointerType>()->getClass()->getAsCXXRecordDecl();
296+
derivedType->castAs<MemberPointerType>()->getMostRecentCXXRecordDecl();
298297

299298
return CGM.GetNonVirtualBaseClassOffset(derivedClass,
300299
E->path_begin(),

clang/lib/CodeGen/CGClass.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -161,10 +161,9 @@ CodeGenFunction::EmitCXXMemberDataPointerAddress(const Expr *E, Address base,
161161
QualType memberType = memberPtrType->getPointeeType();
162162
CharUnits memberAlign =
163163
CGM.getNaturalTypeAlignment(memberType, BaseInfo, TBAAInfo);
164-
memberAlign =
165-
CGM.getDynamicOffsetAlignment(base.getAlignment(),
166-
memberPtrType->getClass()->getAsCXXRecordDecl(),
167-
memberAlign);
164+
memberAlign = CGM.getDynamicOffsetAlignment(
165+
base.getAlignment(), memberPtrType->getMostRecentCXXRecordDecl(),
166+
memberAlign);
168167
return Address(ptr, ConvertTypeForMem(memberPtrType->getPointeeType()),
169168
memberAlign);
170169
}

clang/lib/CodeGen/CGDebugInfo.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3490,7 +3490,8 @@ llvm::DIType *CGDebugInfo::CreateType(const MemberPointerType *Ty,
34903490
}
34913491
}
34923492

3493-
llvm::DIType *ClassType = getOrCreateType(QualType(Ty->getClass(), 0), U);
3493+
llvm::DIType *ClassType = getOrCreateType(
3494+
QualType(Ty->getMostRecentCXXRecordDecl()->getTypeForDecl(), 0), U);
34943495
if (Ty->isMemberDataPointerType())
34953496
return DBuilder.createMemberPointerType(
34963497
getOrCreateType(Ty->getPointeeType(), U), ClassType, Size, /*Align=*/0,

clang/lib/CodeGen/CGExprCXX.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -453,8 +453,7 @@ CodeGenFunction::EmitCXXMemberPointerCallExpr(const CXXMemberCallExpr *E,
453453

454454
const auto *MPT = MemFnExpr->getType()->castAs<MemberPointerType>();
455455
const auto *FPT = MPT->getPointeeType()->castAs<FunctionProtoType>();
456-
const auto *RD =
457-
cast<CXXRecordDecl>(MPT->getClass()->castAs<RecordType>()->getDecl());
456+
const auto *RD = MPT->getMostRecentCXXRecordDecl();
458457

459458
// Emit the 'this' pointer.
460459
Address This = Address::invalid();
@@ -463,8 +462,9 @@ CodeGenFunction::EmitCXXMemberPointerCallExpr(const CXXMemberCallExpr *E,
463462
else
464463
This = EmitLValue(BaseExpr, KnownNonNull).getAddress();
465464

466-
EmitTypeCheck(TCK_MemberCall, E->getExprLoc(), This.emitRawPointer(*this),
467-
QualType(MPT->getClass(), 0));
465+
EmitTypeCheck(
466+
TCK_MemberCall, E->getExprLoc(), This.emitRawPointer(*this),
467+
QualType(MPT->getMostRecentCXXRecordDecl()->getTypeForDecl(), 0));
468468

469469
// Get the member function pointer.
470470
llvm::Value *MemFnPtr = EmitScalarExpr(MemFnExpr);

clang/lib/CodeGen/CodeGenTypes.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -728,7 +728,7 @@ llvm::Type *CodeGenTypes::ConvertType(QualType T) {
728728
case Type::MemberPointer: {
729729
auto *MPTy = cast<MemberPointerType>(Ty);
730730
if (!getCXXABI().isMemberPointerConvertible(MPTy)) {
731-
auto *C = MPTy->getClass();
731+
auto *C = MPTy->getMostRecentCXXRecordDecl()->getTypeForDecl();
732732
auto Insertion = RecordsWithOpaqueMemberPointers.insert({C, nullptr});
733733
if (Insertion.second)
734734
Insertion.first->second = llvm::StructType::create(getLLVMContext());

clang/lib/CodeGen/ItaniumCXXABI.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -628,8 +628,7 @@ CGCallee ItaniumCXXABI::EmitLoadOfMemberFunctionPointer(
628628

629629
const FunctionProtoType *FPT =
630630
MPT->getPointeeType()->castAs<FunctionProtoType>();
631-
auto *RD =
632-
cast<CXXRecordDecl>(MPT->getClass()->castAs<RecordType>()->getDecl());
631+
auto *RD = MPT->getMostRecentCXXRecordDecl();
633632

634633
llvm::Constant *ptrdiff_1 = llvm::ConstantInt::get(CGM.PtrDiffTy, 1);
635634

@@ -798,7 +797,7 @@ CGCallee ItaniumCXXABI::EmitLoadOfMemberFunctionPointer(
798797

799798
// Check the function pointer if CFI on member function pointers is enabled.
800799
if (ShouldEmitCFICheck) {
801-
CXXRecordDecl *RD = MPT->getClass()->getAsCXXRecordDecl();
800+
CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl();
802801
if (RD->hasDefinition()) {
803802
CodeGenFunction::SanitizerScope SanScope(&CGF);
804803

@@ -3799,7 +3798,8 @@ static bool ContainsIncompleteClassType(QualType Ty) {
37993798
if (const MemberPointerType *MemberPointerTy =
38003799
dyn_cast<MemberPointerType>(Ty)) {
38013800
// Check if the class type is incomplete.
3802-
const RecordType *ClassType = cast<RecordType>(MemberPointerTy->getClass());
3801+
const auto *ClassType = cast<RecordType>(
3802+
MemberPointerTy->getMostRecentCXXRecordDecl()->getTypeForDecl());
38033803
if (IsIncompleteClassType(ClassType))
38043804
return true;
38053805

@@ -4538,7 +4538,8 @@ ItaniumRTTIBuilder::BuildPointerToMemberTypeInfo(const MemberPointerType *Ty) {
45384538
// attributes of the type pointed to.
45394539
unsigned Flags = extractPBaseFlags(CGM.getContext(), PointeeTy);
45404540

4541-
const RecordType *ClassType = cast<RecordType>(Ty->getClass());
4541+
const auto *ClassType =
4542+
cast<RecordType>(Ty->getMostRecentCXXRecordDecl()->getTypeForDecl());
45424543
if (IsIncompleteClassType(ClassType))
45434544
Flags |= PTI_ContainingClassIncomplete;
45444545

clang/lib/Sema/SemaDeclCXX.cpp

Lines changed: 23 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3069,48 +3069,46 @@ void Sema::ActOnBaseSpecifiers(Decl *ClassDecl,
30693069
AttachBaseSpecifiers(cast<CXXRecordDecl>(ClassDecl), Bases);
30703070
}
30713071

3072-
bool Sema::IsDerivedFrom(SourceLocation Loc, QualType Derived, QualType Base) {
3072+
bool Sema::IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived,
3073+
CXXRecordDecl *Base, CXXBasePaths &Paths) {
30733074
if (!getLangOpts().CPlusPlus)
30743075
return false;
30753076

3076-
CXXRecordDecl *DerivedRD = Derived->getAsCXXRecordDecl();
3077-
if (!DerivedRD)
3078-
return false;
3079-
3080-
CXXRecordDecl *BaseRD = Base->getAsCXXRecordDecl();
3081-
if (!BaseRD)
3077+
if (!Base || !Derived)
30823078
return false;
30833079

30843080
// If either the base or the derived type is invalid, don't try to
30853081
// check whether one is derived from the other.
3086-
if (BaseRD->isInvalidDecl() || DerivedRD->isInvalidDecl())
3082+
if (Base->isInvalidDecl() || Derived->isInvalidDecl())
30873083
return false;
30883084

30893085
// FIXME: In a modules build, do we need the entire path to be visible for us
30903086
// to be able to use the inheritance relationship?
3091-
if (!isCompleteType(Loc, Derived) && !DerivedRD->isBeingDefined())
3087+
if (!isCompleteType(Loc, Context.getTypeDeclType(Derived)) &&
3088+
!Derived->isBeingDefined())
30923089
return false;
30933090

3094-
return DerivedRD->isDerivedFrom(BaseRD);
3091+
return Derived->isDerivedFrom(Base, Paths);
30953092
}
30963093

3097-
bool Sema::IsDerivedFrom(SourceLocation Loc, QualType Derived, QualType Base,
3098-
CXXBasePaths &Paths) {
3099-
if (!getLangOpts().CPlusPlus)
3100-
return false;
3101-
3102-
CXXRecordDecl *DerivedRD = Derived->getAsCXXRecordDecl();
3103-
if (!DerivedRD)
3104-
return false;
3105-
3106-
CXXRecordDecl *BaseRD = Base->getAsCXXRecordDecl();
3107-
if (!BaseRD)
3108-
return false;
3094+
bool Sema::IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived,
3095+
CXXRecordDecl *Base) {
3096+
CXXBasePaths Paths(/*FindAmbiguities=*/false, /*RecordPaths=*/false,
3097+
/*DetectVirtual=*/false);
3098+
return IsDerivedFrom(Loc, Derived, Base, Paths);
3099+
}
31093100

3110-
if (!isCompleteType(Loc, Derived) && !DerivedRD->isBeingDefined())
3111-
return false;
3101+
bool Sema::IsDerivedFrom(SourceLocation Loc, QualType Derived, QualType Base) {
3102+
CXXBasePaths Paths(/*FindAmbiguities=*/false, /*RecordPaths=*/false,
3103+
/*DetectVirtual=*/false);
3104+
return IsDerivedFrom(Loc, Derived->getAsCXXRecordDecl(),
3105+
Base->getAsCXXRecordDecl(), Paths);
3106+
}
31123107

3113-
return DerivedRD->isDerivedFrom(BaseRD, Paths);
3108+
bool Sema::IsDerivedFrom(SourceLocation Loc, QualType Derived, QualType Base,
3109+
CXXBasePaths &Paths) {
3110+
return IsDerivedFrom(Loc, Derived->getAsCXXRecordDecl(),
3111+
Base->getAsCXXRecordDecl(), Paths);
31143112
}
31153113

31163114
static void BuildBasePathArray(const CXXBasePath &Path,

0 commit comments

Comments
 (0)