[clang] 6451806 - [Clang] Require base element type of `__has_unique_object_representations` to be complete (#95432)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Jul 17 06:19:27 PDT 2024
Author: Mital Ashok
Date: 2024-07-17T15:19:23+02:00
New Revision: 6451806ef73bb033be3f6e1599f3bcb224943206
URL: https://github.com/llvm/llvm-project/commit/6451806ef73bb033be3f6e1599f3bcb224943206
DIFF: https://github.com/llvm/llvm-project/commit/6451806ef73bb033be3f6e1599f3bcb224943206.diff
LOG: [Clang] Require base element type of `__has_unique_object_representations` to be complete (#95432)
Fixes #95311
Previous behaviour was that `false` was silently returned, templated
classes were not instantiated and incomplete classes did not issue an
error.
---------
Co-authored-by: cor3ntin <corentinjabot at gmail.com>
Added:
Modified:
clang/docs/ReleaseNotes.rst
clang/lib/AST/ASTContext.cpp
clang/lib/Sema/SemaExprCXX.cpp
clang/test/SemaCXX/type-traits.cpp
Removed:
################################################################################
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 923f3d0a46164..e63282ca3b40d 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -835,6 +835,9 @@ Bug Fixes in This Version
- Fixed Clang from generating dangling StringRefs when deserializing Exprs & Stmts (#GH98667)
+- ``__has_unique_object_representations`` correctly handles arrays of unknown bounds of
+ types by ensuring they are complete and instantiating them if needed. Fixes (#GH95311).
+
Bug Fixes to Compiler Builtins
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index 6c89e3890ae3e..ccbb4baad68af 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -2831,6 +2831,10 @@ bool ASTContext::hasUniqueObjectRepresentations(
return hasUniqueObjectRepresentations(getBaseElementType(Ty),
CheckIfTriviallyCopyable);
+ assert((Ty->isVoidType() || !Ty->isIncompleteType()) &&
+ "hasUniqueObjectRepresentations should not be called with an "
+ "incomplete type");
+
// (9.1) - T is trivially copyable...
if (CheckIfTriviallyCopyable && !Ty.isTriviallyCopyableType(*this))
return false;
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp
index bef7da239e6e5..14d1f395af90e 100644
--- a/clang/lib/Sema/SemaExprCXX.cpp
+++ b/clang/lib/Sema/SemaExprCXX.cpp
@@ -5069,6 +5069,10 @@ static bool CheckUnaryTypeTraitTypeCompleteness(Sema &S, TypeTrait UTT,
case UTT_HasTrivialCopy:
case UTT_HasTrivialDestructor:
case UTT_HasVirtualDestructor:
+ // has_unique_object_representations<T> when T is an array is defined in terms
+ // of has_unique_object_representations<remove_all_extents_t<T>>, so the base
+ // type needs to be complete even if the type is an incomplete array type.
+ case UTT_HasUniqueObjectRepresentations:
ArgTy = QualType(ArgTy->getBaseElementTypeUnsafe(), 0);
[[fallthrough]];
@@ -5077,7 +5081,6 @@ static bool CheckUnaryTypeTraitTypeCompleteness(Sema &S, TypeTrait UTT,
case UTT_IsDestructible:
case UTT_IsNothrowDestructible:
case UTT_IsTriviallyDestructible:
- case UTT_HasUniqueObjectRepresentations:
if (ArgTy->isIncompleteArrayType() || ArgTy->isVoidType())
return true;
diff --git a/clang/test/SemaCXX/type-traits.cpp b/clang/test/SemaCXX/type-traits.cpp
index 7adbf4aad7afe..23b07cac13eaf 100644
--- a/clang/test/SemaCXX/type-traits.cpp
+++ b/clang/test/SemaCXX/type-traits.cpp
@@ -3505,6 +3505,17 @@ static_assert(__has_unique_object_representations(_BitInt(8)), "BitInt:");
static_assert(!__has_unique_object_representations(_BitInt(127)), "BitInt:");
static_assert(__has_unique_object_representations(_BitInt(128)), "BitInt:");
+namespace GH95311 {
+
+template <int>
+class Foo {
+ int x;
+};
+static_assert(__has_unique_object_representations(Foo<0>[]));
+class Bar; // expected-note {{forward declaration of 'GH95311::Bar'}}
+static_assert(__has_unique_object_representations(Bar[])); // expected-error {{incomplete type}}
+
+}
namespace PR46209 {
// Foo has both a trivial assignment operator and a non-trivial one.
More information about the cfe-commits
mailing list