Skip to content

Commit 3b64a45

Browse files
author
git apple-llvm automerger
committed
Merge commit '141656644959' from llvm.org/main into next
2 parents acf38ed + 1416566 commit 3b64a45

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
@@ -6164,10 +6164,11 @@ class Sema final : public SemaBase {
61646164

61656165
/// Determine whether the type \p Derived is a C++ class that is
61666166
/// derived from the type \p Base.
6167+
bool IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived,
6168+
CXXRecordDecl *Base, CXXBasePaths &Paths);
6169+
bool IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived,
6170+
CXXRecordDecl *Base);
61676171
bool IsDerivedFrom(SourceLocation Loc, QualType Derived, QualType Base);
6168-
6169-
/// Determine whether the type \p Derived is a C++ class that is
6170-
/// derived from the type \p Base.
61716172
bool IsDerivedFrom(SourceLocation Loc, QualType Derived, QualType Base,
61726173
CXXBasePaths &Paths);
61736174

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
@@ -10970,8 +10970,9 @@ bool MemberPointerExprEvaluator::VisitCastExpr(const CastExpr *E) {
1097010970
if (!Result.castToDerived(Derived))
1097110971
return Error(E);
1097210972
}
10973-
const Type *FinalTy = E->getType()->castAs<MemberPointerType>()->getClass();
10974-
if (!Result.castToDerived(FinalTy->getAsCXXRecordDecl()))
10973+
if (!Result.castToDerived(E->getType()
10974+
->castAs<MemberPointerType>()
10975+
->getMostRecentCXXRecordDecl()))
1097510976
return Error(E);
1097610977
return true;
1097710978
}

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
}
@@ -4310,11 +4310,11 @@ void MicrosoftCXXNameMangler::mangleAutoReturnType(const MemberPointerType *T,
43104310
manglePointerExtQualifiers(Quals, PointeeType);
43114311
if (const FunctionProtoType *FPT = PointeeType->getAs<FunctionProtoType>()) {
43124312
Out << '8';
4313-
mangleName(T->getClass()->castAs<RecordType>()->getDecl());
4313+
mangleName(T->getMostRecentCXXRecordDecl());
43144314
mangleFunctionType(FPT, nullptr, true);
43154315
} else {
43164316
mangleQualifiers(PointeeType.getQualifiers(), true);
4317-
mangleName(T->getClass()->castAs<RecordType>()->getDecl());
4317+
mangleName(T->getMostRecentCXXRecordDecl());
43184318
mangleAutoReturnType(PointeeType, QMM_Drop);
43194319
}
43204320
}

clang/lib/AST/Type.cpp

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2546,19 +2546,17 @@ bool Type::isIncompleteType(NamedDecl **Def) const {
25462546
// Member pointers in the MS ABI have special behavior in
25472547
// RequireCompleteType: they attach a MSInheritanceAttr to the CXXRecordDecl
25482548
// to indicate which inheritance model to use.
2549-
auto *MPTy = cast<MemberPointerType>(CanonicalType);
2550-
const Type *ClassTy = MPTy->getClass();
2549+
// The inheritance attribute might only be present on the most recent
2550+
// CXXRecordDecl.
2551+
const CXXRecordDecl *RD =
2552+
cast<MemberPointerType>(CanonicalType)->getMostRecentCXXRecordDecl();
25512553
// Member pointers with dependent class types don't get special treatment.
2552-
if (ClassTy->isDependentType())
2554+
if (!RD || RD->isDependentType())
25532555
return false;
2554-
const CXXRecordDecl *RD = ClassTy->getAsCXXRecordDecl();
25552556
ASTContext &Context = RD->getASTContext();
25562557
// Member pointers not in the MS ABI don't get special treatment.
25572558
if (!Context.getTargetInfo().getCXXABI().isMicrosoft())
25582559
return false;
2559-
// The inheritance attribute might only be present on the most recent
2560-
// CXXRecordDecl, use that one.
2561-
RD = RD->getMostRecentNonInjectedDecl();
25622560
// Nothing interesting to do if the inheritance attribute is already set.
25632561
if (RD->hasAttr<MSInheritanceAttr>())
25642562
return false;
@@ -4895,7 +4893,8 @@ LinkageInfo LinkageComputer::computeTypeLinkageInfo(const Type *T) {
48954893
return computeTypeLinkageInfo(cast<ReferenceType>(T)->getPointeeType());
48964894
case Type::MemberPointer: {
48974895
const auto *MPT = cast<MemberPointerType>(T);
4898-
LinkageInfo LV = computeTypeLinkageInfo(MPT->getClass());
4896+
LinkageInfo LV =
4897+
getDeclLinkageAndVisibility(MPT->getMostRecentCXXRecordDecl());
48994898
LV.merge(computeTypeLinkageInfo(MPT->getPointeeType()));
49004899
return LV;
49014900
}
@@ -5361,7 +5360,10 @@ QualType::DestructionKind QualType::isDestructedTypeImpl(QualType type) {
53615360
}
53625361

53635362
CXXRecordDecl *MemberPointerType::getMostRecentCXXRecordDecl() const {
5364-
return getClass()->getAsCXXRecordDecl()->getMostRecentNonInjectedDecl();
5363+
auto *RD = getClass()->getAsCXXRecordDecl();
5364+
if (!RD)
5365+
return nullptr;
5366+
return RD->getMostRecentNonInjectedDecl();
53655367
}
53665368

53675369
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
}

0 commit comments

Comments
 (0)