[clang] [CLANG][MS-STRUCT] bitfield padding warning presents padding to exact bit count (PR #136062)
Theo de Magalhaes via cfe-commits
cfe-commits at lists.llvm.org
Wed Apr 16 23:34:08 PDT 2025
https://github.com/theomagellan updated https://github.com/llvm/llvm-project/pull/136062
>From 842f0fbed0043ad0aa1679d8a30bc13d64eb25cf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Th=C3=A9o=20de=20Magalhaes?= <theodemagalhaes at icloud.com>
Date: Thu, 17 Apr 2025 01:45:12 +0200
Subject: [PATCH] fix(ms_struct): bitfield padding warning presents padding to
exact bit count
---
clang/lib/AST/RecordLayoutBuilder.cpp | 4 +++-
clang/test/SemaCXX/windows-Wpadded-bitfield.cpp | 15 +++++++++++++++
2 files changed, 18 insertions(+), 1 deletion(-)
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp
index ea353f88a8aec..ca08e186f4ff2 100644
--- a/clang/lib/AST/RecordLayoutBuilder.cpp
+++ b/clang/lib/AST/RecordLayoutBuilder.cpp
@@ -1538,6 +1538,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
@@ -1610,6 +1611,7 @@ void ItaniumRecordLayoutBuilder::LayoutBitField(const FieldDecl *D) {
if (!LastBitfieldStorageUnitSize && !FieldSize)
FieldAlign = 1;
+ PaddingInLastUnit = UnfilledBitsInLastUnit;
UnfilledBitsInLastUnit = 0;
LastBitfieldStorageUnitSize = 0;
}
@@ -1706,7 +1708,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..0b88b4c170617 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)) Foo { // expected-warning {{padding size of 'Foo' with 63 bits to alignment boundary}}
+ long long x;
+ char a : 1;
+ long long b : 1; // expected-warning {{padding struct 'Foo' 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;
+ Foo f;
+ SameUnitSizeMultiple susm;
}
More information about the cfe-commits
mailing list