[CLANG][MS-STRUCT] bitfield padding warning presents padding to exact bit count (#136062)

Aims to fix #131647.
This commit is contained in:
Theo de Magalhaes 2025-04-22 00:25:14 +02:00 committed by GitHub
parent 6d765e1c91
commit 3ca2fa704e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 18 additions and 1 deletions

View File

@ -1539,6 +1539,7 @@ void ItaniumRecordLayoutBuilder::LayoutBitField(const FieldDecl *D) {
uint64_t StorageUnitSize = FieldInfo.Width;
unsigned FieldAlign = FieldInfo.Align;
bool AlignIsRequired = FieldInfo.isAlignRequired();
unsigned char PaddingInLastUnit = 0;
// UnfilledBitsInLastUnit is the difference between the end of the
// last allocated bitfield (i.e. the first bit offset available for
@ -1611,6 +1612,7 @@ void ItaniumRecordLayoutBuilder::LayoutBitField(const FieldDecl *D) {
if (!LastBitfieldStorageUnitSize && !FieldSize)
FieldAlign = 1;
PaddingInLastUnit = UnfilledBitsInLastUnit;
UnfilledBitsInLastUnit = 0;
LastBitfieldStorageUnitSize = 0;
}
@ -1707,7 +1709,7 @@ void ItaniumRecordLayoutBuilder::LayoutBitField(const FieldDecl *D) {
// For purposes of diagnostics, we're going to simultaneously
// compute the field offsets that we would have used if we weren't
// adding any alignment padding or if the field weren't packed.
uint64_t UnpaddedFieldOffset = FieldOffset;
uint64_t UnpaddedFieldOffset = FieldOffset - PaddingInLastUnit;
uint64_t UnpackedFieldOffset = FieldOffset;
// Check if we need to add padding to fit the bitfield within an

View File

@ -1,4 +1,5 @@
// RUN: %clang_cc1 -triple x86_64-windows-msvc -fsyntax-only -verify -Wpadded %s
// RUN: %clang_cc1 -triple x86_64-linux-gnu -fsyntax-only -verify -Wpadded %s
struct __attribute__((ms_struct)) BitfieldStruct { // expected-warning {{padding size of 'BitfieldStruct' with 3 bytes to alignment boundary}}
char c : 1;
@ -24,9 +25,23 @@ struct __attribute__((ms_struct)) DifferentUnitSizeBitfield { // expected-warnin
char i; // expected-warning {{padding struct 'DifferentUnitSizeBitfield' with 31 bits to align 'i'}}
};
struct __attribute__((ms_struct)) BitfieldBigPadding { // expected-warning {{padding size of 'BitfieldBigPadding' with 63 bits to alignment boundary}}
long long x;
char a : 1;
long long b : 1; // expected-warning {{padding struct 'BitfieldBigPadding' with 63 bits to align 'b'}}
};
struct __attribute__((ms_struct)) SameUnitSizeMultiple { // expected-warning {{padding size of 'SameUnitSizeMultiple' with 2 bits to alignment boundary}}
char c : 1;
char cc : 2;
char ccc : 3;
};
int main() {
BitfieldStruct b;
SevenBitfieldStruct s;
SameUnitSizeBitfield su;
DifferentUnitSizeBitfield du;
BitfieldBigPadding bbp;
SameUnitSizeMultiple susm;
}