Skip to content

Commit 335a461

Browse files
authored
Revert "[clang] NFC: Clear some uses of MemberPointerType::getClass" (#132281)
Reverts #131965 Reverted due to issue reported here: #131965 (comment)
1 parent 5151e6d commit 335a461

19 files changed

+112
-114
lines changed

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,10 @@ 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 CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl();
73+
const Type *T = MPT->getClass();
74+
if (T == nullptr)
75+
return;
76+
const CXXRecordDecl *RD = T->getAsCXXRecordDecl();
7477
if (RD == nullptr)
7578
return;
7679

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>()->getMostRecentCXXRecordDecl() ==
223-
P2->getAs<MemberPointerType>()->getMostRecentCXXRecordDecl();
222+
P1->getAs<MemberPointerType>()->getClass() ==
223+
P2->getAs<MemberPointerType>()->getClass();
224224

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

clang/include/clang/AST/CanonicalType.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -454,8 +454,6 @@ 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)
459457
};
460458

461459
// CanProxyAdaptors for arrays are intentionally unimplemented because

clang/include/clang/Sema/Sema.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5769,11 +5769,10 @@ 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);
57765772
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.
57775776
bool IsDerivedFrom(SourceLocation Loc, QualType Derived, QualType Base,
57785777
CXXBasePaths &Paths);
57795778

clang/lib/AST/ByteCode/Compiler.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -238,9 +238,8 @@ 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 =
242-
Ctx.collectBaseOffset(ToMP->getMostRecentCXXRecordDecl(),
243-
FromMP->getMostRecentCXXRecordDecl());
241+
unsigned DerivedOffset = collectBaseOffset(QualType(ToMP->getClass(), 0),
242+
QualType(FromMP->getClass(), 0));
244243

245244
if (!this->delegate(SubExpr))
246245
return false;
@@ -254,9 +253,8 @@ bool Compiler<Emitter>::VisitCastExpr(const CastExpr *CE) {
254253
const auto *FromMP = SubExpr->getType()->getAs<MemberPointerType>();
255254
const auto *ToMP = CE->getType()->getAs<MemberPointerType>();
256255

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

261259
if (!this->delegate(SubExpr))
262260
return false;

clang/lib/AST/ExprConstant.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10551,9 +10551,8 @@ bool MemberPointerExprEvaluator::VisitCastExpr(const CastExpr *E) {
1055110551
if (!Result.castToDerived(Derived))
1055210552
return Error(E);
1055310553
}
10554-
if (!Result.castToDerived(E->getType()
10555-
->castAs<MemberPointerType>()
10556-
->getMostRecentCXXRecordDecl()))
10554+
const Type *FinalTy = E->getType()->castAs<MemberPointerType>()->getClass();
10555+
if (!Result.castToDerived(FinalTy->getAsCXXRecordDecl()))
1055710556
return Error(E);
1055810557
return true;
1055910558
}

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->getMostRecentCXXRecordDecl());
698+
mangleName(MPT->getClass()->getAsCXXRecordDecl());
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->getMostRecentCXXRecordDecl());
3334+
mangleName(T->getClass()->castAs<RecordType>()->getDecl());
33353335
mangleFunctionType(FPT, nullptr, true);
33363336
} else {
33373337
mangleQualifiers(PointeeType.getQualifiers(), true);
3338-
mangleName(T->getMostRecentCXXRecordDecl());
3338+
mangleName(T->getClass()->castAs<RecordType>()->getDecl());
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->getMostRecentCXXRecordDecl());
4312+
mangleName(T->getClass()->castAs<RecordType>()->getDecl());
43134313
mangleFunctionType(FPT, nullptr, true);
43144314
} else {
43154315
mangleQualifiers(PointeeType.getQualifiers(), true);
4316-
mangleName(T->getMostRecentCXXRecordDecl());
4316+
mangleName(T->getClass()->castAs<RecordType>()->getDecl());
43174317
mangleAutoReturnType(PointeeType, QMM_Drop);
43184318
}
43194319
}

