[PATCH] D146329: [Clang] Fix defaulted equality operator so that it does not attempt to compare unnamed bit-fields
Shafik Yaghmour via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Mar 17 13:45:57 PDT 2023
shafik created this revision.
shafik added reviewers: aaron.ballman, erichkeane, rsmith.
Herald added a project: All.
shafik requested review of this revision.
If we look at class.bit p2 <https://eel.is/c++draft/class.bit#2.sentence-2> it tells us that that unnamed bit-fields are not members and class.compare.default p5 <https://eel.is/c++draft/class.compare.default#5.sentence-1> tells us that we should only non-static data members of the class.
This fixes: https://github.com/llvm/llvm-project/issues/61335 and https://github.com/llvm/llvm-project/issues/61417
https://reviews.llvm.org/D146329
Files:
clang/lib/Sema/SemaDeclCXX.cpp
clang/test/CXX/class/class.compare/class.compare.default/p1.cpp
Index: clang/test/CXX/class/class.compare/class.compare.default/p1.cpp
===================================================================
--- clang/test/CXX/class/class.compare/class.compare.default/p1.cpp
+++ clang/test/CXX/class/class.compare/class.compare.default/p1.cpp
@@ -226,3 +226,26 @@
(void)(b == 0);
}
} // namespace p2085_2
+
+namespace GH61417 {
+struct A {
+ unsigned x : 1;
+ unsigned : 0;
+ unsigned y : 1;
+
+ constexpr A() : x(0), y(0) {}
+ bool operator==(const A& rhs) const noexcept = default;
+};
+
+void f1() {
+ constexpr A a, b;
+ constexpr bool c = (a == b); // no diagnostic, we should not be comparing the
+ // unnamed bit-field which is indeterminate
+}
+
+void f2() {
+ A a, b;
+ bool c = (a == b); // no diagnostic nor crash during codegen attempting to
+ // access info for unnamed bit-field
+}
+}
Index: clang/lib/Sema/SemaDeclCXX.cpp
===================================================================
--- clang/lib/Sema/SemaDeclCXX.cpp
+++ clang/lib/Sema/SemaDeclCXX.cpp
@@ -7755,6 +7755,10 @@
// followed by the non-static data members of C
for (FieldDecl *Field : Record->fields()) {
+ // C++23 [class.bit]p2:
+ // Unnamed bit-fields are not members ...
+ if (Field->isUnnamedBitfield())
+ continue;
// Recursively expand anonymous structs.
if (Field->isAnonymousStructOrUnion()) {
if (visitSubobjects(Results, Field->getType()->getAsCXXRecordDecl(),
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D146329.506192.patch
Type: text/x-patch
Size: 1522 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230317/a7a68fa3/attachment.bin>
More information about the cfe-commits
mailing list