[PATCH] D89649: Fix __has_unique_object_representations with no_unique_address
Gabor Bencze via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Sun Oct 18 10:18:59 PDT 2020
gbencze created this revision.
gbencze added reviewers: rsmith, aaron.ballman.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
gbencze requested review of this revision.
Fix incorrect behavior of __has_unique_object_representations when using the no_unique_address attribute.
Based on the bug report: https://bugs.llvm.org/show_bug.cgi?id=47722 <https://bugs.llvm.org/show_bug.cgi?id=47722>
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D89649
Files:
clang/lib/AST/ASTContext.cpp
clang/test/SemaCXX/has_unique_object_reps_no_unique_addr.cpp
Index: clang/test/SemaCXX/has_unique_object_reps_no_unique_addr.cpp
===================================================================
--- /dev/null
+++ clang/test/SemaCXX/has_unique_object_reps_no_unique_addr.cpp
@@ -0,0 +1,26 @@
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -fsyntax-only -verify -std=c++2a %s
+// expected-no-diagnostics
+
+struct Empty {};
+
+struct A {
+ [[no_unique_address]] Empty e;
+ char x;
+};
+
+static_assert(__has_unique_object_representations(A));
+
+struct B {
+ char x;
+ [[no_unique_address]] Empty e;
+};
+
+static_assert(__has_unique_object_representations(B));
+
+struct C {
+ char x;
+ [[no_unique_address]] Empty e1;
+ [[no_unique_address]] Empty e2;
+};
+
+static_assert(!__has_unique_object_representations(C));
Index: clang/lib/AST/ASTContext.cpp
===================================================================
--- clang/lib/AST/ASTContext.cpp
+++ clang/lib/AST/ASTContext.cpp
@@ -2602,9 +2602,12 @@
}
for (const auto *Field : RD->fields()) {
- if (!Field->getType()->isReferenceType() &&
- !Context.hasUniqueObjectRepresentations(Field->getType()))
- return llvm::None;
+ if (!Field->getType()->isReferenceType()) {
+ if (Field->isZeroSize(Context))
+ continue;
+ else if (!Context.hasUniqueObjectRepresentations(Field->getType()))
+ return llvm::None;
+ }
int64_t FieldSizeInBits =
Context.toBits(Context.getTypeSizeInChars(Field->getType()));
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D89649.298881.patch
Type: text/x-patch
Size: 1476 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20201018/a3e176be/attachment-0001.bin>
More information about the cfe-commits
mailing list