clang/lib/AST/Type.cpp

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2446,17 +2446,19 @@ 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-
// The inheritance attribute might only be present on the most recent
2450-
// CXXRecordDecl.
2451-
const CXXRecordDecl *RD =
2452-
cast<MemberPointerType>(CanonicalType)->getMostRecentCXXRecordDecl();
2449+
auto *MPTy = cast<MemberPointerType>(CanonicalType);
2450+
const Type *ClassTy = MPTy->getClass();
24532451
// Member pointers with dependent class types don't get special treatment.
2454-
if (!RD)
2452+
if (ClassTy->isDependentType())
24552453
return false;
2454+
const CXXRecordDecl *RD = ClassTy->getAsCXXRecordDecl();
24562455
ASTContext &Context = RD->getASTContext();
24572456
// Member pointers not in the MS ABI don't get special treatment.
24582457
if (!Context.getTargetInfo().getCXXABI().isMicrosoft())
24592458
return false;
2459+
// The inheritance attribute might only be present on the most recent
2460+
// CXXRecordDecl, use that one.
2461+
RD = RD->getMostRecentNonInjectedDecl();
24602462
// Nothing interesting to do if the inheritance attribute is already set.
24612463
if (RD->hasAttr<MSInheritanceAttr>())
24622464
return false;
@@ -4711,8 +4713,7 @@ LinkageInfo LinkageComputer::computeTypeLinkageInfo(const Type *T) {
47114713
return computeTypeLinkageInfo(cast<ReferenceType>(T)->getPointeeType());
47124714
case Type::MemberPointer: {
47134715
const auto *MPT = cast<MemberPointerType>(T);
4714-
LinkageInfo LV =
4715-
getDeclLinkageAndVisibility(MPT->getMostRecentCXXRecordDecl());
4716+
LinkageInfo LV = computeTypeLinkageInfo(MPT->getClass());
47164717
LV.merge(computeTypeLinkageInfo(MPT->getPointeeType()));
47174718
return LV;
47184719
}
@@ -5178,10 +5179,7 @@ QualType::DestructionKind QualType::isDestructedTypeImpl(QualType type) {
51785179
}
51795180

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

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

clang/lib/CodeGen/CGCXXABI.cpp

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

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

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

298299
return CGM.GetNonVirtualBaseClassOffset(derivedClass,
299300
E->path_begin(),

clang/lib/CodeGen/CGClass.cpp

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

clang/lib/CodeGen/CGDebugInfo.cpp

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

3493-
llvm::DIType *ClassType = getOrCreateType(
3494-
QualType(Ty->getMostRecentCXXRecordDecl()->getTypeForDecl(), 0), U);
3493+
llvm::DIType *ClassType = getOrCreateType(QualType(Ty->getClass(), 0), U);
34953494
if (Ty->isMemberDataPointerType())
34963495
return DBuilder.createMemberPointerType(
34973496
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,7 +453,8 @@ 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 = MPT->getMostRecentCXXRecordDecl();
456+
const auto *RD =
457+
cast<CXXRecordDecl>(MPT->getClass()->castAs<RecordType>()->getDecl());
457458

458459
// Emit the 'this' pointer.
459460
Address This = Address::invalid();
@@ -462,9 +463,8 @@ CodeGenFunction::EmitCXXMemberPointerCallExpr(const CXXMemberCallExpr *E,
462463
else
463464
This = EmitLValue(BaseExpr, KnownNonNull).getAddress();
464465

465-
EmitTypeCheck(
466-
TCK_MemberCall, E->getExprLoc(), This.emitRawPointer(*this),
467-
QualType(MPT->getMostRecentCXXRecordDecl()->getTypeForDecl(), 0));
466+
EmitTypeCheck(TCK_MemberCall, E->getExprLoc(), This.emitRawPointer(*this),
467+
QualType(MPT->getClass(), 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->getMostRecentCXXRecordDecl()->getTypeForDecl();
731+
auto *C = MPTy->getClass();
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: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -628,7 +628,8 @@ CGCallee ItaniumCXXABI::EmitLoadOfMemberFunctionPointer(
628628

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

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

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

798799
// Check the function pointer if CFI on member function pointers is enabled.
799800
if (ShouldEmitCFICheck) {
800-
CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl();
801+
CXXRecordDecl *RD = MPT->getClass()->getAsCXXRecordDecl();
801802
if (RD->hasDefinition()) {
802803
CodeGenFunction::SanitizerScope SanScope(&CGF);
803804

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

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

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

clang/lib/Sema/SemaDeclCXX.cpp

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

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

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

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

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

3091-
return Derived->isDerivedFrom(Base, Paths);
3092-
}
3093-
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-
}
3100-
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);
3094+
return DerivedRD->isDerivedFrom(BaseRD);
31063095
}
31073096

31083097
bool Sema::IsDerivedFrom(SourceLocation Loc, QualType Derived, QualType Base,
31093098
CXXBasePaths &Paths) {
3110-
return IsDerivedFrom(Loc, Derived->getAsCXXRecordDecl(),
3111-
Base->getAsCXXRecordDecl(), 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;
3109+
3110+
if (!isCompleteType(Loc, Derived) && !DerivedRD->isBeingDefined())
3111+
return false;
3112+
3113+
return DerivedRD->isDerivedFrom(BaseRD, Paths);
31123114
}
31133115

31143116
static void BuildBasePathArray(const CXXBasePath &Path,

0 commit comments

Comments
 (0)