[PATCH] libstdc++: Reject user-defined specializations for coroutine_handle.
Jonathan Wakely
jwakely@redhat.com
Fri Jul 31 15:08:04 GMT 2026
On Fri, 31 Jul 2026 at 16:01, Tomasz Kamiński <tkaminsk@redhat.com> wrote:
>
> The P0912R5, "Merge Coroutines TS into C++20 working draft" that
> introduced them already included made specializing coroutine_handle
> ill-formed, no diagnostic required.
>
> This is QoI improvment, that produces diagnostic in such situation
> by decaroting base template with [[_Clang::__no_specializations]].
>
> libstdc++-v3/ChangeLog:
>
> * include/std/coroutine: Ignore -Winvalid-specialization in file.
> (std::coroutine_handle): Add clang::no_specializations attribute.
> * testsuite/18_support/coroutines/specializations_neg.cc: New test.
> ---
> Disabled warnings in whole file, piggy-backing on existing diagnostic push/pop,
> as this file does not define anything else except coroutine_handle, their
> specializations for void and __noop_promise, and hash.
>
> Testing on x86_64-linux. *coroutine* test passed with all standard
> modes, and debug. OK for trunk when all test passes.
OK
>
> *simd* is bit larger in scope, as the wording applies to all template
> defined in this header, including the helpers.
>
>
> libstdc++-v3/include/std/coroutine | 3 ++-
> .../coroutines/specializations_neg.cc | 18 ++++++++++++++++++
> 2 files changed, 20 insertions(+), 1 deletion(-)
> create mode 100644 libstdc++-v3/testsuite/18_support/coroutines/specializations_neg.cc
>
> diff --git a/libstdc++-v3/include/std/coroutine b/libstdc++-v3/include/std/coroutine
> index 7f7295d0fa5..61ca185a1a4 100644
> --- a/libstdc++-v3/include/std/coroutine
> +++ b/libstdc++-v3/include/std/coroutine
> @@ -35,6 +35,7 @@
>
> #pragma GCC diagnostic push
> #pragma GCC diagnostic ignored "-Wc++17-extensions"
> +#pragma GCC diagnostic ignored "-Winvalid-specialization"
>
> #define __glibcxx_want_coroutine
> #include <bits/version.h>
> @@ -195,7 +196,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> #endif
>
> template <typename _Promise>
> - struct coroutine_handle
> + struct _GLIBCXX_NO_SPECIALIZATIONS coroutine_handle
> {
> // [coroutine.handle.con], construct/reset
>
> diff --git a/libstdc++-v3/testsuite/18_support/coroutines/specializations_neg.cc b/libstdc++-v3/testsuite/18_support/coroutines/specializations_neg.cc
> new file mode 100644
> index 00000000000..0e7aabc6b0b
> --- /dev/null
> +++ b/libstdc++-v3/testsuite/18_support/coroutines/specializations_neg.cc
> @@ -0,0 +1,18 @@
> +// { dg-do compile { target c++20 } }
> +
> +#include <coroutine>
> +
> +struct Promise
> +{};
> +
> +template<>
> +struct std::coroutine_handle<Promise> // { dg-error "cannot be specialized" }
> +{};
> +
> +template<typename>
> +struct PromiseTempl
> +{};
> +
> +template<typename T>
> +struct std::coroutine_handle<PromiseTempl<T>> // { dg-error "cannot be specialized" }
> +{};
> --
> 2.55.0
>
More information about the Libstdc++
mailing list