https://github.com/cor3ntin created https://github.com/llvm/llvm-project/pull/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 >From 2fca3f0234d15dc8ac48912ab32f6992f2ecd896 Mon Sep 17 00:00:00 2001 From: Corentin Jabot <corentinja...@gmail.com> Date: Fri, 2 May 2025 17:03:55 +0200 Subject: [PATCH] [Clang] __has_unique_object_representations should not accept Incomplete[] 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 to day is in a world of hurt. Fixes #118350 --- clang/docs/ReleaseNotes.rst | 3 +++ clang/lib/Sema/SemaExprCXX.cpp | 14 +++++++++----- clang/test/SemaCXX/type-traits.cpp | 10 ++++++++++ 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 95e0574562a2d..5a9f5edfcf9ca 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -547,6 +547,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 ee45e196bdb5d..d1121a605dbbd 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@-1 {{incomplete type 'AnIncompleteType' used in type trait expression}} +static_assert(!__has_unique_object_representations(AnIncompleteType[][1])); +//expected-error@-1 {{incomplete type 'AnIncompleteType' used in type trait expression}} +static_assert(!__has_unique_object_representations(AnIncompleteType[1])); +//expected-error@-1 {{incomplete type 'AnIncompleteType' used in type trait expression}} +static_assert(!__has_unique_object_representations(AnIncompleteType)); +//expected-error@-1 {{incomplete type 'AnIncompleteType' used in type trait expression}} + struct NoPadding { int a; int b; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits