PR 48665 points out that qualified function types are not correctly demangled. These types can only appear as template parameters. This patch fixes the problem. Bootstrapped and ran C++ testsuite on x86_64-unknown-linux-gnu. Committed to mainline.
Ian 2011-10-10 Ian Lance Taylor <i...@google.com> PR c++/48665 * cp-demangle.c (d_cv_qualifiers): If qualifiers are applied to a function type, change them to apply to the "this" parameter. * testsuite/demangle-expected: Add test case.
Index: testsuite/demangle-expected =================================================================== --- testsuite/demangle-expected (revision 179771) +++ testsuite/demangle-expected (working copy) @@ -4198,3 +4198,8 @@ f1<int> _Z3fooi._omp_cpyfn.6 foo(int) [clone ._omp_cpyfn.6] foo +# +--format=gnu-v3 --no-params +_Z1fIKFvvES0_Evv +void f<void () const, void ()>() +f<void () const, void ()> Index: cp-demangle.c =================================================================== --- cp-demangle.c (revision 179771) +++ cp-demangle.c (working copy) @@ -2294,8 +2294,10 @@ static struct demangle_component ** d_cv_qualifiers (struct d_info *di, struct demangle_component **pret, int member_fn) { + struct demangle_component **pstart; char peek; + pstart = pret; peek = d_peek_char (di); while (peek == 'r' || peek == 'V' || peek == 'K') { @@ -2332,6 +2334,28 @@ d_cv_qualifiers (struct d_info *di, peek = d_peek_char (di); } + if (!member_fn && peek == 'F') + { + while (pstart != pret) + { + switch ((*pstart)->type) + { + case DEMANGLE_COMPONENT_RESTRICT: + (*pstart)->type = DEMANGLE_COMPONENT_RESTRICT_THIS; + break; + case DEMANGLE_COMPONENT_VOLATILE: + (*pstart)->type = DEMANGLE_COMPONENT_VOLATILE_THIS; + break; + case DEMANGLE_COMPONENT_CONST: + (*pstart)->type = DEMANGLE_COMPONENT_CONST_THIS; + break; + default: + break; + } + pstart = &d_left (*pstart); + } + } + return pret; }