From: Saleem Abdulrasool Date: Tue, 24 Jan 2017 20:04:58 +0000 (+0000) Subject: Demangle: correct demangling for CV-qualified functions X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=815bff1cc4972406ec525202555e3c5c0812e3bd;p=llvm 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 --- 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");