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!

llvm-svn: 292973
This commit is contained in:
Saleem Abdulrasool 2017-01-24 19:57:05 +00:00
parent 65cb42c1ce
commit f5d26bb142
2 changed files with 4 additions and 4 deletions

View File

@ -1927,7 +1927,8 @@ parse_type(const char* first, const char* last, C& db)
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;

View File

@ -29598,9 +29598,8 @@ const char* cases[][2] =
// 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&) &&"},
};