[libcxx-commits] [libcxx] [libc++] Test LWG4113: Disallow `has_unique_object_representations<Incomplete[]>` (PR #169446)

A. Jiang via libcxx-commits libcxx-commits at lists.llvm.org
Mon Nov 24 19:11:38 PST 2025


https://github.com/frederick-vs-ja created https://github.com/llvm/llvm-project/pull/169446

LWG4113 can be considered implemented in Clang 19 due to 6451806ef73bb033be3f6e1599f3bcb224943206. A follow-up change e59ed0fb0f3324ae3fce4080e15472a316713dfd simplified error messages.

Fixes #147718.

>From c5fc709cecfd6aa2be1078a8aed934943aa999c5 Mon Sep 17 00:00:00 2001
From: "A. Jiang" <de34 at live.cn>
Date: Tue, 25 Nov 2025 11:02:02 +0800
Subject: [PATCH] [libc++] Test LWG4113: Disallow
 `has_unique_object_representations<Incomplete[]>`

LWG4113 can be considered implemented in Clang 19 due to
6451806ef73bb033be3f6e1599f3bcb224943206. A follow-up change
e59ed0fb0f3324ae3fce4080e15472a316713dfd simplified error messages.
---
 libcxx/docs/Status/Cxx2cIssues.csv            |  2 +-
 ..._object_representations.compile.verify.cpp | 57 +++++++++++++++++++
 2 files changed, 58 insertions(+), 1 deletion(-)
 create mode 100644 libcxx/test/std/utilities/meta/meta.unary/meta.unary.prop/has_unique_object_representations.compile.verify.cpp

diff --git a/libcxx/docs/Status/Cxx2cIssues.csv b/libcxx/docs/Status/Cxx2cIssues.csv
index 859c49af17ec9..66fdf989be7b3 100644
--- a/libcxx/docs/Status/Cxx2cIssues.csv
+++ b/libcxx/docs/Status/Cxx2cIssues.csv
@@ -92,7 +92,7 @@
 "`LWG4085 <https://wg21.link/LWG4085>`__","``ranges::generate_random``'s helper lambda should specify the return type","2024-11 (Wrocław)","","","`#118347 <https://github.com/llvm/llvm-project/issues/118347>`__",""
 "`LWG4088 <https://wg21.link/LWG4088>`__","``println`` ignores the locale imbued in ``std::ostream``","2024-11 (Wrocław)","|Complete|","18","`#118348 <https://github.com/llvm/llvm-project/issues/118348>`__",""
 "`LWG4112 <https://wg21.link/LWG4112>`__","``has-arrow`` should required ``operator->()`` to be ``const``-qualified","2024-11 (Wrocław)","","","`#118349 <https://github.com/llvm/llvm-project/issues/118349>`__",""
-"`LWG4113 <https://wg21.link/LWG4113>`__","Disallow ``has_unique_object_representations<Incomplete[]>``","2024-11 (Wrocław)","|Complete|","","`#118350 <https://github.com/llvm/llvm-project/issues/118350>`__",""
+"`LWG4113 <https://wg21.link/LWG4113>`__","Disallow ``has_unique_object_representations<Incomplete[]>``","2024-11 (Wrocław)","|Complete|","19","`#118350 <https://github.com/llvm/llvm-project/issues/118350>`__",""
 "`LWG4119 <https://wg21.link/LWG4119>`__","``generator::promise_type::yield_value(ranges::elements_of<R, Alloc>)``'s nested ``generator`` may be ill-formed","2024-11 (Wrocław)","","","`#118351 <https://github.com/llvm/llvm-project/issues/118351>`__",""
 "`LWG4124 <https://wg21.link/LWG4124>`__","Cannot format ``zoned_time`` with resolution coarser than ``seconds``","2024-11 (Wrocław)","","","`#118352 <https://github.com/llvm/llvm-project/issues/118352>`__",""
 "`LWG4126 <https://wg21.link/LWG4126>`__","Some feature-test macros for fully freestanding features are not yet marked freestanding","2024-11 (Wrocław)","","","`#118353 <https://github.com/llvm/llvm-project/issues/118353>`__",""
diff --git a/libcxx/test/std/utilities/meta/meta.unary/meta.unary.prop/has_unique_object_representations.compile.verify.cpp b/libcxx/test/std/utilities/meta/meta.unary/meta.unary.prop/has_unique_object_representations.compile.verify.cpp
new file mode 100644
index 0000000000000..7c6e2f630c364
--- /dev/null
+++ b/libcxx/test/std/utilities/meta/meta.unary/meta.unary.prop/has_unique_object_representations.compile.verify.cpp
@@ -0,0 +1,57 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// REQUIRES: std-at-least-c++17
+
+// <type_traits>
+
+// has_unique_object_representations
+
+// Verify that has_unique_object_representations(_v) rejects incomplete class and enumeration types and arrays thereof.
+
+#include <type_traits>
+
+class IC;
+
+constexpr bool v1 = std::has_unique_object_representations<IC>::value;
+// expected-error at -1 {{incomplete type 'IC' used in type trait expression}}
+constexpr bool v2 = std::has_unique_object_representations<IC[]>::value;
+// expected-error at -1 {{incomplete type 'IC' used in type trait expression}}
+constexpr bool v3 = std::has_unique_object_representations<IC[1]>::value;
+// expected-error at -1 {{incomplete type 'IC' used in type trait expression}}
+constexpr bool v4 = std::has_unique_object_representations<IC[][1]>::value;
+// expected-error at -1 {{incomplete type 'IC' used in type trait expression}}
+
+constexpr bool v5 = std::has_unique_object_representations_v<IC>;
+// expected-error at -1 {{incomplete type 'IC' used in type trait expression}}
+constexpr bool v6 = std::has_unique_object_representations_v<IC[]>;
+// expected-error at -1 {{incomplete type 'IC' used in type trait expression}}
+constexpr bool v7 = std::has_unique_object_representations_v<IC[1]>;
+// expected-error at -1 {{incomplete type 'IC' used in type trait expression}}
+constexpr bool v8 = std::has_unique_object_representations_v<IC[][1]>;
+// expected-error at -1 {{incomplete type 'IC' used in type trait expression}}
+
+enum E {
+  v9 = std::has_unique_object_representations<E>::value,
+  // expected-error at -1 {{incomplete type 'E' used in type trait expression}}
+  v10 = std::has_unique_object_representations<E[]>::value,
+  // expected-error at -1 {{incomplete type 'E' used in type trait expression}}
+  v11 = std::has_unique_object_representations<E[1]>::value,
+  // expected-error at -1 {{incomplete type 'E' used in type trait expression}}
+  v12 = std::has_unique_object_representations<E[][1]>::value,
+  // expected-error at -1 {{incomplete type 'E' used in type trait expression}}
+
+  v13 = std::has_unique_object_representations_v<E>,
+  // expected-error at -1 {{incomplete type 'E' used in type trait expression}}
+  v14 = std::has_unique_object_representations_v<E[]>,
+  // expected-error at -1 {{incomplete type 'E' used in type trait expression}}
+  v15 = std::has_unique_object_representations_v<E[1]>,
+  // expected-error at -1 {{incomplete type 'E' used in type trait expression}}
+  v16 = std::has_unique_object_representations_v<E[][1]>,
+  // expected-error at -1 {{incomplete type 'E' used in type trait expression}}
+};



More information about the libcxx-commits mailing list