From 68bac640632323b1ae7b4f6098705fccb932e6ce Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Sat, 15 Aug 2015 13:23:30 +0000 Subject: [PATCH] cp-demangle.c (d_abi_tags): Preserve di->last_name across any ABI tags. * cp-demangle.c (d_abi_tags): Preserve di->last_name across any ABI tags. From-SVN: r226910 --- libiberty/ChangeLog | 5 +++++ libiberty/cp-demangle.c | 8 ++++++++ libiberty/testsuite/demangle-expected | 6 ++++++ 3 files changed, 19 insertions(+) diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog index d1c632460e5..8fdf6d2d83c 100644 --- a/libiberty/ChangeLog +++ b/libiberty/ChangeLog @@ -1,3 +1,8 @@ +2015-08-15 Ian Lance Taylor + + * cp-demangle.c (d_abi_tags): Preserve di->last_name across any + ABI tags. + 2015-08-11 Iain Buclaw * d-demangle.c (dlang_parse_real): Remove call to strtod. diff --git a/libiberty/cp-demangle.c b/libiberty/cp-demangle.c index 82541004bf7..c587895086d 100644 --- a/libiberty/cp-demangle.c +++ b/libiberty/cp-demangle.c @@ -1306,7 +1306,12 @@ d_encoding (struct d_info *di, int top_level) 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 demangle_component *dc) tag = d_source_name (di); dc = d_make_comp (di, DEMANGLE_COMPONENT_TAGGED_NAME, dc, tag); } + + di->last_name = hold_last_name; + return dc; } diff --git a/libiberty/testsuite/demangle-expected b/libiberty/testsuite/demangle-expected index 4c6359e6fa8..5200cb34d19 100644 --- a/libiberty/testsuite/demangle-expected +++ b/libiberty/testsuite/demangle-expected @@ -4389,3 +4389,9 @@ f(std::string[abi:foo], std::string[abi:foo]) --format=gnu-v3 _Z18IndirectExternCallIPU7stdcallU7regparmILi3EEFviiEiEvT_T0_S3_ void IndirectExternCall 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