diff options
author | John Eivind Helset <jehelset@gmail.com> | 2021-05-22 01:53:22 +0200 |
---|---|---|
committer | Iain Sandoe <iain@sandoe.co.uk> | 2021-10-03 20:50:23 +0100 |
commit | 8009c79b64b532d8a0966fe3c6d636369df6e35d (patch) | |
tree | 6167462ba683ccf452a93a9033b797a6d3822c90 /gcc | |
parent | 1b54a7226368bf86361e5c9d8ae523193037a0ac (diff) | |
download | gcc-8009c79b64b532d8a0966fe3c6d636369df6e35d.zip gcc-8009c79b64b532d8a0966fe3c6d636369df6e35d.tar.gz gcc-8009c79b64b532d8a0966fe3c6d636369df6e35d.tar.bz2 |
coroutines: Fix ICE with an invalid await_suspend type [PR100673].
The reported ICE occurs when an invalid (non-template) type is found
as the return for an await_suspend.
Fixed by amending build_co_await to ensure that await_suspend return-
type is a template-instantiation before checking to see if it is a
valid coroutine handle type.
Signed-off-by: John Eivind Helset <jehelset@gmail.com>
Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>
PR c++/100673
gcc/cp/ChangeLog:
* coroutines.cc (build_co_await): Guard against NULL
await_suspend types.
gcc/testsuite/ChangeLog:
* g++.dg/coroutines/pr100673.C: New test.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/coroutines.cc | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/coroutines/pr100673.C | 18 |
2 files changed, 20 insertions, 1 deletions
diff --git a/gcc/cp/coroutines.cc b/gcc/cp/coroutines.cc index bff5b63..1dd9abd 100644 --- a/gcc/cp/coroutines.cc +++ b/gcc/cp/coroutines.cc @@ -1053,7 +1053,8 @@ build_co_await (location_t loc, tree a, suspend_point_kind suspend_kind) else if (same_type_p (susp_return_type, boolean_type_node)) ok = true; else if (TREE_CODE (susp_return_type) == RECORD_TYPE - && CLASS_TYPE_P (susp_return_type)) + && CLASS_TYPE_P (susp_return_type) + && CLASSTYPE_TEMPLATE_INFO (susp_return_type)) { tree tt = CLASSTYPE_TI_TEMPLATE (susp_return_type); if (tt == coro_handle_templ) diff --git a/gcc/testsuite/g++.dg/coroutines/pr100673.C b/gcc/testsuite/g++.dg/coroutines/pr100673.C new file mode 100644 index 0000000..750ce66 --- /dev/null +++ b/gcc/testsuite/g++.dg/coroutines/pr100673.C @@ -0,0 +1,18 @@ +// { dg-additional-options "-fsyntax-only -w" } + +// Diagnose bad coroutine awatiable type. + +#include<coroutine> + +struct coro{ + struct not_a_template{}; + using promise_type = coro; + static constexpr std::suspend_always initial_suspend()noexcept{ return {}; } + constexpr bool await_ready()noexcept{ return false; } + constexpr not_a_template await_suspend(std::coroutine_handle<>)noexcept{ return{}; } + constexpr void await_resume()noexcept{} + static coro body() + { + co_await coro{}; // { dg-error {'await_suspend' must return 'void', 'bool' or a coroutine handle} } + } +}; |