cxa_demangle: fix rvalue ref check
When checking if the type is a r-value ref, we would not do a complete
check. This would result in us treating a trailing parameter reference
`&)` as a r-value ref, and improperly inject the cv qualifier on the
type. We now correctly demangle the type `KFvRmE` as a constant
function rather than a constant reference.
Fixes PR31741!
git-svn-id: https://llvm.org/svn/llvm-project/libcxxabi/trunk@292973 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/src/cxa_demangle.cpp b/src/cxa_demangle.cpp
index 18a095b..8f5cb30 100644
--- a/src/cxa_demangle.cpp
+++ b/src/cxa_demangle.cpp
@@ -1927,7 +1927,8 @@
if (is_function)
{
size_t p = db.names[k].second.size();
- if (db.names[k].second[p-2] == '&')
+ if (db.names[k].second[p - 2] == '&' &&
+ db.names[k].second[p - 1] == '&')
p -= 2;
else if (db.names[k].second.back() == '&')
p -= 1;
diff --git a/test/test_demangle.pass.cpp b/test/test_demangle.pass.cpp
index b307300..4eb6a88 100644
--- a/test/test_demangle.pass.cpp
+++ b/test/test_demangle.pass.cpp
@@ -29598,9 +29598,8 @@
// mangled names can include type manglings too, which don't start with _Z:
{"i", "int"},
- // FIXME(compnerd) this should be void (int &) const
- {"PKFvRiE", "void (*)(int const&)"},
- // TODO(compnerd) pretty print this as void (*)(unsigned long&) volatile &&"
+ {"PKFvRiE", "void (*)(int&) const"},
+ // FIXME(compnerd) pretty print this as void (*)(unsigned long &) volatile &&
{"PVFvRmOE", "void (*)(unsigned long&) volatile&&"},
{"PFvRmOE", "void (*)(unsigned long&) &&"},
};