summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSaleem Abdulrasool <compnerd@compnerd.org>2017-01-24 18:42:56 +0000
committerSaleem Abdulrasool <compnerd@compnerd.org>2017-01-24 18:42:56 +0000
commitb31402407404e987cf39b833005f6a63a95f1744 (patch)
tree19fa6ae851a07970e4e874158e894e49d907233d
parent279d648944d5d8f04ccab7f9670d338630923adb (diff)
downloadlibcxxabi-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.cpp4
-rw-r--r--test/test_demangle.pass.cpp6
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]);