[libcxx-commits] [libcxx] [libc++] Implement LWG3990 for Clang (PR #128834)

A. Jiang via libcxx-commits libcxx-commits at lists.llvm.org
Tue Feb 25 22:54:53 PST 2025


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

This patch adds `[[_Clang::__no_specializations__]]` to `tuple`, with warning/error suppressed for `tuple<>`.

Towards #105310.

>From 9cf137ff64fb68e6dc0364e38130ee55c82f81af Mon Sep 17 00:00:00 2001
From: "A. Jiang" <de34 at live.cn>
Date: Wed, 26 Feb 2025 14:52:47 +0800
Subject: [PATCH] [libc++] Implement LWG3990 for Clang

This patch adds `[[_Clang::__no_specializations__]]` to `tuple`, with
warning/error suppressed for `tuple<>`.
---
 libcxx/docs/Status/Cxx2cIssues.csv            |  2 +-
 libcxx/include/tuple                          |  7 +++++-
 .../tuple/no_specializations.verify.cpp       | 23 +++++++++++++++++++
 .../no_specializations.verify.cpp             |  2 +-
 4 files changed, 31 insertions(+), 3 deletions(-)
 create mode 100644 libcxx/test/libcxx/utilities/tuple/no_specializations.verify.cpp
 rename libcxx/test/libcxx/utilities/{ => variant}/no_specializations.verify.cpp (94%)

diff --git a/libcxx/docs/Status/Cxx2cIssues.csv b/libcxx/docs/Status/Cxx2cIssues.csv
index 1ec23dfabd5ea..3ef7203731d83 100644
--- a/libcxx/docs/Status/Cxx2cIssues.csv
+++ b/libcxx/docs/Status/Cxx2cIssues.csv
@@ -37,7 +37,7 @@
 "`LWG3973 <https://wg21.link/LWG3973>`__","Monadic operations should be ADL-proof","2023-11 (Kona)","","",""
 "`LWG3974 <https://wg21.link/LWG3974>`__","``mdspan::operator[]`` should not copy ``OtherIndexTypes``","2023-11 (Kona)","","",""
 "`LWG3987 <https://wg21.link/LWG3987>`__","Including ``<flat_foo>`` doesn't provide ``std::begin``/``end``","2023-11 (Kona)","","",""
-"`LWG3990 <https://wg21.link/LWG3990>`__","Program-defined specializations of ``std::tuple`` and ``std::variant`` can't be properly supported","2023-11 (Kona)","","",""
+"`LWG3990 <https://wg21.link/LWG3990>`__","Program-defined specializations of ``std::tuple`` and ``std::variant`` can't be properly supported","2023-11 (Kona)","|Partial|","21","Implemented for Clang only."
 "`LWG4001 <https://wg21.link/LWG4001>`__","``iota_view`` should provide ``empty``","2023-11 (Kona)","|Complete|","19",""
 "","","","","",""
 "`LWG3767 <https://wg21.link/LWG3767>`__","``codecvt<charN_t, char8_t, mbstate_t>`` incorrectly added to locale","2024-03 (Tokyo)","","",""
diff --git a/libcxx/include/tuple b/libcxx/include/tuple
index 5d968bfd4015a..1e0703421da01 100644
--- a/libcxx/include/tuple
+++ b/libcxx/include/tuple
@@ -535,7 +535,7 @@ __memberwise_forward_assign(_Dest& __dest, _Source&& __source, __tuple_types<_Up
 }
 
 template <class... _Tp>
-class _LIBCPP_TEMPLATE_VIS tuple {
+class _LIBCPP_TEMPLATE_VIS _LIBCPP_NO_SPECIALIZATIONS tuple {
   typedef __tuple_impl<typename __make_tuple_indices<sizeof...(_Tp)>::type, _Tp...> _BaseT;
 
   _BaseT __base_;
@@ -1005,6 +1005,10 @@ public:
 #    endif // _LIBCPP_STD_VER >= 23
 };
 
+_LIBCPP_DIAGNOSTIC_PUSH
+#    if __has_warning("-Winvalid-specialization")
+_LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Winvalid-specialization")
+#    endif
 template <>
 class _LIBCPP_TEMPLATE_VIS tuple<> {
 public:
@@ -1022,6 +1026,7 @@ public:
   _LIBCPP_HIDE_FROM_ABI constexpr void swap(const tuple&) const noexcept {}
 #    endif
 };
+_LIBCPP_DIAGNOSTIC_POP
 
 #    if _LIBCPP_STD_VER >= 23
 template <class... _TTypes, class... _UTypes, template <class> class _TQual, template <class> class _UQual>
diff --git a/libcxx/test/libcxx/utilities/tuple/no_specializations.verify.cpp b/libcxx/test/libcxx/utilities/tuple/no_specializations.verify.cpp
new file mode 100644
index 0000000000000..783bd814a51e1
--- /dev/null
+++ b/libcxx/test/libcxx/utilities/tuple/no_specializations.verify.cpp
@@ -0,0 +1,23 @@
+//===----------------------------------------------------------------------===//
+//
+// 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++11
+
+// Check that user-specializations are diagnosed
+// See [tuple.tuple.general]/1
+
+#include <tuple>
+
+#if !__has_warning("-Winvalid-specialization")
+// expected-no-diagnostics
+#else
+struct S {};
+
+template <>
+class std::tuple<S>; // expected-error {{cannot be specialized}}
+#endif
diff --git a/libcxx/test/libcxx/utilities/no_specializations.verify.cpp b/libcxx/test/libcxx/utilities/variant/no_specializations.verify.cpp
similarity index 94%
rename from libcxx/test/libcxx/utilities/no_specializations.verify.cpp
rename to libcxx/test/libcxx/utilities/variant/no_specializations.verify.cpp
index d4743f4fd3f90..fb3b5dd63afad 100644
--- a/libcxx/test/libcxx/utilities/no_specializations.verify.cpp
+++ b/libcxx/test/libcxx/utilities/variant/no_specializations.verify.cpp
@@ -6,7 +6,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-// UNSUPPORTED: c++03, c++11, c++14
+// REQUIRES: std-at-least-c++17
 
 // Check that user-specializations are diagnosed
 // See [variant.variant.general]/4



More information about the libcxx-commits mailing list