summaryrefslogtreecommitdiff
path: root/lib/Demangle
diff options
context:
space:
mode:
authorSaleem Abdulrasool <compnerd@compnerd.org>2017-01-24 20:04:58 +0000
committerSaleem Abdulrasool <compnerd@compnerd.org>2017-01-24 20:04:58 +0000
commit815bff1cc4972406ec525202555e3c5c0812e3bd (patch)
treed799dde9cc3fff01b1caef5eb9cab99db37e0cd8 /lib/Demangle
parented1b025f1b2d8ea4a5b2023a2dfbde85c020e050 (diff)
Demangle: correct demangling for CV-qualified functions
When demangling a CV-qualified function type with a final reference type parameter, we would treat the reference type parameter as a r-value ref accidentally. This would result in the improper decoration of the function type itself. Resolves PR31741! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@292976 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Demangle')
-rw-r--r--lib/Demangle/ItaniumDemangle.cpp15
1 files changed, 9 insertions, 6 deletions
diff --git a/lib/Demangle/ItaniumDemangle.cpp b/lib/Demangle/ItaniumDemangle.cpp
index 9f808d6cb6d..59f6c2d3612 100644
--- a/lib/Demangle/ItaniumDemangle.cpp
+++ b/lib/Demangle/ItaniumDemangle.cpp
@@ -1669,21 +1669,24 @@ static const char *parse_type(const char *first, const char *last, C &db) {
db.subs.emplace_back();
for (size_t k = k0; k < k1; ++k) {
if (is_function) {
- size_t p = db.names[k].second.size();
- if (db.names[k].second[p - 2] == '&')
+ auto &name = db.names[k].second;
+ size_t p = name.size();
+
+ if (name[p - 2] == '&' && name[p - 1] == '&')
p -= 2;
- else if (db.names[k].second.back() == '&')
+ else if (name.back() == '&')
p -= 1;
+
if (cv & CV_const) {
- db.names[k].second.insert(p, " const");
+ name.insert(p, " const");
p += 6;
}
if (cv & CV_volatile) {
- db.names[k].second.insert(p, " volatile");
+ name.insert(p, " volatile");
p += 9;
}
if (cv & CV_restrict)
- db.names[k].second.insert(p, " restrict");
+ name.insert(p, " restrict");
} else {
if (cv & CV_const)
db.names[k].first.append(" const");