https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85363
--- Comment #5 from Marek Polacek <mpolacek at gcc dot gnu.org> --- In C++11, .eh optimizes out the catch, so the exception is never caught. That is because lower_catch doesn't think that the region may throw (eh_region_may_contain_throw). After further poking it seems the cause is that P::P () is marked as TREE_NOTHROW, which seems incorrect, because it calls X::X() which calls init() with throw. That TREE_NOTHROW is set in finish_function: /* If this function can't throw any exceptions, remember that. */ if (!processing_template_decl && !cp_function_chain->can_throw && !flag_non_call_exceptions && !decl_replaceable_p (fndecl)) TREE_NOTHROW (fndecl) = 1;