Bug 98935 - [coroutines] co_await on statement expressions causes ICE
Summary: [coroutines] co_await on statement expressions causes ICE
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 11.0
: P3 normal
Target Milestone: 11.3
Assignee: Not yet assigned to anyone
URL:
Keywords: C++-coroutines, stmt-expr
Depends on:
Blocks:
 
Reported: 2021-02-02 15:47 UTC by Taiju Tsuiki
Modified: 2024-02-01 21:07 UTC (History)
6 users (show)

See Also:
Host:
Target:
Build:
Known to work: 11.3.0
Known to fail: 10.5.0, 11.2.0
Last reconfirmed: 2021-10-01 00:00:00


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Taiju Tsuiki 2021-02-02 15:47:16 UTC
In a repro case below, `co_await ({auto x = future{}; x;});` causes an internal compiler error.
https://wandbox.org/permlink/3jX83p34mVDfBgc1

The compile command was:
$ g++ -std=c++20 failcase.cc
where g++ was the current trunk (11.0.0).
---- failcase.cc
#if __has_include(<coroutine>)
#include <coroutine>
#elif __has_include(<experimental/coroutine>)
#include <experimental/coroutine>
namespace std {
using namespace std::experimental;
}
#endif

struct future {
  struct promise_type {
    void return_void() {}
    std::suspend_always initial_suspend() noexcept { return {}; }
    std::suspend_always final_suspend() noexcept { return {}; }
    void unhandled_exception() {}
    future get_return_object() { return {}; }
  };
  bool await_ready() { return false; }
  void await_suspend(std::coroutine_handle<>) {}
  void await_resume() {}
};

future failcase() {
  co_await ({auto x = future{}; x;});
}
----

And its backtrace was:
----
prog.cc: In function 'future failcase()':
prog.cc:25:1: internal compiler error: Segmentation fault
   25 | }
      | ^
0xca67ef crash_signal
	../../source/gcc/toplev.c:327
0xf1866b walk_tree_1(tree_node**, tree_node* (*)(tree_node**, int*, void*), void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*, tree_node* (*)(tree_node**, int*, tree_node* (*)(tree_node**, int*, void*), void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*))
	../../source/gcc/tree.c:12105
0xf18c82 walk_tree_1(tree_node**, tree_node* (*)(tree_node**, int*, void*), void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*, tree_node* (*)(tree_node**, int*, tree_node* (*)(tree_node**, int*, void*), void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*))
	../../source/gcc/tree.c:12340
0xf18ad1 walk_tree_1(tree_node**, tree_node* (*)(tree_node**, int*, void*), void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*, tree_node* (*)(tree_node**, int*, tree_node* (*)(tree_node**, int*, void*), void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*))
	../../source/gcc/tree.c:12204
0x680293 transform_local_var_uses
	../../source/gcc/cp/coroutines.cc:1903
0xf1865b walk_tree_1(tree_node**, tree_node* (*)(tree_node**, int*, void*), void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*, tree_node* (*)(tree_node**, int*, tree_node* (*)(tree_node**, int*, void*), void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*))
	../../source/gcc/tree.c:12099
0x680293 transform_local_var_uses
	../../source/gcc/cp/coroutines.cc:1903
0xf1865b walk_tree_1(tree_node**, tree_node* (*)(tree_node**, int*, void*), void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*, tree_node* (*)(tree_node**, int*, tree_node* (*)(tree_node**, int*, void*), void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*))
	../../source/gcc/tree.c:12099
0xf18ad1 walk_tree_1(tree_node**, tree_node* (*)(tree_node**, int*, void*), void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*, tree_node* (*)(tree_node**, int*, tree_node* (*)(tree_node**, int*, void*), void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*))
	../../source/gcc/tree.c:12204
0xf187aa walk_tree_1(tree_node**, tree_node* (*)(tree_node**, int*, void*), void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*, tree_node* (*)(tree_node**, int*, tree_node* (*)(tree_node**, int*, void*), void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*))
	../../source/gcc/tree.c:12436
0xf18ad1 walk_tree_1(tree_node**, tree_node* (*)(tree_node**, int*, void*), void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*, tree_node* (*)(tree_node**, int*, tree_node* (*)(tree_node**, int*, void*), void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*))
	../../source/gcc/tree.c:12204
0x680293 transform_local_var_uses
	../../source/gcc/cp/coroutines.cc:1903
0xf1865b walk_tree_1(tree_node**, tree_node* (*)(tree_node**, int*, void*), void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*, tree_node* (*)(tree_node**, int*, tree_node* (*)(tree_node**, int*, void*), void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*))
	../../source/gcc/tree.c:12099
0x680a27 build_actor_fn
	../../source/gcc/cp/coroutines.cc:2085
0x6832a5 morph_fn_to_coro(tree_node*, tree_node**, tree_node**)
	../../source/gcc/cp/coroutines.cc:4750
0x6b4f87 finish_function(bool)
	../../source/gcc/cp/decl.c:17155
0x76da42 cp_parser_function_definition_after_declarator
	../../source/gcc/cp/parser.c:29941
0x76eb9c cp_parser_function_definition_from_specifiers_and_declarator
	../../source/gcc/cp/parser.c:29854
0x76eb9c cp_parser_init_declarator
	../../source/gcc/cp/parser.c:21564
0x74d5b4 cp_parser_simple_declaration
	../../source/gcc/cp/parser.c:14381
Please submit a full bug report,
with preprocessed source if appropriate.
Please include the complete backtrace with any bug report.
See <https://gcc.gnu.org/bugs/> for instructions.
Comment 1 Yves Delley 2021-09-27 21:09:35 UTC
The provided fail-case seems to compile fine on godbolt.org 10.2, but started to ICE with 10.3, as well as 11.1 and 11.2.
Comment 2 Iain Sandoe 2021-10-01 19:54:58 UTC
statement expressions have never been handled explicitly (deferred since they are an extension) .. however, it is planned to support them,
Comment 3 Jakub Jelinek 2022-06-28 10:43:23 UTC
GCC 10.4 is being released, retargeting bugs to GCC 10.5.
Comment 4 Richard Biener 2023-07-07 09:24:28 UTC
Fixed in GCC 11.3.
Comment 5 Roman Lozko 2024-02-01 21:07:01 UTC
Broken in trunk
internal compiler error: in register_local_var_uses, at cp/coroutines.cc:3903
https://godbolt.org/z/j9KTsroxj