In the ABI's two-phase EH model, first we walk the stack looking for a
handler, then we walk the stack running cleanups until we reach that
handler. In the cleanup phase, we shouldn't redundantly check the handlers
along the way, e.g. when walking through g():
void f() { throw 42; }
void g() { try { f(); } catch (void *) { } }
int main() { try { g(); } catch (int) { } }
libstdc++-v3/ChangeLog:
* libsupc++/eh_personality.cc (PERSONALITY_FUNCTION): Don't check
handlers in the cleanup phase.
// Zero filter values are cleanups.
saw_cleanup = true;
}
+ else if (actions == _UA_CLEANUP_PHASE)
+ // We checked the handlers in the search phase; if one of them
+ // matched, actions would also have _UA_HANDLER_FRAME set.
+ ;
else if (ar_filter > 0)
{
// Positive filter values are handlers.