diff --git a/libcxx/docs/Status/Cxx2cIssues.csv b/libcxx/docs/Status/Cxx2cIssues.csv index ef2da4df5d06c..09aef3554fb6f 100644 --- a/libcxx/docs/Status/Cxx2cIssues.csv +++ b/libcxx/docs/Status/Cxx2cIssues.csv @@ -37,7 +37,7 @@ "`LWG3973 `__","Monadic operations should be ADL-proof","2023-11 (Kona)","","","" "`LWG3974 `__","``mdspan::operator[]`` should not copy ``OtherIndexTypes``","2023-11 (Kona)","","","" "`LWG3987 `__","Including ```` doesn't provide ``std::begin``/``end``","2023-11 (Kona)","","","" -"`LWG3990 `__","Program-defined specializations of ``std::tuple`` and ``std::variant`` can't be properly supported","2023-11 (Kona)","","","" +"`LWG3990 `__","Program-defined specializations of ``std::tuple`` and ``std::variant`` can't be properly supported","2023-11 (Kona)","|Complete|","21","" "`LWG4001 `__","``iota_view`` should provide ``empty``","2023-11 (Kona)","|Complete|","19","" "","","","","","" "`LWG3767 `__","``codecvt`` 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 _LIBCPP_TEMPLATE_VIS tuple { +class _LIBCPP_TEMPLATE_VIS _LIBCPP_NO_SPECIALIZATIONS tuple { typedef __tuple_impl::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 _TQual, template 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 + +#if !__has_warning("-Winvalid-specialization") +// expected-no-diagnostics +#else +struct S {}; + +template <> +class std::tuple; // 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 100% rename from libcxx/test/libcxx/utilities/no_specializations.verify.cpp rename to libcxx/test/libcxx/utilities/variant/no_specializations.verify.cpp