diff options
author | Saleem Abdulrasool <compnerd@compnerd.org> | 2017-01-24 18:42:56 +0000 |
---|---|---|
committer | Saleem Abdulrasool <compnerd@compnerd.org> | 2017-01-24 18:42:56 +0000 |
commit | b31402407404e987cf39b833005f6a63a95f1744 (patch) | |
tree | 19fa6ae851a07970e4e874158e894e49d907233d | |
parent | 279d648944d5d8f04ccab7f9670d338630923adb (diff) | |
download | libcxxabi-b31402407404e987cf39b833005f6a63a95f1744.tar.gz |
cxa_demangle: avoid butchering the last parameter type
Fix an off-by-one case which would destroy the final parameter in a
CV-qualified function type with a reference. We still get the CV
qualification incorrect, but at least we do not clobber the type name
any longer.
Partially fixes PR31741.
git-svn-id: https://llvm.org/svn/llvm-project/libcxxabi/trunk@292963 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | src/cxa_demangle.cpp | 4 | ||||
-rw-r--r-- | test/test_demangle.pass.cpp | 6 |
2 files changed, 8 insertions, 2 deletions
diff --git a/src/cxa_demangle.cpp b/src/cxa_demangle.cpp index 402ee0c..18a095b 100644 --- a/src/cxa_demangle.cpp +++ b/src/cxa_demangle.cpp @@ -1928,9 +1928,9 @@ parse_type(const char* first, const char* last, C& db) { size_t p = db.names[k].second.size(); if (db.names[k].second[p-2] == '&') - p -= 3; - else if (db.names[k].second.back() == '&') p -= 2; + else if (db.names[k].second.back() == '&') + p -= 1; if (cv & 1) { db.names[k].second.insert(p, " const"); diff --git a/test/test_demangle.pass.cpp b/test/test_demangle.pass.cpp index effe5c0..b307300 100644 --- a/test/test_demangle.pass.cpp +++ b/test/test_demangle.pass.cpp @@ -29597,6 +29597,12 @@ 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 &&" + {"PVFvRmOE", "void (*)(unsigned long&) volatile&&"}, + {"PFvRmOE", "void (*)(unsigned long&) &&"}, }; const unsigned N = sizeof(cases) / sizeof(cases[0]); |