Author: Theo de Magalhaes Date: 2025-04-21T15:25:14-07:00 New Revision: 3ca2fa704e149ca22bd9739101ee7d5c498eb1a6
URL: https://github.com/llvm/llvm-project/commit/3ca2fa704e149ca22bd9739101ee7d5c498eb1a6 DIFF: https://github.com/llvm/llvm-project/commit/3ca2fa704e149ca22bd9739101ee7d5c498eb1a6.diff LOG: [CLANG][MS-STRUCT] bitfield padding warning presents padding to exact bit count (#136062) Aims to fix #131647. Added: Modified: clang/lib/AST/RecordLayoutBuilder.cpp clang/test/SemaCXX/windows-Wpadded-bitfield.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp index dd932f6179f88..aacc079f2521d 100644 --- a/clang/lib/AST/RecordLayoutBuilder.cpp +++ b/clang/lib/AST/RecordLayoutBuilder.cpp @@ -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 diff erence 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 diff --git a/clang/test/SemaCXX/windows-Wpadded-bitfield.cpp b/clang/test/SemaCXX/windows-Wpadded-bitfield.cpp index ee5a57124eca5..28917ffaadb6f 100644 --- a/clang/test/SemaCXX/windows-Wpadded-bitfield.cpp +++ b/clang/test/SemaCXX/windows-Wpadded-bitfield.cpp @@ -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; } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits