[PATCH] libstdc++: Reject user-defined specializations for coroutine_handle.
Tomasz Kamiński
tkaminsk@redhat.com
Fri Jul 31 15:00:55 GMT 2026
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.
*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