@@ -822,8 +822,9 @@ CodeGenFunction::evaluateOrEmitBuiltinObjectSize(const Expr *E, unsigned Type,
822
822
return ConstantInt::get(ResType, ObjectSize, /*isSigned=*/true);
823
823
}
824
824
825
- const FieldDecl *CodeGenFunction::FindFlexibleArrayMemberField(
826
- ASTContext &Ctx, const RecordDecl *RD, StringRef Name, uint64_t &Offset) {
825
+ const FieldDecl *CodeGenFunction::FindFlexibleArrayMemberFieldAndOffset(
826
+ ASTContext &Ctx, const RecordDecl *RD, const FieldDecl *FAMDecl,
827
+ uint64_t &Offset) {
827
828
const LangOptions::StrictFlexArraysLevelKind StrictFlexArraysLevel =
828
829
getLangOpts().getStrictFlexArraysLevel();
829
830
uint32_t FieldNo = 0;
@@ -832,7 +833,7 @@ const FieldDecl *CodeGenFunction::FindFlexibleArrayMemberField(
832
833
return nullptr;
833
834
834
835
for (const FieldDecl *FD : RD->fields()) {
835
- if ((Name.empty() || FD->getNameAsString() == Name ) &&
836
+ if ((!FAMDecl || FD == FAMDecl ) &&
836
837
Decl::isFlexibleArrayMemberLike(
837
838
Ctx, FD, FD->getType(), StrictFlexArraysLevel,
838
839
/*IgnoreTemplateOrMacroSubstitution=*/true)) {
@@ -843,8 +844,8 @@ const FieldDecl *CodeGenFunction::FindFlexibleArrayMemberField(
843
844
844
845
QualType Ty = FD->getType();
845
846
if (Ty->isRecordType()) {
846
- if (const FieldDecl *Field = FindFlexibleArrayMemberField (
847
- Ctx, Ty->getAsRecordDecl(), Name , Offset)) {
847
+ if (const FieldDecl *Field = FindFlexibleArrayMemberFieldAndOffset (
848
+ Ctx, Ty->getAsRecordDecl(), FAMDecl , Offset)) {
848
849
const ASTRecordLayout &Layout = Ctx.getASTRecordLayout(RD);
849
850
Offset += Layout.getFieldOffset(FieldNo);
850
851
return Field;
@@ -930,12 +931,14 @@ CodeGenFunction::emitFlexibleArrayMemberSize(const Expr *E, unsigned Type,
930
931
931
932
// Get the flexible array member Decl.
932
933
const RecordDecl *OuterRD = nullptr;
933
- std::string FAMName ;
934
+ const FieldDecl *FAMDecl = nullptr ;
934
935
if (const auto *ME = dyn_cast<MemberExpr>(Base)) {
935
936
// Check if \p Base is referencing the FAM itself.
936
937
const ValueDecl *VD = ME->getMemberDecl();
937
938
OuterRD = VD->getDeclContext()->getOuterLexicalRecordContext();
938
- FAMName = VD->getNameAsString();
939
+ FAMDecl = dyn_cast<FieldDecl>(VD);
940
+ if (!FAMDecl)
941
+ return nullptr;
939
942
} else if (const auto *DRE = dyn_cast<DeclRefExpr>(Base)) {
940
943
// Check if we're pointing to the whole struct.
941
944
QualType Ty = DRE->getDecl()->getType();
@@ -974,9 +977,11 @@ CodeGenFunction::emitFlexibleArrayMemberSize(const Expr *E, unsigned Type,
974
977
if (!OuterRD)
975
978
return nullptr;
976
979
980
+ // We call FindFlexibleArrayMemberAndOffset even if FAMDecl is non-null to
981
+ // get its offset.
977
982
uint64_t Offset = 0;
978
- const FieldDecl * FAMDecl =
979
- FindFlexibleArrayMemberField (Ctx, OuterRD, FAMName , Offset);
983
+ FAMDecl =
984
+ FindFlexibleArrayMemberFieldAndOffset (Ctx, OuterRD, FAMDecl , Offset);
980
985
Offset = Ctx.toCharUnitsFromBits(Offset).getQuantity();
981
986
982
987
if (!FAMDecl || !FAMDecl->getType()->isCountAttributedType())
0 commit comments