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.
  • [Bug c++/103108] New: compil... visual2017cpp at hotmail dot com via Gcc-bugs

Reply via email to