aboutsummaryrefslogtreecommitdiff
path: root/libiberty
diff options
context:
space:
mode:
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2015-08-15 13:23:30 +0000
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2015-08-15 13:23:30 +0000
commit4ff52b561f011bd0d73b108cfb77f5191ad6b792 (patch)
tree765da68c0ebf64403ce8807bb37bdaf5736ee295 /libiberty
parentb874b7388887309fbdb60e9876c13ac746710017 (diff)
* cp-demangle.c (d_abi_tags): Preserve di->last_name across any
ABI tags. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@226910 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libiberty')
-rw-r--r--libiberty/ChangeLog5
-rw-r--r--libiberty/cp-demangle.c8
-rw-r--r--libiberty/testsuite/demangle-expected6
3 files changed, 19 insertions, 0 deletions
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 <iant@google.com>
+
+ * cp-demangle.c (d_abi_tags): Preserve di->last_name across any
+ ABI tags.
+
2015-08-11 Iain Buclaw <ibuclaw@gdcproject.org>
* 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<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