diff options
author | Jason Merrill <jason@redhat.com> | 2020-12-21 15:50:02 -0500 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2020-12-21 16:39:48 -0500 |
commit | 8cd42d3cc2461df394c718afc270574a061a6ef6 (patch) | |
tree | c7e837df7877184f7453cc3cd4a82eb7ed099609 /libiberty | |
parent | 71690493322238d0fb9be776d9fceed0a7bf727e (diff) | |
download | gcc-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.c | 20 | ||||
-rw-r--r-- | libiberty/testsuite/demangle-expected | 3 |
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) |