[clang] e59ed0f - [Clang] __has_unique_object_representations should not accept Incomplete[] (#138291)
via cfe-commits
cfe-commits at lists.llvm.org
Fri May 2 10:36:56 PDT 2025
Author: cor3ntin
Date: 2025-05-02T19:36:53+02:00
New Revision: e59ed0fb0f3324ae3fce4080e15472a316713dfd
URL: https://github.com/llvm/llvm-project/commit/e59ed0fb0f3324ae3fce4080e15472a316713dfd
DIFF: https://github.com/llvm/llvm-project/commit/e59ed0fb0f3324ae3fce4080e15472a316713dfd.diff
LOG: [Clang] __has_unique_object_representations should not accept Incomplete[] (#138291)
This implements [LWG4113](https://cplusplus.github.io/LWG/issue411)
This is technically a breaking change, but it's a fix, and I think
anyone who relies on this today is in a world of hurt.
Fixes #118350
Added:
Modified:
clang/docs/ReleaseNotes.rst
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 7f58aea5f83ad..792ef88b5c87d 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -559,6 +559,9 @@ Bug Fixes to Compiler Builtins
``void(char *, char *)`` to ``void(void *, void *)`` to match GCC's signature
for the same builtin. (#GH47833)
+- ``__has_unique_object_representations(Incomplete[])`` is no longer accepted, per
+ `LWG4113 <https://cplusplus.github.io/LWG/issue4113>`_.
+
Bug Fixes to Attribute Support
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- Fixed crash when a parameter to the ``clang::annotate`` attribute evaluates to ``void``. See #GH119125
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp
index 9ff4bc6c7e38f..235ea1529b0b8 100644
--- a/clang/lib/Sema/SemaExprCXX.cpp
+++ b/clang/lib/Sema/SemaExprCXX.cpp
@@ -5418,6 +5418,15 @@ static bool CheckUnaryTypeTraitTypeCompleteness(Sema &S, TypeTrait UTT,
return !S.RequireCompleteType(
Loc, ArgTy, diag::err_incomplete_type_used_in_type_trait_expr);
+ // has_unique_object_representations<T>
+ // remove_all_extents_t<T> shall be a complete type or cv void (LWG4113).
+ case UTT_HasUniqueObjectRepresentations:
+ ArgTy = QualType(ArgTy->getBaseElementTypeUnsafe(), 0);
+ if (ArgTy->isVoidType())
+ return true;
+ return !S.RequireCompleteType(
+ Loc, ArgTy, diag::err_incomplete_type_used_in_type_trait_expr);
+
// C++1z [meta.unary.prop]:
// remove_all_extents_t<T> shall be a complete type or cv void.
case UTT_IsTrivial:
@@ -5445,13 +5454,8 @@ 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]];
-
// C++1z [meta.unary.prop]:
// T shall be a complete type, cv void, or an array of unknown bound.
case UTT_IsDestructible:
diff --git a/clang/test/SemaCXX/type-traits.cpp b/clang/test/SemaCXX/type-traits.cpp
index b130024503101..7768f61ac2d00 100644
--- a/clang/test/SemaCXX/type-traits.cpp
+++ b/clang/test/SemaCXX/type-traits.cpp
@@ -3383,6 +3383,16 @@ static_assert(!__has_unique_object_representations(float), "definitely not Float
static_assert(!__has_unique_object_representations(double), "definitely not Floating Point");
static_assert(!__has_unique_object_representations(long double), "definitely not Floating Point");
+
+static_assert(!__has_unique_object_representations(AnIncompleteType[]));
+//expected-error at -1 {{incomplete type 'AnIncompleteType' used in type trait expression}}
+static_assert(!__has_unique_object_representations(AnIncompleteType[][1]));
+//expected-error at -1 {{incomplete type 'AnIncompleteType' used in type trait expression}}
+static_assert(!__has_unique_object_representations(AnIncompleteType[1]));
+//expected-error at -1 {{incomplete type 'AnIncompleteType' used in type trait expression}}
+static_assert(!__has_unique_object_representations(AnIncompleteType));
+//expected-error at -1 {{incomplete type 'AnIncompleteType' used in type trait expression}}
+
struct NoPadding {
int a;
int b;
More information about the cfe-commits
mailing list