diff options
author | Saleem Abdulrasool <compnerd@compnerd.org> | 2017-01-24 20:04:58 +0000 |
---|---|---|
committer | Saleem Abdulrasool <compnerd@compnerd.org> | 2017-01-24 20:04:58 +0000 |
commit | 815bff1cc4972406ec525202555e3c5c0812e3bd (patch) | |
tree | d799dde9cc3fff01b1caef5eb9cab99db37e0cd8 /lib/Demangle | |
parent | ed1b025f1b2d8ea4a5b2023a2dfbde85c020e050 (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.cpp | 15 |
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"); |