[PATCH] D114292: [clang-tidy] Fix `altera-struct-pack-align` check for empty structs
Fabian Wolff via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Apr 20 07:56:45 PDT 2022
This revision was automatically updated to reflect the committed changes.
Closed by commit rGf25935a00091: [clang-tidy] Fix `altera-struct-pack-align` check for empty structs (authored by fwolff).
Changed prior to commit:
https://reviews.llvm.org/D114292?vs=400634&id=423908#toc
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D114292/new/
https://reviews.llvm.org/D114292
Files:
clang-tools-extra/clang-tidy/altera/StructPackAlignCheck.cpp
clang-tools-extra/docs/ReleaseNotes.rst
clang-tools-extra/test/clang-tidy/checkers/altera-struct-pack-align.cpp
Index: clang-tools-extra/test/clang-tidy/checkers/altera-struct-pack-align.cpp
===================================================================
--- clang-tools-extra/test/clang-tidy/checkers/altera-struct-pack-align.cpp
+++ clang-tools-extra/test/clang-tidy/checkers/altera-struct-pack-align.cpp
@@ -99,3 +99,22 @@
struct bad_align3 instantiated { 'a', 0.001, 'b' };
}
+// Make sure that we don't recommend aligning an empty struct to zero bytes (PR#51620)
+struct StructWithNoFields {};
+
+struct ContainsStructWithNoFields {
+ StructWithNoFields s;
+};
+
+// Make sure that an empty struct is treated like "char" for padding and alignment purposes
+struct ContainsStructWithNoFields2 {
+ StructWithNoFields s;
+ double d;
+ StructWithNoFields t;
+};
+// CHECK-MESSAGES: :[[@LINE-5]]:8: warning: accessing fields in struct 'ContainsStructWithNoFields2' is inefficient due to padding; only needs 10 bytes but is using 24 bytes [altera-struct-pack-align]
+// CHECK-MESSAGES: :[[@LINE-6]]:8: note: use "__attribute__((packed))" to reduce the amount of padding applied to struct 'ContainsStructWithNoFields2'
+// CHECK-MESSAGES: :[[@LINE-7]]:8: warning: accessing fields in struct 'ContainsStructWithNoFields2' is inefficient due to poor alignment; currently aligned to 8 bytes, but recommended alignment is 16 bytes [altera-struct-pack-align]
+// CHECK-MESSAGES: :[[@LINE-8]]:8: note: use "__attribute__((aligned(16)))" to align struct 'ContainsStructWithNoFields2' to 16 bytes
+// CHECK-FIXES: __attribute__((packed))
+// CHECK-FIXES: __attribute__((aligned(16)));
Index: clang-tools-extra/docs/ReleaseNotes.rst
===================================================================
--- clang-tools-extra/docs/ReleaseNotes.rst
+++ clang-tools-extra/docs/ReleaseNotes.rst
@@ -170,6 +170,9 @@
<clang-tidy/checks/performance-inefficient-vector-operation>` to work when
the vector is a member of a structure.
+- Fixed nonsensical suggestion of :doc:`altera-struct-pack-align
+ <clang-tidy/checks/altera-struct-pack-align>` check for empty structs.
+
Removed checks
^^^^^^^^^^^^^^
Index: clang-tools-extra/clang-tidy/altera/StructPackAlignCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/altera/StructPackAlignCheck.cpp
+++ clang-tools-extra/clang-tidy/altera/StructPackAlignCheck.cpp
@@ -77,7 +77,8 @@
uint64_t CharSize = Result.Context->getCharWidth();
CharUnits CurrSize = Result.Context->getASTRecordLayout(Struct).getSize();
CharUnits MinByteSize =
- CharUnits::fromQuantity(ceil((float)TotalBitSize / CharSize));
+ CharUnits::fromQuantity(std::max<clang::CharUnits::QuantityType>(
+ ceil(static_cast<float>(TotalBitSize) / CharSize), 1));
CharUnits MaxAlign = CharUnits::fromQuantity(
ceil((float)Struct->getMaxAlignment() / CharSize));
CharUnits CurrAlign =
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D114292.423908.patch
Type: text/x-patch
Size: 2885 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220420/2dbc7167/attachment.bin>
More information about the cfe-commits
mailing list