aboutsummaryrefslogtreecommitdiff
path: root/libiberty
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2020-12-21 15:50:02 -0500
committerJason Merrill <jason@redhat.com>2020-12-21 16:39:48 -0500
commit8cd42d3cc2461df394c718afc270574a061a6ef6 (patch)
treec7e837df7877184f7453cc3cd4a82eb7ed099609 /libiberty
parent71690493322238d0fb9be776d9fceed0a7bf727e (diff)
downloadgcc-8cd42d3cc2461df394c718afc270574a061a6ef6.zip
gcc-8cd42d3cc2461df394c718afc270574a061a6ef6.tar.gz
gcc-8cd42d3cc2461df394c718afc270574a061a6ef6.tar.bz2
c++: Fix demangling of qualified-id after '.'
The demangler was assuming that only an unqualified-id could appear after . or ->. libiberty/ChangeLog: * cp-demangle.c (d_expression_1): Recognize qualified-id on RHS of dt/pt. * testsuite/demangle-expected: Add test.
Diffstat (limited to 'libiberty')
-rw-r--r--libiberty/cp-demangle.c20
-rw-r--r--libiberty/testsuite/demangle-expected3
2 files changed, 19 insertions, 4 deletions
diff --git a/libiberty/cp-demangle.c b/libiberty/cp-demangle.c
index 96f43b6..98ab47a 100644
--- a/libiberty/cp-demangle.c
+++ b/libiberty/cp-demangle.c
@@ -3476,10 +3476,22 @@ d_expression_1 (struct d_info *di)
right = d_exprlist (di, 'E');
else if (!strcmp (code, "dt") || !strcmp (code, "pt"))
{
- right = d_unqualified_name (di);
- if (d_peek_char (di) == 'I')
- right = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE,
- right, d_template_args (di));
+ peek = d_peek_char (di);
+ /* These codes start a qualified name. */
+ if ((peek == 'g' && d_peek_next_char (di) == 's')
+ || (peek == 's' && d_peek_next_char (di) == 'r'))
+ right = d_expression_1 (di);
+ else
+ {
+ /* Otherwise it's an unqualified name. We use
+ d_unqualified_name rather than d_expression_1 here for
+ old mangled names that didn't add 'on' before operator
+ names. */
+ right = d_unqualified_name (di);
+ if (d_peek_char (di) == 'I')
+ right = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE,
+ right, d_template_args (di));
+ }
}
else
right = d_expression_1 (di);
diff --git a/libiberty/testsuite/demangle-expected b/libiberty/testsuite/demangle-expected
index 6e3e671..6789d0d 100644
--- a/libiberty/testsuite/demangle-expected
+++ b/libiberty/testsuite/demangle-expected
@@ -1482,3 +1482,6 @@ void g<A>(S<&A::operator int>)
_Z1jI1AEDTcldtfp_oncvPT_EES1_
decltype (({parm#1}.(operator A*))()) j<A>(A)
+
+_Z1fI1AEDtdtfp_srT_1xES1_
+decltype ({parm#1}.A::x) f<A>(A)