[libc++] Implement LWG3990 for Clang (#128834)

This patch adds `[[_Clang::__no_specializations__]]` to `tuple`, with
warning/error suppressed for `tuple<>`.
This commit is contained in:
A. Jiang 2025-03-02 23:00:08 +08:00 committed by GitHub
parent d403f33886
commit f5f5286da3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 30 additions and 2 deletions

View File

@ -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)","|Complete|","21",""
"`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)","","",""

1 Issue # Issue Name Meeting Status First released version Notes
37 `LWG3973 <https://wg21.link/LWG3973>`__ Monadic operations should be ADL-proof 2023-11 (Kona)
38 `LWG3974 <https://wg21.link/LWG3974>`__ ``mdspan::operator[]`` should not copy ``OtherIndexTypes`` 2023-11 (Kona)
39 `LWG3987 <https://wg21.link/LWG3987>`__ Including ``<flat_foo>`` doesn't provide ``std::begin``/``end`` 2023-11 (Kona)
40 `LWG3990 <https://wg21.link/LWG3990>`__ Program-defined specializations of ``std::tuple`` and ``std::variant`` can't be properly supported 2023-11 (Kona) |Complete| 21
41 `LWG4001 <https://wg21.link/LWG4001>`__ ``iota_view`` should provide ``empty`` 2023-11 (Kona) |Complete| 19
42
43 `LWG3767 <https://wg21.link/LWG3767>`__ ``codecvt<charN_t, char8_t, mbstate_t>`` incorrectly added to locale 2024-03 (Tokyo)

View File

@ -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>

View File

@ -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