https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120243

--- Comment #6 from Iain Sandoe <iains at gcc dot gnu.org> ---
a slightly modified testcase (without the lambda, so the dumps are easier to
read)

#include <coroutine>

struct coro {
     struct promise_type {
        promise_type() = default;

        std::suspend_never initial_suspend() const noexcept {
          __builtin_printf("initial_suspend\n");
          return {};
        }
        std::suspend_never final_suspend() const noexcept { return {}; }

        void unhandled_exception() { 
          __builtin_printf("unhandled_exception\n");
          throw;
        }

        coro get_return_object() { return {}; }
        void return_void() {}

    };
};

coro
test ()
{
  __builtin_printf("test\n");
  throw "hello";
  __builtin_abort();
  co_return;
}

int main() {
   coro C;
    try {
       C = test ();
    }
    catch(...) {
        __builtin_printf("Caught!\n");
    }
}

=======

This fails for O2 and passes for O1
The first difference in the dumps is in fixup_cfg3 and the difference is that
the actor function gets inlined into the ramp.

-fnoinline restores function.  

GCC-14 does not seem to inline the same case.

.. next to figure out how the inlining is breaking the EH.

Reply via email to