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

Reply via email to