================ @@ -376,33 +377,41 @@ void CGRecordLowering::lowerUnion(bool isNoUniqueAddress) { } void CGRecordLowering::accumulateFields() { - for (RecordDecl::field_iterator Field = D->field_begin(), - FieldEnd = D->field_end(); - Field != FieldEnd;) { + RecordDecl::field_iterator FieldEnd = D->field_end(); + RecordDecl::field_iterator BitField = FieldEnd; + for (RecordDecl::field_iterator Field = D->field_begin(); Field != FieldEnd; + ++Field) { if (Field->isBitField()) { - RecordDecl::field_iterator Start = Field; - // Iterate to gather the list of bitfields. - for (++Field; Field != FieldEnd && Field->isBitField(); ++Field); - accumulateBitFields(Start, Field); + if (BitField == FieldEnd) + // Start gathering bitfields + BitField = Field; } else if (!Field->isZeroSize(Context)) { // Use base subobject layout for the potentially-overlapping field, // as it is done in RecordLayoutBuilder + CharUnits Offset = bitsToCharUnits(getFieldBitOffset(*Field)); ---------------- rjmccall wrote:
This is permitting accesses to cross a regular field if it has zero size. That is not allowed; bit-fields are only part of the same memory location if they are part of a consecutive sequence of non-zero-width bit-fields, and bit-fields in different memory locations must never interfere. https://github.com/llvm/llvm-project/pull/65742 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits