@@ -1321,6 +1321,16 @@ CodeGenFunction::emitCountedByMemberSize(const Expr *E, llvm::Value *EmittedE,
13211321 // u64's leading to overflows..
13221322 int64_t CharWidth = static_cast<int64_t>(CGM.getContext().getCharWidth());
13231323
1324+ // size_t field_offset = offsetof (struct s, field);
1325+ Value *FieldOffset = nullptr;
1326+ if (FlexibleArrayMemberFD != FD) {
1327+ std::optional<int64_t> Offset = GetFieldOffset(Ctx, RD, FD);
1328+ if (!Offset)
1329+ return nullptr;
1330+ FieldOffset =
1331+ llvm::ConstantInt::get(ResType, *Offset / CharWidth, IsSigned);
1332+ }
1333+
13241334 // size_t count = (size_t) ptr->count;
13251335 Value *Count = EmitLoadOfCountedByField(ME, FlexibleArrayMemberFD, CountFD);
13261336 if (!Count)
@@ -1341,16 +1351,6 @@ CodeGenFunction::emitCountedByMemberSize(const Expr *E, llvm::Value *EmittedE,
13411351 auto *FlexibleArrayMemberBaseSize =
13421352 llvm::ConstantInt::get(ResType, BaseSize.getQuantity(), IsSigned);
13431353
1344- // size_t field_offset = offsetof (struct s, field);
1345- Value *FieldOffset = nullptr;
1346- if (FlexibleArrayMemberFD != FD) {
1347- std::optional<int64_t> Offset = GetFieldOffset(Ctx, RD, FD);
1348- if (!Offset)
1349- return nullptr;
1350- FieldOffset =
1351- llvm::ConstantInt::get(ResType, *Offset / CharWidth, IsSigned);
1352- }
1353-
13541354 // size_t flexible_array_member_size =
13551355 // count * flexible_array_member_base_size;
13561356 Value *FlexibleArrayMemberSize =
0 commit comments