[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:13:29 PST 2025
https://github.com/frederick-vs-ja updated https://github.com/llvm/llvm-project/pull/169446
>From 2fabc5b6ea385c63ca0309f6d3f576a594f87730 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 +-
...s_unique_object_representations.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.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.verify.cpp b/libcxx/test/std/utilities/meta/meta.unary/meta.unary.prop/has_unique_object_representations.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.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