From: Eric Fiselier Date: Fri, 2 Feb 2018 20:30:39 +0000 (+0000) Subject: Make __has_unique_object_representations reject empty union types. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=94aa2dbfab63948a4110733b9bbaf40bbf0b4e77;p=clang Make __has_unique_object_representations reject empty union types. Summary: Clang incorrectly reports empty unions as having a unique object representation. However, this is not correct since `sizeof(EmptyUnion) == 1` AKA it has 8 bits of padding. Therefore it should be treated the same as an empty struct and report `false`. @erichkeane also suggested this fix should be merged into the 6.0 release branch, so the initial release of `__has_unique_object_representations` is as bug-free as possible. Reviewers: erichkeane, rsmith, aaron.ballman, majnemer Reviewed By: erichkeane Subscribers: cfe-commits, erichkeane Differential Revision: https://reviews.llvm.org/D42863 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@324134 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index c81d578640..061af1c3ac 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -2145,7 +2145,7 @@ static bool unionHasUniqueObjectRepresentations(const ASTContext &Context, if (FieldSize != UnionSize) return false; } - return true; + return !RD->field_empty(); } static bool isStructEmpty(QualType Ty) { diff --git a/test/SemaCXX/type-traits.cpp b/test/SemaCXX/type-traits.cpp index 8cf688014c..ca96503e26 100644 --- a/test/SemaCXX/type-traits.cpp +++ b/test/SemaCXX/type-traits.cpp @@ -2566,6 +2566,7 @@ static_assert(!has_unique_object_representations::value, "No refere static_assert(!has_unique_object_representations::value, "No references!"); static_assert(!has_unique_object_representations::value, "No references!"); static_assert(!has_unique_object_representations::value, "No empty types!"); +static_assert(!has_unique_object_representations::value, "No empty types!"); class Compressed : Empty { int x;