I was unable to create an account in the gcc bugzilla, so I am trying to report this here. The following code should always exit with "5". Starting in g++ 12.1, it will exit with "5" at "-O0" and with random garbage at "-O1" or "-O2". https://godbolt.org/z/T3qTnheYW struct Int { int value; }; __attribute__((noipa)) Int always_throws() { throw 123; } void foo(Int &x) { try { x = always_throws(); } catch (...) { } } int main() { Int x; x.value = 5; foo(x); return x.value; }