https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103108
Bug ID: 103108 Summary: compiler ICE for lambda coroutines that captures this when optimization is used Product: gcc Version: 11.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: visual2017cpp at hotmail dot com Target Milestone: --- I encountered this ICE now for the code given below code and error on godbolt : https://godbolt.org/z/x55xn18va it only happens with optimization enabled starting from -O1 to -O3 code: ``` #include <coroutine> #include <exception> struct simple_task { struct promise_type { public: simple_task get_return_object() { return {}; } constexpr std::suspend_never initial_suspend() noexcept { return {}; } constexpr std::suspend_never final_suspend() noexcept { return {}; } void unhandled_exception() noexcept { std::terminate(); } constexpr void return_void() const noexcept {} }; }; // in debug builds it is a checked pointer template<class T> class pointer_wrapper { public: constexpr pointer_wrapper() noexcept = default; constexpr pointer_wrapper(T* p) noexcept : p{ p } {} constexpr T* operator->() const noexcept { return p; } constexpr T& operator*() const noexcept { return *p; } constexpr bool operator==(std::nullptr_t) const noexcept { return p == nullptr; } constexpr bool operator==(const pointer_wrapper& other) const noexcept { return p == other.p; } constexpr operator bool() const noexcept { return p != nullptr; } operator pointer_wrapper<const T>() const noexcept { return pointer_wrapper<const T>{ p }; } private: T* p = nullptr; }; struct some_struct { int i = 0; pointer_wrapper<some_struct> other; void do_ice() { auto ice_fn = [this]() -> simple_task { other->i = 1; co_return; }; } }; ``` error message: In function ‘void some_struct::do_ice()::<lambda()>::_ZZN11some_struct6do_iceEvENKUlvE_clEv.actor(some_struct::do_ice()::<lambda()>::_ZZN11some_struct6do_iceEvENKUlvE_clEv.frame*)’: ice.cpp:60:82: internal compiler error: in is_this_parameter, at cp/semantics.c:10683 60 | auto ice_fn = [this]() -> simple_task { other->i = 1; co_return; }; | ^ 0x1702697 internal_error(char const*, ...) ???:0 0x64082b fancy_abort(char const*, int, char const*) ???:0 0x67ce76 is_nondependent_constant_expression(tree_node*) ???:0 0x67d6cf maybe_constant_value(tree_node*, tree_node*, bool) ???:0 0x69c27c cp_fold_maybe_rvalue(tree_node*, bool) ???:0 0xf32953 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*> >*)) ???:0 0xf32b30 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*> >*)) ???:0 0xf32b30 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*> >*)) ???:0 0xf32eaf 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*> >*)) ???:0 0xf32eaf 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*> >*)) ???:0 0xf32b30 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*> >*)) ???:0 0xf32eaf 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*> >*)) ???:0 0xf32eaf 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*> >*)) ???:0 0x697df0 cp_fold_function(tree_node*) ???:0 0x6c4740 finish_function(bool) ???:0 0x6ec766 finish_lambda_function(tree_node*) ???:0 0x7888ee c_parse_file() ???:0 0x85988d c_common_parse_file() ???:0 Please submit a full bug report, with preprocessed source if appropriate. Please include the complete backtrace with any bug report. See <file:///usr/share/doc/gcc-11/README.Bugs> for instructions.