https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97060
--- Comment #8 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Unfortunately the patch doesn't really bootstrap. Small testcase that ICEs: struct S { virtual ~S (); } s; This is on the external S::~S() declaration, which has non-NULL decl_ultimate_origin (the abstract destructor from which the concrete ones are inherited), but with the above patch we want to emit it as declaration and run into: /* A concrete instance, tag a new DIE with DW_AT_abstract_origin. */ if (origin != NULL) { gcc_assert (!declaration || local_scope_p (context_die)); So, one way around would be to only clear current_function_decl for functions with decl_ultimate_origin (decl) == NULL. But then we wouldn't emit DW_AT_declaration in this case (ok, one needs -fno-eliminate-unused-debug-symbols to actually see it in the assembly). On the other side, having a DW_TAG_subprogram with both DW_AT_specification and DW_AT_declaration looks invalid to me.