The symbol _ZNSt8ios_base7failureB5cxx11C1EPKcRKSt10error_code, which appears in libstdc++, was being demangled as
std::ios_base::failure[abi:cxx11]::cxx11(char const*, std::error_code const&) That is clearly incorrect: std::ios_base::failure does not have a method cxx11, and anyhow if you look closely at the mangled name you will see that it is supposed to be a constructor. This patch fixes the demangler to generate the correct demangling, namely std::ios_base::failure[abi:cxx11]::failure(char const*, std::error_code const&) Bootstrapped and ran libiberty and libstdc++-v3 tests on x86_64-unknown-linux-gnu. Committed to mainline. Ian 2015-08-15 Ian Lance Taylor <i...@google.com> * cp-demangle.c (d_abi_tags): Preserve di->last_name across any ABI tags.
Index: cp-demangle.c =================================================================== --- cp-demangle.c (revision 226846) +++ cp-demangle.c (working copy) @@ -1306,7 +1306,12 @@ d_encoding (struct d_info *di, int top_l static struct demangle_component * d_abi_tags (struct d_info *di, struct demangle_component *dc) { + struct demangle_component *hold_last_name; char peek; + + /* Preserve the last name, so the ABI tag doesn't clobber it. */ + hold_last_name = di->last_name; + while (peek = d_peek_char (di), peek == 'B') { @@ -1315,6 +1320,9 @@ d_abi_tags (struct d_info *di, struct de tag = d_source_name (di); dc = d_make_comp (di, DEMANGLE_COMPONENT_TAGGED_NAME, dc, tag); } + + di->last_name = hold_last_name; + return dc; } Index: testsuite/demangle-expected =================================================================== --- testsuite/demangle-expected (revision 226846) +++ testsuite/demangle-expected (working copy) @@ -4389,3 +4389,9 @@ f(std::string[abi:foo], std::string[abi: --format=gnu-v3 _Z18IndirectExternCallIPU7stdcallU7regparmILi3EEFviiEiEvT_T0_S3_ void IndirectExternCall<void ( regparm<3> stdcall*)(int, int), int>(void ( regparm<3> stdcall*)(int, int), int, void ( regparm<3> stdcall*)(int, int)) +# +# ABI tags used to confuse the constructor name calculation. +--format=gnu-v3 --no-params +_ZNSt8ios_base7failureB5cxx11C1EPKcRKSt10error_code +std::ios_base::failure[abi:cxx11]::failure(char const*, std::error_code const&) +std::ios_base::failure[abi:cxx11]::failure