https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86687
--- Comment #7 from Richard Biener <rguenth at gcc dot gnu.org> --- (In reply to Tom de Vries from comment #5) > The foo::foo function starts at label .LFB1520, which brings us to: > ... > .uleb128 0x8b # (DIE (0x5a99) DW_TAG_subprogram) > .long 0x5a75 # DW_AT_abstract_origin > .long .LASF897 # DW_AT_linkage_name: > "foo::foo(std::__cxx11::basic_string<char, st\ > d::char_traits<char>, std::allocator<char> >)" > ... > with second parameter: > ... > .uleb128 0x59 # (DIE (0x5ac5) DW_TAG_formal_parameter) > .long 0x5a8c # DW_AT_abstract_origin > .uleb128 0x2 # DW_AT_location > .byte 0x91 # DW_OP_fbreg > .sleb128 -32 > ... > > The location expression is the generated for: > ... > (gdb) call debug_generic_expr (decl) > dir_hint > (gdb) call debug_generic_expr (decl.typed.type) > struct string & restrict > (gdb) p decl_by_reference_p (decl) > $1 = false > ... > > In contrast, the abstract origin has: > ... > (gdb) call debug_generic_expr (decl.decl_common.abstract_origin) > dir_hint > (gdb) call debug_generic_expr (decl.decl_common.abstract_origin.typed.type) > struct string & restrict > (gdb) p decl_by_reference_p (decl.decl_common.abstract_origin) > $3 = true > ... I think this is the issue - why do we have a mismatch between the origins decl_by_reference_p and decls decl_by_reference_p? Is that the in-charge vs. not-in-charge constructor clones the C++ FE generates? I think we shouldn't have abstract origins pointing to different calling-convention things.