//===- ItaniumDemangle.cpp ------------------------------------------------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "llvm/Demangle/Demangle.h"

// This file exports a single function: llvm::itanium_demangle.
// It also has no dependencies on the rest of llvm. It is implemented this way
// so that it can be easily reused in libcxxabi.

#include <algorithm>
#include <cctype>
#include <cstdlib>
#include <cstring>
#include <numeric>
#include <string>
#include <vector>

#ifdef _MSC_VER
// snprintf is implemented in VS 2015
#if _MSC_VER < 1900
#define snprintf _snprintf_s
#endif
#endif

enum {
  unknown_error = -4,
  invalid_args = -3,
  invalid_mangled_name,
  memory_alloc_failure,
  success
};

template <class C>
static const char *parse_type(const char *first, const char *last, C &db);
template <class C>
static const char *parse_encoding(const char *first, const char *last, C &db);
template <class C>
static const char *parse_name(const char *first, const char *last, C &db,
                              bool *ends_with_template_args = 0);
template <class C>
static const char *parse_expression(const char *first, const char *last, C &db);
template <class C>
static const char *parse_template_args(const char *first, const char *last,
                                       C &db);
template <class C>
static const char *parse_operator_name(const char *first, const char *last,
                                       C &db);
template <class C>
static const char *parse_unqualified_name(const char *first, const char *last,
                                          C &db);
template <class C>
static const char *parse_decltype(const char *first, const char *last, C &db);

// <number> ::= [n] <non-negative decimal integer>

static const char *parse_number(const char *first, const char *last) {
  if (first != last) {
    const char *t = first;
    if (*t == 'n')
      ++t;
    if (t != last) {
      if (*t == '0') {
        first = t + 1;
      } else if ('1' <= *t && *t <= '9') {
        first = t + 1;
        while (first != last && std::isdigit(*first))
          ++first;
      }
    }
  }
  return first;
}

namespace {
template <class Float> struct float_data;

template <> struct float_data<float> {
  static const size_t mangled_size = 8;
  static const size_t max_demangled_size = 24;
  static const char *spec;
};
const char *float_data<float>::spec = "%af";

template <> struct float_data<double> {
  static const size_t mangled_size = 16;
  static const size_t max_demangled_size = 32;
  static const char *spec;
};

const char *float_data<double>::spec = "%a";

template <> struct float_data<long double> {
#if defined(__mips__) && defined(__mips_n64) || defined(__aarch64__) ||        \
    defined(__wasm__)
  static const size_t mangled_size = 32;
#elif defined(__arm__) || defined(__mips__) || defined(__hexagon__)
  static const size_t mangled_size = 16;
#else
  static const size_t mangled_size =
      20; // May need to be adjusted to 16 or 24 on other platforms
#endif
  static const size_t max_demangled_size = 40;
  static const char *spec;
};

const char *float_data<long double>::spec = "%LaL";
}

template <class Float, class C>
static const char *parse_floating_number(const char *first, const char *last,
                                         C &db) {
  const size_t N = float_data<Float>::mangled_size;
  if (static_cast<std::size_t>(last - first) > N) {
    last = first + N;
    union {
      Float value;
      char buf[sizeof(Float)];
    };
    const char *t = first;
    char *e = buf;
    for (; t != last; ++t, ++e) {
      if (!isxdigit(*t))
        return first;
      unsigned d1 = isdigit(*t) ? static_cast<unsigned>(*t - '0')
                                : static_cast<unsigned>(*t - 'a' + 10);
      ++t;
      unsigned d0 = isdigit(*t) ? static_cast<unsigned>(*t - '0')
                                : static_cast<unsigned>(*t - 'a' + 10);
      *e = static_cast<char>((d1 << 4) + d0);
    }
    if (*t == 'E') {
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
      std::reverse(buf, e);
#endif
      char num[float_data<Float>::max_demangled_size] = {0};
      int n = snprintf(num, sizeof(num), float_data<Float>::spec, value);
      if (static_cast<std::size_t>(n) >= sizeof(num))
        return first;
      db.names.push_back(std::string(num, static_cast<std::size_t>(n)));
      first = t + 1;
    }
  }
  return first;
}

// <source-name> ::= <positive length number> <identifier>

template <class C>
static const char *parse_source_name(const char *first, const char *last,
                                     C &db) {
  if (first != last) {
    char c = *first;
    if (isdigit(c) && first + 1 != last) {
      const char *t = first + 1;
      size_t n = static_cast<size_t>(c - '0');
      for (c = *t; isdigit(c); c = *t) {
        n = n * 10 + static_cast<size_t>(c - '0');
        if (++t == last)
          return first;
      }
      if (static_cast<size_t>(last - t) >= n) {
        std::string r(t, n);
        if (r.substr(0, 10) == "_GLOBAL__N")
          db.names.push_back("(anonymous namespace)");
        else
          db.names.push_back(std::move(r));
        first = t + n;
      }
    }
  }
  return first;
}

// <substitution> ::= S <seq-id> _
//                ::= S_
// <substitution> ::= Sa # ::std::allocator
// <substitution> ::= Sb # ::std::basic_string
// <substitution> ::= Ss # ::std::basic_string < char,
//                                               ::std::char_traits<char>,
//                                               ::std::allocator<char> >
// <substitution> ::= Si # ::std::basic_istream<char,  std::char_traits<char> >
// <substitution> ::= So # ::std::basic_ostream<char,  std::char_traits<char> >
// <substitution> ::= Sd # ::std::basic_iostream<char, std::char_traits<char> >

template <class C>
static const char *parse_substitution(const char *first, const char *last,
                                      C &db) {
  if (last - first >= 2) {
    if (*first == 'S') {
      switch (first[1]) {
      case 'a':
        db.names.push_back("std::allocator");
        first += 2;
        break;
      case 'b':
        db.names.push_back("std::basic_string");
        first += 2;
        break;
      case 's':
        db.names.push_back("std::string");
        first += 2;
        break;
      case 'i':
        db.names.push_back("std::istream");
        first += 2;
        break;
      case 'o':
        db.names.push_back("std::ostream");
        first += 2;
        break;
      case 'd':
        db.names.push_back("std::iostream");
        first += 2;
        break;
      case '_':
        if (!db.subs.empty()) {
          for (const auto &n : db.subs.front())
            db.names.push_back(n);
          first += 2;
        }
        break;
      default:
        if (std::isdigit(first[1]) || std::isupper(first[1])) {
          size_t sub = 0;
          const char *t = first + 1;
          if (std::isdigit(*t))
            sub = static_cast<size_t>(*t - '0');
          else
            sub = static_cast<size_t>(*t - 'A') + 10;
          for (++t; t != last && (std::isdigit(*t) || std::isupper(*t)); ++t) {
            sub *= 36;
            if (std::isdigit(*t))
              sub += static_cast<size_t>(*t - '0');
            else
              sub += static_cast<size_t>(*t - 'A') + 10;
          }
          if (t == last || *t != '_')
            return first;
          ++sub;
          if (sub < db.subs.size()) {
            for (const auto &n : db.subs[sub])
              db.names.push_back(n);
            first = t + 1;
          }
        }
        break;
      }
    }
  }
  return first;
}

// <builtin-type> ::= v    # void
//                ::= w    # wchar_t
//                ::= b    # bool
//                ::= c    # char
//                ::= a    # signed char
//                ::= h    # unsigned char
//                ::= s    # short
//                ::= t    # unsigned short
//                ::= i    # int
//                ::= j    # unsigned int
//                ::= l    # long
//                ::= m    # unsigned long
//                ::= x    # long long, __int64
//                ::= y    # unsigned long long, __int64
//                ::= n    # __int128
//                ::= o    # unsigned __int128
//                ::= f    # float
//                ::= d    # double
//                ::= e    # long double, __float80
//                ::= g    # __float128
//                ::= z    # ellipsis
//                ::= Dd   # IEEE 754r decimal floating point (64 bits)
//                ::= De   # IEEE 754r decimal floating point (128 bits)
//                ::= Df   # IEEE 754r decimal floating point (32 bits)
//                ::= Dh   # IEEE 754r half-precision floating point (16 bits)
//                ::= Di   # char32_t
//                ::= Ds   # char16_t
//                ::= Da   # auto (in dependent new-expressions)
//                ::= Dc   # decltype(auto)
//                ::= Dn   # std::nullptr_t (i.e., decltype(nullptr))
//                ::= u <source-name>    # vendor extended type

template <class C>
static const char *parse_builtin_type(const char *first, const char *last,
                                      C &db) {
  if (first != last) {
    switch (*first) {
    case 'v':
      db.names.push_back("void");
      ++first;
      break;
    case 'w':
      db.names.push_back("wchar_t");
      ++first;
      break;
    case 'b':
      db.names.push_back("bool");
      ++first;
      break;
    case 'c':
      db.names.push_back("char");
      ++first;
      break;
    case 'a':
      db.names.push_back("signed char");
      ++first;
      break;
    case 'h':
      db.names.push_back("unsigned char");
      ++first;
      break;
    case 's':
      db.names.push_back("short");
      ++first;
      break;
    case 't':
      db.names.push_back("unsigned short");
      ++first;
      break;
    case 'i':
      db.names.push_back("int");
      ++first;
      break;
    case 'j':
      db.names.push_back("unsigned int");
      ++first;
      break;
    case 'l':
      db.names.push_back("long");
      ++first;
      break;
    case 'm':
      db.names.push_back("unsigned long");
      ++first;
      break;
    case 'x':
      db.names.push_back("long long");
      ++first;
      break;
    case 'y':
      db.names.push_back("unsigned long long");
      ++first;
      break;
    case 'n':
      db.names.push_back("__int128");
      ++first;
      break;
    case 'o':
      db.names.push_back("unsigned __int128");
      ++first;
      break;
    case 'f':
      db.names.push_back("float");
      ++first;
      break;
    case 'd':
      db.names.push_back("double");
      ++first;
      break;
    case 'e':
      db.names.push_back("long double");
      ++first;
      break;
    case 'g':
      db.names.push_back("__float128");
      ++first;
      break;
    case 'z':
      db.names.push_back("...");
      ++first;
      break;
    case 'u': {
      const char *t = parse_source_name(first + 1, last, db);
      if (t != first + 1)
        first = t;
    } break;
    case 'D':
      if (first + 1 != last) {
        switch (first[1]) {
        case 'd':
          db.names.push_back("decimal64");
          first += 2;
          break;
        case 'e':
          db.names.push_back("decimal128");
          first += 2;
          break;
        case 'f':
          db.names.push_back("decimal32");
          first += 2;
          break;
        case 'h':
          db.names.push_back("decimal16");
          first += 2;
          break;
        case 'i':
          db.names.push_back("char32_t");
          first += 2;
          break;
        case 's':
          db.names.push_back("char16_t");
          first += 2;
          break;
        case 'a':
          db.names.push_back("auto");
          first += 2;
          break;
        case 'c':
          db.names.push_back("decltype(auto)");
          first += 2;
          break;
        case 'n':
          db.names.push_back("std::nullptr_t");
          first += 2;
          break;
        }
      }
      break;
    }
  }
  return first;
}

// <CV-qualifiers> ::= [r] [V] [K]

static const char *parse_cv_qualifiers(const char *first, const char *last,
                                       unsigned &cv) {
  cv = 0;
  if (first != last) {
    if (*first == 'r') {
      cv |= 4;
      ++first;
    }
    if (*first == 'V') {
      cv |= 2;
      ++first;
    }
    if (*first == 'K') {
      cv |= 1;
      ++first;
    }
  }
  return first;
}

// <template-param> ::= T_    # first template parameter
//                  ::= T <parameter-2 non-negative number> _

template <class C>
static const char *parse_template_param(const char *first, const char *last,
                                        C &db) {
  if (last - first >= 2) {
    if (*first == 'T') {
      if (first[1] == '_') {
        if (db.template_param.empty())
          return first;
        if (!db.template_param.back().empty()) {
          for (auto &t : db.template_param.back().front())
            db.names.push_back(t);
          first += 2;
        } else {
          db.names.push_back("T_");
          first += 2;
          db.fix_forward_references = true;
        }
      } else if (isdigit(first[1])) {
        const char *t = first + 1;
        size_t sub = static_cast<size_t>(*t - '0');
        for (++t; t != last && isdigit(*t); ++t) {
          sub *= 10;
          sub += static_cast<size_t>(*t - '0');
        }
        if (t == last || *t != '_' || db.template_param.empty())
          return first;
        ++sub;
        if (sub < db.template_param.back().size()) {
          for (auto &temp : db.template_param.back()[sub])
            db.names.push_back(temp);
          first = t + 1;
        } else {
          db.names.push_back(std::string(first, t + 1));
          first = t + 1;
          db.fix_forward_references = true;
        }
      }
    }
  }
  return first;
}

// cc <type> <expression>                               # const_cast<type>
// (expression)

template <class C>
static const char *parse_const_cast_expr(const char *first, const char *last,
                                         C &db) {
  if (last - first >= 3 && first[0] == 'c' && first[1] == 'c') {
    const char *t = parse_type(first + 2, last, db);
    if (t != first + 2) {
      const char *t1 = parse_expression(t, last, db);
      if (t1 != t) {
        if (db.names.size() < 2)
          return first;
        auto expr = db.names.back().move_full();
        db.names.pop_back();
        if (db.names.empty())
          return first;
        db.names.back() =
            "const_cast<" + db.names.back().move_full() + ">(" + expr + ")";
        first = t1;
      }
    }
  }
  return first;
}

// dc <type> <expression>                               # dynamic_cast<type>
// (expression)

template <class C>
static const char *parse_dynamic_cast_expr(const char *first, const char *last,
                                           C &db) {
  if (last - first >= 3 && first[0] == 'd' && first[1] == 'c') {
    const char *t = parse_type(first + 2, last, db);
    if (t != first + 2) {
      const char *t1 = parse_expression(t, last, db);
      if (t1 != t) {
        if (db.names.size() < 2)
          return first;
        auto expr = db.names.back().move_full();
        db.names.pop_back();
        if (db.names.empty())
          return first;
        db.names.back() =
            "dynamic_cast<" + db.names.back().move_full() + ">(" + expr + ")";
        first = t1;
      }
    }
  }
  return first;
}

// rc <type> <expression>                               # reinterpret_cast<type>
// (expression)

template <class C>
static const char *parse_reinterpret_cast_expr(const char *first,
                                               const char *last, C &db) {
  if (last - first >= 3 && first[0] == 'r' && first[1] == 'c') {
    const char *t = parse_type(first + 2, last, db);
    if (t != first + 2) {
      const char *t1 = parse_expression(t, last, db);
      if (t1 != t) {
        if (db.names.size() < 2)
          return first;
        auto expr = db.names.back().move_full();
        db.names.pop_back();
        if (db.names.empty())
          return first;
        db.names.back() = "reinterpret_cast<" + db.names.back().move_full() +
                          ">(" + expr + ")";
        first = t1;
      }
    }
  }
  return first;
}

// sc <type> <expression>                               # static_cast<type>
// (expression)

template <class C>
static const char *parse_static_cast_expr(const char *first, const char *last,
                                          C &db) {
  if (last - first >= 3 && first[0] == 's' && first[1] == 'c') {
    const char *t = parse_type(first + 2, last, db);
    if (t != first + 2) {
      const char *t1 = parse_expression(t, last, db);
      if (t1 != t) {
        if (db.names.size() < 2)
          return first;
        auto expr = db.names.back().move_full();
        db.names.pop_back();
        db.names.back() =
            "static_cast<" + db.names.back().move_full() + ">(" + expr + ")";
        first = t1;
      }
    }
  }
  return first;
}

// sp <expression>                                  # pack expansion

template <class C>
static const char *parse_pack_expansion(const char *first, const char *last,
                                        C &db) {
  if (last - first >= 3 && first[0] == 's' && first[1] == 'p') {
    const char *t = parse_expression(first + 2, last, db);
    if (t != first + 2)
      first = t;
  }
  return first;
}

// st <type>                                            # sizeof (a type)

template <class C>
static const char *parse_sizeof_type_expr(const char *first, const char *last,
                                          C &db) {
  if (last - first >= 3 && first[0] == 's' && first[1] == 't') {
    const char *t = parse_type(first + 2, last, db);
    if (t != first + 2) {
      if (db.names.empty())
        return first;
      db.names.back() = "sizeof (" + db.names.back().move_full() + ")";
      first = t;
    }
  }
  return first;
}

// sz <expr>                                            # sizeof (a expression)

template <class C>
static const char *parse_sizeof_expr_expr(const char *first, const char *last,
                                          C &db) {
  if (last - first >= 3 && first[0] == 's' && first[1] == 'z') {
    const char *t = parse_expression(first + 2, last, db);
    if (t != first + 2) {
      if (db.names.empty())
        return first;
      db.names.back() = "sizeof (" + db.names.back().move_full() + ")";
      first = t;
    }
  }
  return first;
}

// sZ <template-param>                                  # size of a parameter
// pack

template <class C>
static const char *parse_sizeof_param_pack_expr(const char *first,
                                                const char *last, C &db) {
  if (last - first >= 3 && first[0] == 's' && first[1] == 'Z' &&
      first[2] == 'T') {
    size_t k0 = db.names.size();
    const char *t = parse_template_param(first + 2, last, db);
    size_t k1 = db.names.size();
    if (t != first + 2) {
      std::string tmp("sizeof...(");
      size_t k = k0;
      if (k != k1) {
        tmp += db.names[k].move_full();
        for (++k; k != k1; ++k)
          tmp += ", " + db.names[k].move_full();
      }
      tmp += ")";
      for (; k1 != k0; --k1)
        db.names.pop_back();
      db.names.push_back(std::move(tmp));
      first = t;
    }
  }
  return first;
}

// <function-param> ::= fp <top-level CV-qualifiers> _ # L == 0, first parameter
//                  ::= fp <top-level CV-qualifiers> <parameter-2 non-negative
//                  number> _   # L == 0, second and later parameters
//                  ::= fL <L-1 non-negative number> p <top-level CV-qualifiers>
//                  _         # L > 0, first parameter
//                  ::= fL <L-1 non-negative number> p <top-level CV-qualifiers>
//                  <parameter-2 non-negative number> _   # L > 0, second and
//                  later parameters

template <class C>
static const char *parse_function_param(const char *first, const char *last,
                                        C &db) {
  if (last - first >= 3 && *first == 'f') {
    if (first[1] == 'p') {
      unsigned cv;
      const char *t = parse_cv_qualifiers(first + 2, last, cv);
      const char *t1 = parse_number(t, last);
      if (t1 != last && *t1 == '_') {
        db.names.push_back("fp" + std::string(t, t1));
        first = t1 + 1;
      }
    } else if (first[1] == 'L') {
      unsigned cv;
      const char *t0 = parse_number(first + 2, last);
      if (t0 != last && *t0 == 'p') {
        ++t0;
        const char *t = parse_cv_qualifiers(t0, last, cv);
        const char *t1 = parse_number(t, last);
        if (t1 != last && *t1 == '_') {
          db.names.push_back("fp" + std::string(t, t1));
          first = t1 + 1;
        }
      }
    }
  }
  return first;
}

// sZ <function-param>                                  # size of a function
// parameter pack

template <class C>
static const char *parse_sizeof_function_param_pack_expr(const char *first,
                                                         const char *last,
                                                         C &db) {
  if (last - first >= 3 && first[0] == 's' && first[1] == 'Z' &&
      first[2] == 'f') {
    const char *t = parse_function_param(first + 2, last, db);
    if (t != first + 2) {
      if (db.names.empty())
        return first;
      db.names.back() = "sizeof...(" + db.names.back().move_full() + ")";
      first = t;
    }
  }
  return first;
}

// te <expression>                                      # typeid (expression)
// ti <type>                                            # typeid (type)

template <class C>
static const char *parse_typeid_expr(const char *first, const char *last,
                                     C &db) {
  if (last - first >= 3 && first[0] == 't' &&
      (first[1] == 'e' || first[1] == 'i')) {
    const char *t;
    if (first[1] == 'e')
      t = parse_expression(first + 2, last, db);
    else
      t = parse_type(first + 2, last, db);
    if (t != first + 2) {
      if (db.names.empty())
        return first;
      db.names.back() = "typeid(" + db.names.back().move_full() + ")";
      first = t;
    }
  }
  return first;
}

// tw <expression>                                      # throw expression

template <class C>
static const char *parse_throw_expr(const char *first, const char *last,
                                    C &db) {
  if (last - first >= 3 && first[0] == 't' && first[1] == 'w') {
    const char *t = parse_expression(first + 2, last, db);
    if (t != first + 2) {
      if (db.names.empty())
        return first;
      db.names.back() = "throw " + db.names.back().move_full();
      first = t;
    }
  }
  return first;
}

// ds <expression> <expression>                         # expr.*expr

template <class C>
static const char *parse_dot_star_expr(const char *first, const char *last,
                                       C &db) {
  if (last - first >= 3 && first[0] == 'd' && first[1] == 's') {
    const char *t = parse_expression(first + 2, last, db);
    if (t != first + 2) {
      const char *t1 = parse_expression(t, last, db);
      if (t1 != t) {
        if (db.names.size() < 2)
          return first;
        auto expr = db.names.back().move_full();
        db.names.pop_back();
        db.names.back().first += ".*" + expr;
        first = t1;
      }
    }
  }
  return first;
}

// <simple-id> ::= <source-name> [ <template-args> ]

template <class C>
static const char *parse_simple_id(const char *first, const char *last, C &db) {
  if (first != last) {
    const char *t = parse_source_name(first, last, db);
    if (t != first) {
      const char *t1 = parse_template_args(t, last, db);
      if (t1 != t) {
        if (db.names.size() < 2)
          return first;
        auto args = db.names.back().move_full();
        db.names.pop_back();
        db.names.back().first += std::move(args);
      }
      first = t1;
    } else
      first = t;
  }
  return first;
}

// <unresolved-type> ::= <template-param>
//                   ::= <decltype>
//                   ::= <substitution>

template <class C>
static const char *parse_unresolved_type(const char *first, const char *last,
                                         C &db) {
  if (first != last) {
    const char *t = first;
    switch (*first) {
    case 'T': {
      size_t k0 = db.names.size();
      t = parse_template_param(first, last, db);
      size_t k1 = db.names.size();
      if (t != first && k1 == k0 + 1) {
        db.subs.push_back(typename C::sub_type(1, db.names.back()));
        first = t;
      } else {
        for (; k1 != k0; --k1)
          db.names.pop_back();
      }
      break;
    }
    case 'D':
      t = parse_decltype(first, last, db);
      if (t != first) {
        if (db.names.empty())
          return first;
        db.subs.push_back(typename C::sub_type(1, db.names.back()));
        first = t;
      }
      break;
    case 'S':
      t = parse_substitution(first, last, db);
      if (t != first)
        first = t;
      else {
        if (last - first > 2 && first[1] == 't') {
          t = parse_unqualified_name(first + 2, last, db);
          if (t != first + 2) {
            if (db.names.empty())
              return first;
            db.names.back().first.insert(0, "std::");
            db.subs.push_back(typename C::sub_type(1, db.names.back()));
            first = t;
          }
        }
      }
      break;
    }
  }
  return first;
}

// <destructor-name> ::= <unresolved-type>                               # e.g.,
// ~T or ~decltype(f())
//                   ::= <simple-id>                                     # e.g.,
//                   ~A<2*N>

template <class C>
static const char *parse_destructor_name(const char *first, const char *last,
                                         C &db) {
  if (first != last) {
    const char *t = parse_unresolved_type(first, last, db);
    if (t == first)
      t = parse_simple_id(first, last, db);
    if (t != first) {
      if (db.names.empty())
        return first;
      db.names.back().first.insert(0, "~");
      first = t;
    }
  }
  return first;
}

// <base-unresolved-name> ::= <simple-id>                                #
// unresolved name
//          extension     ::= <operator-name>                            #
//          unresolved operator-function-id
//          extension     ::= <operator-name> <template-args>            #
//          unresolved operator template-id
//                        ::= on <operator-name>                         #
//                        unresolved operator-function-id
//                        ::= on <operator-name> <template-args>         #
//                        unresolved operator template-id
//                        ::= dn <destructor-name>                       #
//                        destructor or pseudo-destructor;
//                                                                         #
//                                                                         e.g.
//                                                                         ~X or
//                                                                         ~X<N-1>

template <class C>
static const char *parse_base_unresolved_name(const char *first,
                                              const char *last, C &db) {
  if (last - first >= 2) {
    if ((first[0] == 'o' || first[0] == 'd') && first[1] == 'n') {
      if (first[0] == 'o') {
        const char *t = parse_operator_name(first + 2, last, db);
        if (t != first + 2) {
          first = parse_template_args(t, last, db);
          if (first != t) {
            if (db.names.size() < 2)
              return first;
            auto args = db.names.back().move_full();
            db.names.pop_back();
            db.names.back().first += std::move(args);
          }
        }
      } else {
        const char *t = parse_destructor_name(first + 2, last, db);
        if (t != first + 2)
          first = t;
      }
    } else {
      const char *t = parse_simple_id(first, last, db);
      if (t == first) {
        t = parse_operator_name(first, last, db);
        if (t != first) {
          first = parse_template_args(t, last, db);
          if (first != t) {
            if (db.names.size() < 2)
              return first;
            auto args = db.names.back().move_full();
            db.names.pop_back();
            db.names.back().first += std::move(args);
          }
        }
      } else
        first = t;
    }
  }
  return first;
}

// <unresolved-qualifier-level> ::= <simple-id>

template <class C>
static const char *parse_unresolved_qualifier_level(const char *first,
                                                    const char *last, C &db) {
  return parse_simple_id(first, last, db);
}

// <unresolved-name>
//  extension        ::= srN <unresolved-type> [<template-args>]
//  <unresolved-qualifier-level>* E <base-unresolved-name>
//                   ::= [gs] <base-unresolved-name>                     # x or
//                   (with "gs") ::x
//                   ::= [gs] sr <unresolved-qualifier-level>+ E
//                   <base-unresolved-name>
//                                                                       # A::x,
//                                                                       N::y,
//                                                                       A<T>::z;
//                                                                       "gs"
//                                                                       means
//                                                                       leading
//                                                                       "::"
//                   ::= sr <unresolved-type> <base-unresolved-name>     # T::x
//                   / decltype(p)::x
//  extension        ::= sr <unresolved-type> <template-args>
//  <base-unresolved-name>
//                                                                       #
//                                                                       T::N::x
//                                                                       /decltype(p)::N::x
//  (ignored)        ::= srN <unresolved-type>  <unresolved-qualifier-level>+ E
//  <base-unresolved-name>

template <class C>
static const char *parse_unresolved_name(const char *first, const char *last,
                                         C &db) {
  if (last - first > 2) {
    const char *t = first;
    bool global = false;
    if (t[0] == 'g' && t[1] == 's') {
      global = true;
      t += 2;
    }
    const char *t2 = parse_base_unresolved_name(t, last, db);
    if (t2 != t) {
      if (global) {
        if (db.names.empty())
          return first;
        db.names.back().first.insert(0, "::");
      }
      first = t2;
    } else if (last - t > 2 && t[0] == 's' && t[1] == 'r') {
      if (t[2] == 'N') {
        t += 3;
        const char *t1 = parse_unresolved_type(t, last, db);
        if (t1 == t || t1 == last)
          return first;
        t = t1;
        t1 = parse_template_args(t, last, db);
        if (t1 != t) {
          if (db.names.size() < 2)
            return first;
          auto args = db.names.back().move_full();
          db.names.pop_back();
          db.names.back().first += std::move(args);
          t = t1;
          if (t == last) {
            db.names.pop_back();
            return first;
          }
        }
        while (*t != 'E') {
          t1 = parse_unresolved_qualifier_level(t, last, db);
          if (t1 == t || t1 == last || db.names.size() < 2)
            return first;
          auto s = db.names.back().move_full();
          db.names.pop_back();
          db.names.back().first += "::" + std::move(s);
          t = t1;
        }
        ++t;
        t1 = parse_base_unresolved_name(t, last, db);
        if (t1 == t) {
          if (!db.names.empty())
            db.names.pop_back();
          return first;
        }
        if (db.names.size() < 2)
          return first;
        auto s = db.names.back().move_full();
        db.names.pop_back();
        db.names.back().first += "::" + std::move(s);
        first = t1;
      } else {
        t += 2;
        const char *t1 = parse_unresolved_type(t, last, db);
        if (t1 != t) {
          t = t1;
          t1 = parse_template_args(t, last, db);
          if (t1 != t) {
            if (db.names.size() < 2)
              return first;
            auto args = db.names.back().move_full();
            db.names.pop_back();
            db.names.back().first += std::move(args);
            t = t1;
          }
          t1 = parse_base_unresolved_name(t, last, db);
          if (t1 == t) {
            if (!db.names.empty())
              db.names.pop_back();
            return first;
          }
          if (db.names.size() < 2)
            return first;
          auto s = db.names.back().move_full();
          db.names.pop_back();
          db.names.back().first += "::" + std::move(s);
          first = t1;
        } else {
          t1 = parse_unresolved_qualifier_level(t, last, db);
          if (t1 == t || t1 == last)
            return first;
          t = t1;
          if (global) {
            if (db.names.empty())
              return first;
            db.names.back().first.insert(0, "::");
          }
          while (*t != 'E') {
            t1 = parse_unresolved_qualifier_level(t, last, db);
            if (t1 == t || t1 == last || db.names.size() < 2)
              return first;
            auto s = db.names.back().move_full();
            db.names.pop_back();
            db.names.back().first += "::" + std::move(s);
            t = t1;
          }
          ++t;
          t1 = parse_base_unresolved_name(t, last, db);
          if (t1 == t) {
            if (!db.names.empty())
              db.names.pop_back();
            return first;
          }
          if (db.names.size() < 2)
            return first;
          auto s = db.names.back().move_full();
          db.names.pop_back();
          db.names.back().first += "::" + std::move(s);
          first = t1;
        }
      }
    }
  }
  return first;
}

// dt <expression> <unresolved-name>                    # expr.name

template <class C>
static const char *parse_dot_expr(const char *first, const char *last, C &db) {
  if (last - first >= 3 && first[0] == 'd' && first[1] == 't') {
    const char *t = parse_expression(first + 2, last, db);
    if (t != first + 2) {
      const char *t1 = parse_unresolved_name(t, last, db);
      if (t1 != t) {
        if (db.names.size() < 2)
          return first;
        auto name = db.names.back().move_full();
        db.names.pop_back();
        if (db.names.empty())
          return first;
        db.names.back().first += "." + name;
        first = t1;
      }
    }
  }
  return first;
}

// cl <expression>+ E                                   # call

template <class C>
static const char *parse_call_expr(const char *first, const char *last, C &db) {
  if (last - first >= 4 && first[0] == 'c' && first[1] == 'l') {
    const char *t = parse_expression(first + 2, last, db);
    if (t != first + 2) {
      if (t == last)
        return first;
      if (db.names.empty())
        return first;
      db.names.back().first += db.names.back().second;
      db.names.back().second = std::string();
      db.names.back().first.append("(");
      bool first_expr = true;
      while (*t != 'E') {
        const char *t1 = parse_expression(t, last, db);
        if (t1 == t || t1 == last)
          return first;
        if (db.names.empty())
          return first;
        auto tmp = db.names.back().move_full();
        db.names.pop_back();
        if (!tmp.empty()) {
          if (db.names.empty())
            return first;
          if (!first_expr) {
            db.names.back().first.append(", ");
            first_expr = false;
          }
          db.names.back().first.append(tmp);
        }
        t = t1;
      }
      ++t;
      if (db.names.empty())
        return first;
      db.names.back().first.append(")");
      first = t;
    }
  }
  return first;
}

// [gs] nw <expression>* _ <type> E                     # new (expr-list) type
// [gs] nw <expression>* _ <type> <initializer>         # new (expr-list) type
// (init)
// [gs] na <expression>* _ <type> E                     # new[] (expr-list) type
// [gs] na <expression>* _ <type> <initializer>         # new[] (expr-list) type
// (init)
// <initializer> ::= pi <expression>* E                 # parenthesized
// initialization

template <class C>
static const char *parse_new_expr(const char *first, const char *last, C &db) {
  if (last - first >= 4) {
    const char *t = first;
    bool parsed_gs = false;
    if (t[0] == 'g' && t[1] == 's') {
      t += 2;
      parsed_gs = true;
    }
    if (t[0] == 'n' && (t[1] == 'w' || t[1] == 'a')) {
      bool is_array = t[1] == 'a';
      t += 2;
      if (t == last)
        return first;
      bool has_expr_list = false;
      bool first_expr = true;
      while (*t != '_') {
        const char *t1 = parse_expression(t, last, db);
        if (t1 == t || t1 == last)
          return first;
        has_expr_list = true;
        if (!first_expr) {
          if (db.names.empty())
            return first;
          auto tmp = db.names.back().move_full();
          db.names.pop_back();
          if (!tmp.empty()) {
            if (db.names.empty())
              return first;
            db.names.back().first.append(", ");
            db.names.back().first.append(tmp);
            first_expr = false;
          }
        }
        t = t1;
      }
      ++t;
      const char *t1 = parse_type(t, last, db);
      if (t1 == t || t1 == last)
        return first;
      t = t1;
      bool has_init = false;
      if (last - t >= 3 && t[0] == 'p' && t[1] == 'i') {
        t += 2;
        has_init = true;
        first_expr = true;
        while (*t != 'E') {
          t1 = parse_expression(t, last, db);
          if (t1 == t || t1 == last)
            return first;
          if (!first_expr) {
            if (db.names.empty())
              return first;
            auto tmp = db.names.back().move_full();
            db.names.pop_back();
            if (!tmp.empty()) {
              if (db.names.empty())
                return first;
              db.names.back().first.append(", ");
              db.names.back().first.append(tmp);
              first_expr = false;
            }
          }
          t = t1;
        }
      }
      if (*t != 'E')
        return first;
      std::string init_list;
      if (has_init) {
        if (db.names.empty())
          return first;
        init_list = db.names.back().move_full();
        db.names.pop_back();
      }
      if (db.names.empty())
        return first;
      auto type = db.names.back().move_full();
      db.names.pop_back();
      std::string expr_list;
      if (has_expr_list) {
        if (db.names.empty())
          return first;
        expr_list = db.names.back().move_full();
        db.names.pop_back();
      }
      std::string r;
      if (parsed_gs)
        r = "::";
      if (is_array)
        r += "[] ";
      else
        r += " ";
      if (has_expr_list)
        r += "(" + expr_list + ") ";
      r += type;
      if (has_init)
        r += " (" + init_list + ")";
      db.names.push_back(std::move(r));
      first = t + 1;
    }
  }
  return first;
}

// cv <type> <expression>                               # conversion with one
// argument
// cv <type> _ <expression>* E                          # conversion with a
// different number of arguments

template <class C>
static const char *parse_conversion_expr(const char *first, const char *last,
                                         C &db) {
  if (last - first >= 3 && first[0] == 'c' && first[1] == 'v') {
    bool try_to_parse_template_args = db.try_to_parse_template_args;
    db.try_to_parse_template_args = false;
    const char *t = parse_type(first + 2, last, db);
    db.try_to_parse_template_args = try_to_parse_template_args;
    if (t != first + 2 && t != last) {
      if (*t != '_') {
        const char *t1 = parse_expression(t, last, db);
        if (t1 == t)
          return first;
        t = t1;
      } else {
        ++t;
        if (t == last)
          return first;
        if (*t == 'E')
          db.names.emplace_back();
        else {
          bool first_expr = true;
          while (*t != 'E') {
            const char *t1 = parse_expression(t, last, db);
            if (t1 == t || t1 == last)
              return first;
            if (!first_expr) {
              if (db.names.empty())
                return first;
              auto tmp = db.names.back().move_full();
              db.names.pop_back();
              if (!tmp.empty()) {
                if (db.names.empty())
                  return first;
                db.names.back().first.append(", ");
                db.names.back().first.append(tmp);
                first_expr = false;
              }
            }
            t = t1;
          }
        }
        ++t;
      }
      if (db.names.size() < 2)
        return first;
      auto tmp = db.names.back().move_full();
      db.names.pop_back();
      db.names.back() = "(" + db.names.back().move_full() + ")(" + tmp + ")";
      first = t;
    }
  }
  return first;
}

// pt <expression> <expression>                    # expr->name

template <class C>
static const char *parse_arrow_expr(const char *first, const char *last,
                                    C &db) {
  if (last - first >= 3 && first[0] == 'p' && first[1] == 't') {
    const char *t = parse_expression(first + 2, last, db);
    if (t != first + 2) {
      const char *t1 = parse_expression(t, last, db);
      if (t1 != t) {
        if (db.names.size() < 2)
          return first;
        auto tmp = db.names.back().move_full();
        db.names.pop_back();
        db.names.back().first += "->";
        db.names.back().first += tmp;
        first = t1;
      }
    }
  }
  return first;
}

//  <ref-qualifier> ::= R                   # & ref-qualifier
//  <ref-qualifier> ::= O                   # && ref-qualifier

// <function-type> ::= F [Y] <bare-function-type> [<ref-qualifier>] E

template <class C>
static const char *parse_function_type(const char *first, const char *last,
                                       C &db) {
  if (first != last && *first == 'F') {
    const char *t = first + 1;
    if (t != last) {
      if (*t == 'Y') {
        /* extern "C" */
        if (++t == last)
          return first;
      }
      const char *t1 = parse_type(t, last, db);
      if (t1 != t) {
        t = t1;
        std::string sig("(");
        int ref_qual = 0;
        while (true) {
          if (t == last) {
            db.names.pop_back();
            return first;
          }
          if (*t == 'E') {
            ++t;
            break;
          }
          if (*t == 'v') {
            ++t;
            continue;
          }
          if (*t == 'R' && t + 1 != last && t[1] == 'E') {
            ref_qual = 1;
            ++t;
            continue;
          }
          if (*t == 'O' && t + 1 != last && t[1] == 'E') {
            ref_qual = 2;
            ++t;
            continue;
          }
          size_t k0 = db.names.size();
          t1 = parse_type(t, last, db);
          size_t k1 = db.names.size();
          if (t1 == t || t1 == last)
            return first;
          for (size_t k = k0; k < k1; ++k) {
            if (sig.size() > 1)
              sig += ", ";
            sig += db.names[k].move_full();
          }
          for (size_t k = k0; k < k1; ++k)
            db.names.pop_back();
          t = t1;
        }
        sig += ")";
        switch (ref_qual) {
        case 1:
          sig += " &";
          break;
        case 2:
          sig += " &&";
          break;
        }
        if (db.names.empty())
          return first;
        db.names.back().first += " ";
        db.names.back().second.insert(0, sig);
        first = t;
      }
    }
  }
  return first;
}

// <pointer-to-member-type> ::= M <class type> <member type>

template <class C>
static const char *parse_pointer_to_member_type(const char *first,
                                                const char *last, C &db) {
  if (first != last && *first == 'M') {
    const char *t = parse_type(first + 1, last, db);
    if (t != first + 1) {
      const char *t2 = parse_type(t, last, db);
      if (t2 != t) {
        if (db.names.size() < 2)
          return first;
        auto func = std::move(db.names.back());
        db.names.pop_back();
        auto class_type = std::move(db.names.back());
        if (!func.second.empty() && func.second.front() == '(') {
          db.names.back().first =
              std::move(func.first) + "(" + class_type.move_full() + "::*";
          db.names.back().second = ")" + std::move(func.second);
        } else {
          db.names.back().first =
              std::move(func.first) + " " + class_type.move_full() + "::*";
          db.names.back().second = std::move(func.second);
        }
        first = t2;
      }
    }
  }
  return first;
}

// <array-type> ::= A <positive dimension number> _ <element type>
//              ::= A [<dimension expression>] _ <element type>

template <class C>
static const char *parse_array_type(const char *first, const char *last,
                                    C &db) {
  if (first != last && *first == 'A' && first + 1 != last) {
    if (first[1] == '_') {
      const char *t = parse_type(first + 2, last, db);
      if (t != first + 2) {
        if (db.names.empty())
          return first;
        if (db.names.back().second.substr(0, 2) == " [")
          db.names.back().second.erase(0, 1);
        db.names.back().second.insert(0, " []");
        first = t;
      }
    } else if ('1' <= first[1] && first[1] <= '9') {
      const char *t = parse_number(first + 1, last);
      if (t != last && *t == '_') {
        const char *t2 = parse_type(t + 1, last, db);
        if (t2 != t + 1) {
          if (db.names.empty())
            return first;
          if (db.names.back().second.substr(0, 2) == " [")
            db.names.back().second.erase(0, 1);
          db.names.back().second.insert(0,
                                        " [" + std::string(first + 1, t) + "]");
          first = t2;
        }
      }
    } else {
      const char *t = parse_expression(first + 1, last, db);
      if (t != first + 1 && t != last && *t == '_') {
        const char *t2 = parse_type(++t, last, db);
        if (t2 != t) {
          if (db.names.size() < 2)
            return first;
          auto type = std::move(db.names.back());
          db.names.pop_back();
          auto expr = std::move(db.names.back());
          db.names.back().first = std::move(type.first);
          if (type.second.substr(0, 2) == " [")
            type.second.erase(0, 1);
          db.names.back().second =
              " [" + expr.move_full() + "]" + std::move(type.second);
          first = t2;
        }
      }
    }
  }
  return first;
}

// <decltype>  ::= Dt <expression> E  # decltype of an id-expression or class
// member access (C++0x)
//             ::= DT <expression> E  # decltype of an expression (C++0x)

template <class C>
static const char *parse_decltype(const char *first, const char *last, C &db) {
  if (last - first >= 4 && first[0] == 'D') {
    switch (first[1]) {
    case 't':
    case 'T': {
      const char *t = parse_expression(first + 2, last, db);
      if (t != first + 2 && t != last && *t == 'E') {
        if (db.names.empty())
          return first;
        db.names.back() = "decltype(" + db.names.back().move_full() + ")";
        first = t + 1;
      }
    } break;
    }
  }
  return first;
}

// extension:
// <vector-type>           ::= Dv <positive dimension number> _
//                                    <extended element type>
//                         ::= Dv [<dimension expression>] _ <element type>
// <extended element type> ::= <element type>
//                         ::= p # AltiVec vector pixel

template <class C>
static const char *parse_vector_type(const char *first, const char *last,
                                     C &db) {
  if (last - first > 3 && first[0] == 'D' && first[1] == 'v') {
    if ('1' <= first[2] && first[2] <= '9') {
      const char *t = parse_number(first + 2, last);
      if (t == last || *t != '_')
        return first;
      const char *num = first + 2;
      size_t sz = static_cast<size_t>(t - num);
      if (++t != last) {
        if (*t != 'p') {
          const char *t1 = parse_type(t, last, db);
          if (t1 != t) {
            if (db.names.empty())
              return first;
            db.names.back().first += " vector[" + std::string(num, sz) + "]";
            first = t1;
          }
        } else {
          ++t;
          db.names.push_back("pixel vector[" + std::string(num, sz) + "]");
          first = t;
        }
      }
    } else {
      std::string num;
      const char *t1 = first + 2;
      if (*t1 != '_') {
        const char *t = parse_expression(t1, last, db);
        if (t != t1) {
          if (db.names.empty())
            return first;
          num = db.names.back().move_full();
          db.names.pop_back();
          t1 = t;
        }
      }
      if (t1 != last && *t1 == '_' && ++t1 != last) {
        const char *t = parse_type(t1, last, db);
        if (t != t1) {
          if (db.names.empty())
            return first;
          db.names.back().first += " vector[" + num + "]";
          first = t;
        }
      }
    }
  }
  return first;
}

// <type> ::= <builtin-type>
//        ::= <function-type>
//        ::= <class-enum-type>
//        ::= <array-type>
//        ::= <pointer-to-member-type>
//        ::= <template-param>
//        ::= <template-template-param> <template-args>
//        ::= <decltype>
//        ::= <substitution>
//        ::= <CV-qualifiers> <type>
//        ::= P <type>        # pointer-to
//        ::= R <type>        # reference-to
//        ::= O <type>        # rvalue reference-to (C++0x)
//        ::= C <type>        # complex pair (C 2000)
//        ::= G <type>        # imaginary (C 2000)
//        ::= Dp <type>       # pack expansion (C++0x)
//        ::= U <source-name> <type>  # vendor extended type qualifier
// extension := U <objc-name> <objc-type>  # objc-type<identifier>
// extension := <vector-type> # <vector-type> starts with Dv

// <objc-name> ::= <k0 number> objcproto <k1 number> <identifier>  # k0 = 9 +
// <number of digits in k1> + k1
// <objc-type> := <source-name>  # PU<11+>objcproto 11objc_object<source-name>
// 11objc_object -> id<source-name>

template <class C>
static const char *parse_type(const char *first, const char *last, C &db) {
  if (first != last) {
    switch (*first) {
    case 'r':
    case 'V':
    case 'K': {
      unsigned cv = 0;
      const char *t = parse_cv_qualifiers(first, last, cv);
      if (t != first) {
        bool is_function = *t == 'F';
        size_t k0 = db.names.size();
        const char *t1 = parse_type(t, last, db);
        size_t k1 = db.names.size();
        if (t1 != t) {
          if (is_function)
            db.subs.pop_back();
          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] == '&')
                p -= 3;
              else if (db.names[k].second.back() == '&')
                p -= 2;
              if (cv & 1) {
                db.names[k].second.insert(p, " const");
                p += 6;
              }
              if (cv & 2) {
                db.names[k].second.insert(p, " volatile");
                p += 9;
              }
              if (cv & 4)
                db.names[k].second.insert(p, " restrict");
            } else {
              if (cv & 1)
                db.names[k].first.append(" const");
              if (cv & 2)
                db.names[k].first.append(" volatile");
              if (cv & 4)
                db.names[k].first.append(" restrict");
            }
            db.subs.back().push_back(db.names[k]);
          }
          first = t1;
        }
      }
    } break;
    default: {
      const char *t = parse_builtin_type(first, last, db);
      if (t != first) {
        first = t;
      } else {
        switch (*first) {
        case 'A':
          t = parse_array_type(first, last, db);
          if (t != first) {
            if (db.names.empty())
              return first;
            first = t;
            db.subs.push_back(typename C::sub_type(1, db.names.back()));
          }
          break;
        case 'C':
          t = parse_type(first + 1, last, db);
          if (t != first + 1) {
            if (db.names.empty())
              return first;
            db.names.back().first.append(" complex");
            first = t;
            db.subs.push_back(typename C::sub_type(1, db.names.back()));
          }
          break;
        case 'F':
          t = parse_function_type(first, last, db);
          if (t != first) {
            if (db.names.empty())
              return first;
            first = t;
            db.subs.push_back(typename C::sub_type(1, db.names.back()));
          }
          break;
        case 'G':
          t = parse_type(first + 1, last, db);
          if (t != first + 1) {
            if (db.names.empty())
              return first;
            db.names.back().first.append(" imaginary");
            first = t;
            db.subs.push_back(typename C::sub_type(1, db.names.back()));
          }
          break;
        case 'M':
          t = parse_pointer_to_member_type(first, last, db);
          if (t != first) {
            if (db.names.empty())
              return first;
            first = t;
            db.subs.push_back(typename C::sub_type(1, db.names.back()));
          }
          break;
        case 'O': {
          size_t k0 = db.names.size();
          t = parse_type(first + 1, last, db);
          size_t k1 = db.names.size();
          if (t != first + 1) {
            db.subs.emplace_back();
            for (size_t k = k0; k < k1; ++k) {
              if (db.names[k].second.substr(0, 2) == " [") {
                db.names[k].first += " (";
                db.names[k].second.insert(0, ")");
              } else if (!db.names[k].second.empty() &&
                         db.names[k].second.front() == '(') {
                db.names[k].first += "(";
                db.names[k].second.insert(0, ")");
              }
              db.names[k].first.append("&&");
              db.subs.back().push_back(db.names[k]);
            }
            first = t;
          }
          break;
        }
        case 'P': {
          size_t k0 = db.names.size();
          t = parse_type(first + 1, last, db);
          size_t k1 = db.names.size();
          if (t != first + 1) {
            db.subs.emplace_back();
            for (size_t k = k0; k < k1; ++k) {
              if (db.names[k].second.substr(0, 2) == " [") {
                db.names[k].first += " (";
                db.names[k].second.insert(0, ")");
              } else if (!db.names[k].second.empty() &&
                         db.names[k].second.front() == '(') {
                db.names[k].first += "(";
                db.names[k].second.insert(0, ")");
              }
              if (first[1] != 'U' ||
                  db.names[k].first.substr(0, 12) != "objc_object<") {
                db.names[k].first.append("*");
              } else {
                db.names[k].first.replace(0, 11, "id");
              }
              db.subs.back().push_back(db.names[k]);
            }
            first = t;
          }
          break;
        }
        case 'R': {
          size_t k0 = db.names.size();
          t = parse_type(first + 1, last, db);
          size_t k1 = db.names.size();
          if (t != first + 1) {
            db.subs.emplace_back();
            for (size_t k = k0; k < k1; ++k) {
              if (db.names[k].second.substr(0, 2) == " [") {
                db.names[k].first += " (";
                db.names[k].second.insert(0, ")");
              } else if (!db.names[k].second.empty() &&
                         db.names[k].second.front() == '(') {
                db.names[k].first += "(";
                db.names[k].second.insert(0, ")");
              }
              db.names[k].first.append("&");
              db.subs.back().push_back(db.names[k]);
            }
            first = t;
          }
          break;
        }
        case 'T': {
          size_t k0 = db.names.size();
          t = parse_template_param(first, last, db);
          size_t k1 = db.names.size();
          if (t != first) {
            db.subs.emplace_back();
            for (size_t k = k0; k < k1; ++k)
              db.subs.back().push_back(db.names[k]);
            if (db.try_to_parse_template_args && k1 == k0 + 1) {
              const char *t1 = parse_template_args(t, last, db);
              if (t1 != t) {
                auto args = db.names.back().move_full();
                db.names.pop_back();
                db.names.back().first += std::move(args);
                db.subs.push_back(typename C::sub_type(1, db.names.back()));
                t = t1;
              }
            }
            first = t;
          }
          break;
        }
        case 'U':
          if (first + 1 != last) {
            t = parse_source_name(first + 1, last, db);
            if (t != first + 1) {
              const char *t2 = parse_type(t, last, db);
              if (t2 != t) {
                if (db.names.size() < 2)
                  return first;
                auto type = db.names.back().move_full();
                db.names.pop_back();
                if (db.names.back().first.substr(0, 9) != "objcproto") {
                  db.names.back() = type + " " + db.names.back().move_full();
                } else {
                  auto proto = db.names.back().move_full();
                  db.names.pop_back();
                  t = parse_source_name(proto.data() + 9,
                                        proto.data() + proto.size(), db);
                  if (t != proto.data() + 9) {
                    db.names.back() =
                        type + "<" + db.names.back().move_full() + ">";
                  } else {
                    db.names.push_back(type + " " + proto);
                  }
                }
                db.subs.push_back(typename C::sub_type(1, db.names.back()));
                first = t2;
              }
            }
          }
          break;
        case 'S':
          if (first + 1 != last && first[1] == 't') {
            t = parse_name(first, last, db);
            if (t != first) {
              if (db.names.empty())
                return first;
              db.subs.push_back(typename C::sub_type(1, db.names.back()));
              first = t;
            }
          } else {
            t = parse_substitution(first, last, db);
            if (t != first) {
              first = t;
              // Parsed a substitution.  If the substitution is a
              //  <template-param> it might be followed by <template-args>.
              t = parse_template_args(first, last, db);
              if (t != first) {
                if (db.names.size() < 2)
                  return first;
                auto template_args = db.names.back().move_full();
                db.names.pop_back();
                db.names.back().first += template_args;
                // Need to create substitution for <template-template-param>
                // <template-args>
                db.subs.push_back(typename C::sub_type(1, db.names.back()));
                first = t;
              }
            }
          }
          break;
        case 'D':
          if (first + 1 != last) {
            switch (first[1]) {
            case 'p': {
              size_t k0 = db.names.size();
              t = parse_type(first + 2, last, db);
              size_t k1 = db.names.size();
              if (t != first + 2) {
                db.subs.emplace_back();
                for (size_t k = k0; k < k1; ++k)
                  db.subs.back().push_back(db.names[k]);
                first = t;
                return first;
              }
              break;
            }
            case 't':
            case 'T':
              t = parse_decltype(first, last, db);
              if (t != first) {
                if (db.names.empty())
                  return first;
                db.subs.push_back(typename C::sub_type(1, db.names.back()));
                first = t;
                return first;
              }
              break;
            case 'v':
              t = parse_vector_type(first, last, db);
              if (t != first) {
                if (db.names.empty())
                  return first;
                db.subs.push_back(typename C::sub_type(1, db.names.back()));
                first = t;
                return first;
              }
              break;
            }
          }
        // drop through
        default:
          // must check for builtin-types before class-enum-types to avoid
          // ambiguities with operator-names
          t = parse_builtin_type(first, last, db);
          if (t != first) {
            first = t;
          } else {
            t = parse_name(first, last, db);
            if (t != first) {
              if (db.names.empty())
                return first;
              db.subs.push_back(typename C::sub_type(1, db.names.back()));
              first = t;
            }
          }
          break;
        }
      }
      break;
    }
    }
  }
  return first;
}

//   <operator-name>
//                   ::= aa    # &&
//                   ::= ad    # & (unary)
//                   ::= an    # &
//                   ::= aN    # &=
//                   ::= aS    # =
//                   ::= cl    # ()
//                   ::= cm    # ,
//                   ::= co    # ~
//                   ::= cv <type>    # (cast)
//                   ::= da    # delete[]
//                   ::= de    # * (unary)
//                   ::= dl    # delete
//                   ::= dv    # /
//                   ::= dV    # /=
//                   ::= eo    # ^
//                   ::= eO    # ^=
//                   ::= eq    # ==
//                   ::= ge    # >=
//                   ::= gt    # >
//                   ::= ix    # []
//                   ::= le    # <=
//                   ::= li <source-name>  # operator ""
//                   ::= ls    # <<
//                   ::= lS    # <<=
//                   ::= lt    # <
//                   ::= mi    # -
//                   ::= mI    # -=
//                   ::= ml    # *
//                   ::= mL    # *=
//                   ::= mm    # -- (postfix in <expression> context)
//                   ::= na    # new[]
//                   ::= ne    # !=
//                   ::= ng    # - (unary)
//                   ::= nt    # !
//                   ::= nw    # new
//                   ::= oo    # ||
//                   ::= or    # |
//                   ::= oR    # |=
//                   ::= pm    # ->*
//                   ::= pl    # +
//                   ::= pL    # +=
//                   ::= pp    # ++ (postfix in <expression> context)
//                   ::= ps    # + (unary)
//                   ::= pt    # ->
//                   ::= qu    # ?
//                   ::= rm    # %
//                   ::= rM    # %=
//                   ::= rs    # >>
//                   ::= rS    # >>=
//                   ::= v <digit> <source-name>        # vendor extended
//                   operator

template <class C>
static const char *parse_operator_name(const char *first, const char *last,
                                       C &db) {
  if (last - first >= 2) {
    switch (first[0]) {
    case 'a':
      switch (first[1]) {
      case 'a':
        db.names.push_back("operator&&");
        first += 2;
        break;
      case 'd':
      case 'n':
        db.names.push_back("operator&");
        first += 2;
        break;
      case 'N':
        db.names.push_back("operator&=");
        first += 2;
        break;
      case 'S':
        db.names.push_back("operator=");
        first += 2;
        break;
      }
      break;
    case 'c':
      switch (first[1]) {
      case 'l':
        db.names.push_back("operator()");
        first += 2;
        break;
      case 'm':
        db.names.push_back("operator,");
        first += 2;
        break;
      case 'o':
        db.names.push_back("operator~");
        first += 2;
        break;
      case 'v': {
        bool try_to_parse_template_args = db.try_to_parse_template_args;
        db.try_to_parse_template_args = false;
        const char *t = parse_type(first + 2, last, db);
        db.try_to_parse_template_args = try_to_parse_template_args;
        if (t != first + 2) {
          if (db.names.empty())
            return first;
          db.names.back().first.insert(0, "operator ");
          db.parsed_ctor_dtor_cv = true;
          first = t;
        }
      } break;
      }
      break;
    case 'd':
      switch (first[1]) {
      case 'a':
        db.names.push_back("operator delete[]");
        first += 2;
        break;
      case 'e':
        db.names.push_back("operator*");
        first += 2;
        break;
      case 'l':
        db.names.push_back("operator delete");
        first += 2;
        break;
      case 'v':
        db.names.push_back("operator/");
        first += 2;
        break;
      case 'V':
        db.names.push_back("operator/=");
        first += 2;
        break;
      }
      break;
    case 'e':
      switch (first[1]) {
      case 'o':
        db.names.push_back("operator^");
        first += 2;
        break;
      case 'O':
        db.names.push_back("operator^=");
        first += 2;
        break;
      case 'q':
        db.names.push_back("operator==");
        first += 2;
        break;
      }
      break;
    case 'g':
      switch (first[1]) {
      case 'e':
        db.names.push_back("operator>=");
        first += 2;
        break;
      case 't':
        db.names.push_back("operator>");
        first += 2;
        break;
      }
      break;
    case 'i':
      if (first[1] == 'x') {
        db.names.push_back("operator[]");
        first += 2;
      }
      break;
    case 'l':
      switch (first[1]) {
      case 'e':
        db.names.push_back("operator<=");
        first += 2;
        break;
      case 'i': {
        const char *t = parse_source_name(first + 2, last, db);
        if (t != first + 2) {
          if (db.names.empty())
            return first;
          db.names.back().first.insert(0, "operator\"\" ");
          first = t;
        }
      } break;
      case 's':
        db.names.push_back("operator<<");
        first += 2;
        break;
      case 'S':
        db.names.push_back("operator<<=");
        first += 2;
        break;
      case 't':
        db.names.push_back("operator<");
        first += 2;
        break;
      }
      break;
    case 'm':
      switch (first[1]) {
      case 'i':
        db.names.push_back("operator-");
        first += 2;
        break;
      case 'I':
        db.names.push_back("operator-=");
        first += 2;
        break;
      case 'l':
        db.names.push_back("operator*");
        first += 2;
        break;
      case 'L':
        db.names.push_back("operator*=");
        first += 2;
        break;
      case 'm':
        db.names.push_back("operator--");
        first += 2;
        break;
      }
      break;
    case 'n':
      switch (first[1]) {
      case 'a':
        db.names.push_back("operator new[]");
        first += 2;
        break;
      case 'e':
        db.names.push_back("operator!=");
        first += 2;
        break;
      case 'g':
        db.names.push_back("operator-");
        first += 2;
        break;
      case 't':
        db.names.push_back("operator!");
        first += 2;
        break;
      case 'w':
        db.names.push_back("operator new");
        first += 2;
        break;
      }
      break;
    case 'o':
      switch (first[1]) {
      case 'o':
        db.names.push_back("operator||");
        first += 2;
        break;
      case 'r':
        db.names.push_back("operator|");
        first += 2;
        break;
      case 'R':
        db.names.push_back("operator|=");
        first += 2;
        break;
      }
      break;
    case 'p':
      switch (first[1]) {
      case 'm':
        db.names.push_back("operator->*");
        first += 2;
        break;
      case 'l':
        db.names.push_back("operator+");
        first += 2;
        break;
      case 'L':
        db.names.push_back("operator+=");
        first += 2;
        break;
      case 'p':
        db.names.push_back("operator++");
        first += 2;
        break;
      case 's':
        db.names.push_back("operator+");
        first += 2;
        break;
      case 't':
        db.names.push_back("operator->");
        first += 2;
        break;
      }
      break;
    case 'q':
      if (first[1] == 'u') {
        db.names.push_back("operator?");
        first += 2;
      }
      break;
    case 'r':
      switch (first[1]) {
      case 'm':
        db.names.push_back("operator%");
        first += 2;
        break;
      case 'M':
        db.names.push_back("operator%=");
        first += 2;
        break;
      case 's':
        db.names.push_back("operator>>");
        first += 2;
        break;
      case 'S':
        db.names.push_back("operator>>=");
        first += 2;
        break;
      }
      break;
    case 'v':
      if (std::isdigit(first[1])) {
        const char *t = parse_source_name(first + 2, last, db);
        if (t != first + 2) {
          if (db.names.empty())
            return first;
          db.names.back().first.insert(0, "operator ");
          first = t;
        }
      }
      break;
    }
  }
  return first;
}

template <class C>
static const char *parse_integer_literal(const char *first, const char *last,
                                         const std::string &lit, C &db) {
  const char *t = parse_number(first, last);
  if (t != first && t != last && *t == 'E') {
    if (lit.size() > 3)
      db.names.push_back("(" + lit + ")");
    else
      db.names.emplace_back();
    if (*first == 'n') {
      db.names.back().first += '-';
      ++first;
    }
    db.names.back().first.append(first, t);
    if (lit.size() <= 3)
      db.names.back().first += lit;
    first = t + 1;
  }
  return first;
}

// <expr-primary> ::= L <type> <value number> E                          #
// integer literal
//                ::= L <type> <value float> E                           #
//                floating literal
//                ::= L <string type> E                                  #
//                string literal
//                ::= L <nullptr type> E                                 #
//                nullptr literal (i.e., "LDnE")
//                ::= L <type> <real-part float> _ <imag-part float> E   #
//                complex floating point literal (C 2000)
//                ::= L <mangled-name> E                                 #
//                external name

template <class C>
static const char *parse_expr_primary(const char *first, const char *last,
                                      C &db) {
  if (last - first >= 4 && *first == 'L') {
    switch (first[1]) {
    case 'w': {
      const char *t = parse_integer_literal(first + 2, last, "wchar_t", db);
      if (t != first + 2)
        first = t;
    } break;
    case 'b':
      if (first[3] == 'E') {
        switch (first[2]) {
        case '0':
          db.names.push_back("false");
          first += 4;
          break;
        case '1':
          db.names.push_back("true");
          first += 4;
          break;
        }
      }
      break;
    case 'c': {
      const char *t = parse_integer_literal(first + 2, last, "char", db);
      if (t != first + 2)
        first = t;
    } break;
    case 'a': {
      const char *t = parse_integer_literal(first + 2, last, "signed char", db);
      if (t != first + 2)
        first = t;
    } break;
    case 'h': {
      const char *t =
          parse_integer_literal(first + 2, last, "unsigned char", db);
      if (t != first + 2)
        first = t;
    } break;
    case 's': {
      const char *t = parse_integer_literal(first + 2, last, "short", db);
      if (t != first + 2)
        first = t;
    } break;
    case 't': {
      const char *t =
          parse_integer_literal(first + 2, last, "unsigned short", db);
      if (t != first + 2)
        first = t;
    } break;
    case 'i': {
      const char *t = parse_integer_literal(first + 2, last, "", db);
      if (t != first + 2)
        first = t;
    } break;
    case 'j': {
      const char *t = parse_integer_literal(first + 2, last, "u", db);
      if (t != first + 2)
        first = t;
    } break;
    case 'l': {
      const char *t = parse_integer_literal(first + 2, last, "l", db);
      if (t != first + 2)
        first = t;
    } break;
    case 'm': {
      const char *t = parse_integer_literal(first + 2, last, "ul", db);
      if (t != first + 2)
        first = t;
    } break;
    case 'x': {
      const char *t = parse_integer_literal(first + 2, last, "ll", db);
      if (t != first + 2)
        first = t;
    } break;
    case 'y': {
      const char *t = parse_integer_literal(first + 2, last, "ull", db);
      if (t != first + 2)
        first = t;
    } break;
    case 'n': {
      const char *t = parse_integer_literal(first + 2, last, "__int128", db);
      if (t != first + 2)
        first = t;
    } break;
    case 'o': {
      const char *t =
          parse_integer_literal(first + 2, last, "unsigned __int128", db);
      if (t != first + 2)
        first = t;
    } break;
    case 'f': {
      const char *t = parse_floating_number<float>(first + 2, last, db);
      if (t != first + 2)
        first = t;
    } break;
    case 'd': {
      const char *t = parse_floating_number<double>(first + 2, last, db);
      if (t != first + 2)
        first = t;
    } break;
    case 'e': {
      const char *t = parse_floating_number<long double>(first + 2, last, db);
      if (t != first + 2)
        first = t;
    } break;
    case '_':
      if (first[2] == 'Z') {
        const char *t = parse_encoding(first + 3, last, db);
        if (t != first + 3 && t != last && *t == 'E')
          first = t + 1;
      }
      break;
    case 'T':
      // Invalid mangled name per
      //   http://sourcerytools.com/pipermail/cxx-abi-dev/2011-August/002422.html
      break;
    default: {
      // might be named type
      const char *t = parse_type(first + 1, last, db);
      if (t != first + 1 && t != last) {
        if (*t != 'E') {
          const char *n = t;
          for (; n != last && isdigit(*n); ++n)
            ;
          if (n != t && n != last && *n == 'E') {
            if (db.names.empty())
              return first;
            db.names.back() =
                "(" + db.names.back().move_full() + ")" + std::string(t, n);
            first = n + 1;
            break;
          }
        } else {
          first = t + 1;
          break;
        }
      }
    }
    }
  }
  return first;
}

static std::string base_name(std::string &s) {
  if (s.empty())
    return s;
  if (s == "std::string") {
    s = "std::basic_string<char, std::char_traits<char>, std::allocator<char> "
        ">";
    return "basic_string";
  }
  if (s == "std::istream") {
    s = "std::basic_istream<char, std::char_traits<char> >";
    return "basic_istream";
  }
  if (s == "std::ostream") {
    s = "std::basic_ostream<char, std::char_traits<char> >";
    return "basic_ostream";
  }
  if (s == "std::iostream") {
    s = "std::basic_iostream<char, std::char_traits<char> >";
    return "basic_iostream";
  }
  const char *const pf = s.data();
  const char *pe = pf + s.size();
  if (pe[-1] == '>') {
    unsigned c = 1;
    while (true) {
      if (--pe == pf)
        return std::string();
      if (pe[-1] == '<') {
        if (--c == 0) {
          --pe;
          break;
        }
      } else if (pe[-1] == '>')
        ++c;
    }
  }
  if (pe - pf <= 1)
    return std::string();
  const char *p0 = pe - 1;
  for (; p0 != pf; --p0) {
    if (*p0 == ':') {
      ++p0;
      break;
    }
  }
  return std::string(p0, pe);
}

// <ctor-dtor-name> ::= C1    # complete object constructor
//                  ::= C2    # base object constructor
//                  ::= C3    # complete object allocating constructor
//   extension      ::= C5    # ?
//                  ::= D0    # deleting destructor
//                  ::= D1    # complete object destructor
//                  ::= D2    # base object destructor
//   extension      ::= D5    # ?

template <class C>
static const char *parse_ctor_dtor_name(const char *first, const char *last,
                                        C &db) {
  if (last - first >= 2 && !db.names.empty()) {
    switch (first[0]) {
    case 'C':
      switch (first[1]) {
      case '1':
      case '2':
      case '3':
      case '5':
        if (db.names.empty())
          return first;
        db.names.push_back(base_name(db.names.back().first));
        first += 2;
        db.parsed_ctor_dtor_cv = true;
        break;
      }
      break;
    case 'D':
      switch (first[1]) {
      case '0':
      case '1':
      case '2':
      case '5':
        if (db.names.empty())
          return first;
        db.names.push_back("~" + base_name(db.names.back().first));
        first += 2;
        db.parsed_ctor_dtor_cv = true;
        break;
      }
      break;
    }
  }
  return first;
}

// <unnamed-type-name> ::= Ut [ <nonnegative number> ] _
//                     ::= <closure-type-name>
//
// <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _
//
// <lambda-sig> ::= <parameter type>+  # Parameter types or "v" if the lambda
// has no parameters

template <class C>
static const char *parse_unnamed_type_name(const char *first, const char *last,
                                           C &db) {
  if (last - first > 2 && first[0] == 'U') {
    char type = first[1];
    switch (type) {
    case 't': {
      db.names.push_back(std::string("'unnamed"));
      const char *t0 = first + 2;
      if (t0 == last) {
        db.names.pop_back();
        return first;
      }
      if (std::isdigit(*t0)) {
        const char *t1 = t0 + 1;
        while (t1 != last && std::isdigit(*t1))
          ++t1;
        db.names.back().first.append(t0, t1);
        t0 = t1;
      }
      db.names.back().first.push_back('\'');
      if (t0 == last || *t0 != '_') {
        db.names.pop_back();
        return first;
      }
      first = t0 + 1;
    } break;
    case 'l': {
      db.names.push_back(std::string("'lambda'("));
      const char *t0 = first + 2;
      if (first[2] == 'v') {
        db.names.back().first += ')';
        ++t0;
      } else {
        const char *t1 = parse_type(t0, last, db);
        if (t1 == t0) {
          if (!db.names.empty())
            db.names.pop_back();
          return first;
        }
        if (db.names.size() < 2)
          return first;
        auto tmp = db.names.back().move_full();
        db.names.pop_back();
        db.names.back().first.append(tmp);
        t0 = t1;
        while (true) {
          t1 = parse_type(t0, last, db);
          if (t1 == t0)
            break;
          if (db.names.size() < 2)
            return first;
          tmp = db.names.back().move_full();
          db.names.pop_back();
          if (!tmp.empty()) {
            db.names.back().first.append(", ");
            db.names.back().first.append(tmp);
          }
          t0 = t1;
        }
        if (db.names.empty())
          return first;
        db.names.back().first.append(")");
      }
      if (t0 == last || *t0 != 'E') {
        if (!db.names.empty())
          db.names.pop_back();
        return first;
      }
      ++t0;
      if (t0 == last) {
        if (!db.names.empty())
          db.names.pop_back();
        return first;
      }
      if (std::isdigit(*t0)) {
        const char *t1 = t0 + 1;
        while (t1 != last && std::isdigit(*t1))
          ++t1;
        db.names.back().first.insert(db.names.back().first.begin() + 7, t0, t1);
        t0 = t1;
      }
      if (t0 == last || *t0 != '_') {
        if (!db.names.empty())
          db.names.pop_back();
        return first;
      }
      first = t0 + 1;
    } break;
    }
  }
  return first;
}

// <unqualified-name> ::= <operator-name>
//                    ::= <ctor-dtor-name>
//                    ::= <source-name>
//                    ::= <unnamed-type-name>

template <class C>
static const char *parse_unqualified_name(const char *first, const char *last,
                                          C &db) {
  if (first != last) {
    const char *t;
    switch (*first) {
    case 'C':
    case 'D':
      t = parse_ctor_dtor_name(first, last, db);
      if (t != first)
        first = t;
      break;
    case 'U':
      t = parse_unnamed_type_name(first, last, db);
      if (t != first)
        first = t;
      break;
    case '1':
    case '2':
    case '3':
    case '4':
    case '5':
    case '6':
    case '7':
    case '8':
    case '9':
      t = parse_source_name(first, last, db);
      if (t != first)
        first = t;
      break;
    default:
      t = parse_operator_name(first, last, db);
      if (t != first)
        first = t;
      break;
    };
  }
  return first;
}

// <unscoped-name> ::= <unqualified-name>
//                 ::= St <unqualified-name>   # ::std::
// extension       ::= StL<unqualified-name>

template <class C>
static const char *parse_unscoped_name(const char *first, const char *last,
                                       C &db) {
  if (last - first >= 2) {
    const char *t0 = first;
    bool St = false;
    if (first[0] == 'S' && first[1] == 't') {
      t0 += 2;
      St = true;
      if (t0 != last && *t0 == 'L')
        ++t0;
    }
    const char *t1 = parse_unqualified_name(t0, last, db);
    if (t1 != t0) {
      if (St) {
        if (db.names.empty())
          return first;
        db.names.back().first.insert(0, "std::");
      }
      first = t1;
    }
  }
  return first;
}

// at <type>                                            # alignof (a type)

template <class C>
static const char *parse_alignof_type(const char *first, const char *last,
                                      C &db) {
  if (last - first >= 3 && first[0] == 'a' && first[1] == 't') {
    const char *t = parse_type(first + 2, last, db);
    if (t != first + 2) {
      if (db.names.empty())
        return first;
      db.names.back().first = "alignof (" + db.names.back().move_full() + ")";
      first = t;
    }
  }
  return first;
}

// az <expression>                                            # alignof (a
// expression)

template <class C>
static const char *parse_alignof_expr(const char *first, const char *last,
                                      C &db) {
  if (last - first >= 3 && first[0] == 'a' && first[1] == 'z') {
    const char *t = parse_expression(first + 2, last, db);
    if (t != first + 2) {
      if (db.names.empty())
        return first;
      db.names.back().first = "alignof (" + db.names.back().move_full() + ")";
      first = t;
    }
  }
  return first;
}

template <class C>
static const char *parse_noexcept_expression(const char *first,
                                             const char *last, C &db) {
  const char *t1 = parse_expression(first, last, db);
  if (t1 != first) {
    if (db.names.empty())
      return first;
    db.names.back().first = "noexcept (" + db.names.back().move_full() + ")";
    first = t1;
  }
  return first;
}

template <class C>
static const char *parse_prefix_expression(const char *first, const char *last,
                                           const std::string &op,
                                           C &db) {
  const char *t1 = parse_expression(first, last, db);
  if (t1 != first) {
    if (db.names.empty())
      return first;
    db.names.back().first = op + "(" + db.names.back().move_full() + ")";
    first = t1;
  }
  return first;
}

template <class C>
static const char *parse_binary_expression(const char *first, const char *last,
                                           const std::string &op,
                                           C &db) {
  const char *t1 = parse_expression(first, last, db);
  if (t1 != first) {
    const char *t2 = parse_expression(t1, last, db);
    if (t2 != t1) {
      if (db.names.size() < 2)
        return first;
      auto op2 = db.names.back().move_full();
      db.names.pop_back();
      auto op1 = db.names.back().move_full();
      auto &nm = db.names.back().first;
      nm.clear();
      if (op == ">")
        nm += '(';
      nm += "(" + op1 + ") " + op + " (" + op2 + ")";
      if (op == ">")
        nm += ')';
      first = t2;
    } else if (!db.names.empty())
      db.names.pop_back();
  }
  return first;
}

// <expression> ::= <unary operator-name> <expression>
//              ::= <binary operator-name> <expression> <expression>
//              ::= <ternary operator-name> <expression> <expression>
//              <expression>
//              ::= cl <expression>+ E                                   # call
//              ::= cv <type> <expression>                               #
//              conversion with one argument
//              ::= cv <type> _ <expression>* E                          #
//              conversion with a different number of arguments
//              ::= [gs] nw <expression>* _ <type> E                     # new
//              (expr-list) type
//              ::= [gs] nw <expression>* _ <type> <initializer>         # new
//              (expr-list) type (init)
//              ::= [gs] na <expression>* _ <type> E                     # new[]
//              (expr-list) type
//              ::= [gs] na <expression>* _ <type> <initializer>         # new[]
//              (expr-list) type (init)
//              ::= [gs] dl <expression>                                 #
//              delete expression
//              ::= [gs] da <expression>                                 #
//              delete[] expression
//              ::= pp_ <expression>                                     #
//              prefix ++
//              ::= mm_ <expression>                                     #
//              prefix --
//              ::= ti <type>                                            #
//              typeid (type)
//              ::= te <expression>                                      #
//              typeid (expression)
//              ::= dc <type> <expression>                               #
//              dynamic_cast<type> (expression)
//              ::= sc <type> <expression>                               #
//              static_cast<type> (expression)
//              ::= cc <type> <expression>                               #
//              const_cast<type> (expression)
//              ::= rc <type> <expression>                               #
//              reinterpret_cast<type> (expression)
//              ::= st <type>                                            #
//              sizeof (a type)
//              ::= sz <expression>                                      #
//              sizeof (an expression)
//              ::= at <type>                                            #
//              alignof (a type)
//              ::= az <expression>                                      #
//              alignof (an expression)
//              ::= nx <expression>                                      #
//              noexcept (expression)
//              ::= <template-param>
//              ::= <function-param>
//              ::= dt <expression> <unresolved-name>                    #
//              expr.name
//              ::= pt <expression> <unresolved-name>                    #
//              expr->name
//              ::= ds <expression> <expression>                         #
//              expr.*expr
//              ::= sZ <template-param>                                  # size
//              of a parameter pack
//              ::= sZ <function-param>                                  # size
//              of a function parameter pack
//              ::= sp <expression>                                      # pack
//              expansion
//              ::= tw <expression>                                      # throw
//              expression
//              ::= tr                                                   # throw
//              with no operand (rethrow)
//              ::= <unresolved-name>                                    # f(p),
//              N::f(p), ::f(p),
//                                                                       #
//                                                                       freestanding
//                                                                       dependent
//                                                                       name
//                                                                       (e.g.,
//                                                                       T::x),
//                                                                       #
//                                                                       objectless
//                                                                       nonstatic
//                                                                       member
//                                                                       reference
//              ::= <expr-primary>

template <class C>
static const char *parse_expression(const char *first, const char *last,
                                    C &db) {
  if (last - first >= 2) {
    const char *t = first;
    bool parsed_gs = false;
    if (last - first >= 4 && t[0] == 'g' && t[1] == 's') {
      t += 2;
      parsed_gs = true;
    }
    switch (*t) {
    case 'L':
      first = parse_expr_primary(first, last, db);
      break;
    case 'T':
      first = parse_template_param(first, last, db);
      break;
    case 'f':
      first = parse_function_param(first, last, db);
      break;
    case 'a':
      switch (t[1]) {
      case 'a':
        t = parse_binary_expression(first + 2, last, "&&", db);
        if (t != first + 2)
          first = t;
        break;
      case 'd':
        t = parse_prefix_expression(first + 2, last, "&", db);
        if (t != first + 2)
          first = t;
        break;
      case 'n':
        t = parse_binary_expression(first + 2, last, "&", db);
        if (t != first + 2)
          first = t;
        break;
      case 'N':
        t = parse_binary_expression(first + 2, last, "&=", db);
        if (t != first + 2)
          first = t;
        break;
      case 'S':
        t = parse_binary_expression(first + 2, last, "=", db);
        if (t != first + 2)
          first = t;
        break;
      case 't':
        first = parse_alignof_type(first, last, db);
        break;
      case 'z':
        first = parse_alignof_expr(first, last, db);
        break;
      }
      break;
    case 'c':
      switch (t[1]) {
      case 'c':
        first = parse_const_cast_expr(first, last, db);
        break;
      case 'l':
        first = parse_call_expr(first, last, db);
        break;
      case 'm':
        t = parse_binary_expression(first + 2, last, ",", db);
        if (t != first + 2)
          first = t;
        break;
      case 'o':
        t = parse_prefix_expression(first + 2, last, "~", db);
        if (t != first + 2)
          first = t;
        break;
      case 'v':
        first = parse_conversion_expr(first, last, db);
        break;
      }
      break;
    case 'd':
      switch (t[1]) {
      case 'a': {
        const char *t1 = parse_expression(t + 2, last, db);
        if (t1 != t + 2) {
          if (db.names.empty())
            return first;
          db.names.back().first =
              (parsed_gs ? std::string("::") : std::string()) + "delete[] " +
              db.names.back().move_full();
          first = t1;
        }
      } break;
      case 'c':
        first = parse_dynamic_cast_expr(first, last, db);
        break;
      case 'e':
        t = parse_prefix_expression(first + 2, last, "*", db);
        if (t != first + 2)
          first = t;
        break;
      case 'l': {
        const char *t1 = parse_expression(t + 2, last, db);
        if (t1 != t + 2) {
          if (db.names.empty())
            return first;
          db.names.back().first =
              (parsed_gs ? std::string("::") : std::string()) + "delete " +
              db.names.back().move_full();
          first = t1;
        }
      } break;
      case 'n':
        return parse_unresolved_name(first, last, db);
      case 's':
        first = parse_dot_star_expr(first, last, db);
        break;
      case 't':
        first = parse_dot_expr(first, last, db);
        break;
      case 'v':
        t = parse_binary_expression(first + 2, last, "/", db);
        if (t != first + 2)
          first = t;
        break;
      case 'V':
        t = parse_binary_expression(first + 2, last, "/=", db);
        if (t != first + 2)
          first = t;
        break;
      }
      break;
    case 'e':
      switch (t[1]) {
      case 'o':
        t = parse_binary_expression(first + 2, last, "^", db);
        if (t != first + 2)
          first = t;
        break;
      case 'O':
        t = parse_binary_expression(first + 2, last, "^=", db);
        if (t != first + 2)
          first = t;
        break;
      case 'q':
        t = parse_binary_expression(first + 2, last, "==", db);
        if (t != first + 2)
          first = t;
        break;
      }
      break;
    case 'g':
      switch (t[1]) {
      case 'e':
        t = parse_binary_expression(first + 2, last, ">=", db);
        if (t != first + 2)
          first = t;
        break;
      case 't':
        t = parse_binary_expression(first + 2, last, ">", db);
        if (t != first + 2)
          first = t;
        break;
      }
      break;
    case 'i':
      if (t[1] == 'x') {
        const char *t1 = parse_expression(first + 2, last, db);
        if (t1 != first + 2) {
          const char *t2 = parse_expression(t1, last, db);
          if (t2 != t1) {
            if (db.names.size() < 2)
              return first;
            auto op2 = db.names.back().move_full();
            db.names.pop_back();
            auto op1 = db.names.back().move_full();
            db.names.back() = "(" + op1 + ")[" + op2 + "]";
            first = t2;
          } else if (!db.names.empty())
            db.names.pop_back();
        }
      }
      break;
    case 'l':
      switch (t[1]) {
      case 'e':
        t = parse_binary_expression(first + 2, last, "<=", db);
        if (t != first + 2)
          first = t;
        break;
      case 's':
        t = parse_binary_expression(first + 2, last, "<<", db);
        if (t != first + 2)
          first = t;
        break;
      case 'S':
        t = parse_binary_expression(first + 2, last, "<<=", db);
        if (t != first + 2)
          first = t;
        break;
      case 't':
        t = parse_binary_expression(first + 2, last, "<", db);
        if (t != first + 2)
          first = t;
        break;
      }
      break;
    case 'm':
      switch (t[1]) {
      case 'i':
        t = parse_binary_expression(first + 2, last, "-", db);
        if (t != first + 2)
          first = t;
        break;
      case 'I':
        t = parse_binary_expression(first + 2, last, "-=", db);
        if (t != first + 2)
          first = t;
        break;
      case 'l':
        t = parse_binary_expression(first + 2, last, "*", db);
        if (t != first + 2)
          first = t;
        break;
      case 'L':
        t = parse_binary_expression(first + 2, last, "*=", db);
        if (t != first + 2)
          first = t;
        break;
      case 'm':
        if (first + 2 != last && first[2] == '_') {
          t = parse_prefix_expression(first + 3, last, "--", db);
          if (t != first + 3)
            first = t;
        } else {
          const char *t1 = parse_expression(first + 2, last, db);
          if (t1 != first + 2) {
            if (db.names.empty())
              return first;
            db.names.back() = "(" + db.names.back().move_full() + ")--";
            first = t1;
          }
        }
        break;
      }
      break;
    case 'n':
      switch (t[1]) {
      case 'a':
      case 'w':
        first = parse_new_expr(first, last, db);
        break;
      case 'e':
        t = parse_binary_expression(first + 2, last, "!=", db);
        if (t != first + 2)
          first = t;
        break;
      case 'g':
        t = parse_prefix_expression(first + 2, last, "-", db);
        if (t != first + 2)
          first = t;
        break;
      case 't':
        t = parse_prefix_expression(first + 2, last, "!", db);
        if (t != first + 2)
          first = t;
        break;
      case 'x':
        t = parse_noexcept_expression(first + 2, last, db);
        if (t != first + 2)
          first = t;
        break;
      }
      break;
    case 'o':
      switch (t[1]) {
      case 'n':
        return parse_unresolved_name(first, last, db);
      case 'o':
        t = parse_binary_expression(first + 2, last, "||", db);
        if (t != first + 2)
          first = t;
        break;
      case 'r':
        t = parse_binary_expression(first + 2, last, "|", db);
        if (t != first + 2)
          first = t;
        break;
      case 'R':
        t = parse_binary_expression(first + 2, last, "|=", db);
        if (t != first + 2)
          first = t;
        break;
      }
      break;
    case 'p':
      switch (t[1]) {
      case 'm':
        t = parse_binary_expression(first + 2, last, "->*", db);
        if (t != first + 2)
          first = t;
        break;
      case 'l':
        t = parse_binary_expression(first + 2, last, "+", db);
        if (t != first + 2)
          first = t;
        break;
      case 'L':
        t = parse_binary_expression(first + 2, last, "+=", db);
        if (t != first + 2)
          first = t;
        break;
      case 'p':
        if (first + 2 != last && first[2] == '_') {
          t = parse_prefix_expression(first + 3, last, "++", db);
          if (t != first + 3)
            first = t;
        } else {
          const char *t1 = parse_expression(first + 2, last, db);
          if (t1 != first + 2) {
            if (db.names.empty())
              return first;
            db.names.back() = "(" + db.names.back().move_full() + ")++";
            first = t1;
          }
        }
        break;
      case 's':
        t = parse_prefix_expression(first + 2, last, "+", db);
        if (t != first + 2)
          first = t;
        break;
      case 't':
        first = parse_arrow_expr(first, last, db);
        break;
      }
      break;
    case 'q':
      if (t[1] == 'u') {
        const char *t1 = parse_expression(first + 2, last, db);
        if (t1 != first + 2) {
          const char *t2 = parse_expression(t1, last, db);
          if (t2 != t1) {
            const char *t3 = parse_expression(t2, last, db);
            if (t3 != t2) {
              if (db.names.size() < 3)
                return first;
              auto op3 = db.names.back().move_full();
              db.names.pop_back();
              auto op2 = db.names.back().move_full();
              db.names.pop_back();
              auto op1 = db.names.back().move_full();
              db.names.back() = "(" + op1 + ") ? (" + op2 + ") : (" + op3 + ")";
              first = t3;
            } else {
              if (db.names.size() < 2)
                return first;
              db.names.pop_back();
              db.names.pop_back();
            }
          } else if (!db.names.empty())
            db.names.pop_back();
        }
      }
      break;
    case 'r':
      switch (t[1]) {
      case 'c':
        first = parse_reinterpret_cast_expr(first, last, db);
        break;
      case 'm':
        t = parse_binary_expression(first + 2, last, "%", db);
        if (t != first + 2)
          first = t;
        break;
      case 'M':
        t = parse_binary_expression(first + 2, last, "%=", db);
        if (t != first + 2)
          first = t;
        break;
      case 's':
        t = parse_binary_expression(first + 2, last, ">>", db);
        if (t != first + 2)
          first = t;
        break;
      case 'S':
        t = parse_binary_expression(first + 2, last, ">>=", db);
        if (t != first + 2)
          first = t;
        break;
      }
      break;
    case 's':
      switch (t[1]) {
      case 'c':
        first = parse_static_cast_expr(first, last, db);
        break;
      case 'p':
        first = parse_pack_expansion(first, last, db);
        break;
      case 'r':
        return parse_unresolved_name(first, last, db);
      case 't':
        first = parse_sizeof_type_expr(first, last, db);
        break;
      case 'z':
        first = parse_sizeof_expr_expr(first, last, db);
        break;
      case 'Z':
        if (last - t >= 3) {
          switch (t[2]) {
          case 'T':
            first = parse_sizeof_param_pack_expr(first, last, db);
            break;
          case 'f':
            first = parse_sizeof_function_param_pack_expr(first, last, db);
            break;
          }
        }
        break;
      }
      break;
    case 't':
      switch (t[1]) {
      case 'e':
      case 'i':
        first = parse_typeid_expr(first, last, db);
        break;
      case 'r':
        db.names.push_back("throw");
        first += 2;
        break;
      case 'w':
        first = parse_throw_expr(first, last, db);
        break;
      }
      break;
    case '1':
    case '2':
    case '3':
    case '4':
    case '5':
    case '6':
    case '7':
    case '8':
    case '9':
      return parse_unresolved_name(first, last, db);
    }
  }
  return first;
}

// <template-arg> ::= <type>                                             # type
// or template
//                ::= X <expression> E                                   #
//                expression
//                ::= <expr-primary>                                     #
//                simple expressions
//                ::= J <template-arg>* E                                #
//                argument pack
//                ::= LZ <encoding> E                                    #
//                extension

template <class C>
static const char *parse_template_arg(const char *first, const char *last,
                                      C &db) {
  if (first != last) {
    const char *t;
    switch (*first) {
    case 'X':
      t = parse_expression(first + 1, last, db);
      if (t != first + 1) {
        if (t != last && *t == 'E')
          first = t + 1;
      }
      break;
    case 'J':
      t = first + 1;
      if (t == last)
        return first;
      while (*t != 'E') {
        const char *t1 = parse_template_arg(t, last, db);
        if (t1 == t)
          return first;
        t = t1;
      }
      first = t + 1;
      break;
    case 'L':
      // <expr-primary> or LZ <encoding> E
      if (first + 1 != last && first[1] == 'Z') {
        t = parse_encoding(first + 2, last, db);
        if (t != first + 2 && t != last && *t == 'E')
          first = t + 1;
      } else
        first = parse_expr_primary(first, last, db);
      break;
    default:
      // <type>
      first = parse_type(first, last, db);
      break;
    }
  }
  return first;
}

// <template-args> ::= I <template-arg>* E
//     extension, the abi says <template-arg>+

template <class C>
static const char *parse_template_args(const char *first, const char *last,
                                       C &db) {
  if (last - first >= 2 && *first == 'I') {
    if (db.tag_templates)
      db.template_param.back().clear();
    const char *t = first + 1;
    std::string args("<");
    while (*t != 'E') {
      if (db.tag_templates)
        db.template_param.emplace_back();
      size_t k0 = db.names.size();
      const char *t1 = parse_template_arg(t, last, db);
      size_t k1 = db.names.size();
      if (db.tag_templates)
        db.template_param.pop_back();
      if (t1 == t || t1 == last)
        return first;
      if (db.tag_templates) {
        db.template_param.back().emplace_back();
        for (size_t k = k0; k < k1; ++k)
          db.template_param.back().back().push_back(db.names[k]);
      }
      for (size_t k = k0; k < k1; ++k) {
        if (args.size() > 1)
          args += ", ";
        args += db.names[k].move_full();
      }
      for (; k1 > k0; --k1)
        if (!db.names.empty())
          db.names.pop_back();
      t = t1;
    }
    first = t + 1;
    if (args.back() != '>')
      args += ">";
    else
      args += " >";
    db.names.push_back(std::move(args));
  }
  return first;
}

// <nested-name> ::= N [<CV-qualifiers>] [<ref-qualifier>] <prefix>
// <unqualified-name> E
//               ::= N [<CV-qualifiers>] [<ref-qualifier>] <template-prefix>
//               <template-args> E
//
// <prefix> ::= <prefix> <unqualified-name>
//          ::= <template-prefix> <template-args>
//          ::= <template-param>
//          ::= <decltype>
//          ::= # empty
//          ::= <substitution>
//          ::= <prefix> <data-member-prefix>
//  extension ::= L
//
// <template-prefix> ::= <prefix> <template unqualified-name>
//                   ::= <template-param>
//                   ::= <substitution>

template <class C>
static const char *parse_nested_name(const char *first, const char *last, C &db,
                                     bool *ends_with_template_args) {
  if (first != last && *first == 'N') {
    unsigned cv;
    const char *t0 = parse_cv_qualifiers(first + 1, last, cv);
    if (t0 == last)
      return first;
    db.ref = 0;
    if (*t0 == 'R') {
      db.ref = 1;
      ++t0;
    } else if (*t0 == 'O') {
      db.ref = 2;
      ++t0;
    }
    db.names.emplace_back();
    if (last - t0 >= 2 && t0[0] == 'S' && t0[1] == 't') {
      t0 += 2;
      db.names.back().first = "std";
    }
    if (t0 == last) {
      db.names.pop_back();
      return first;
    }
    bool pop_subs = false;
    bool component_ends_with_template_args = false;
    while (*t0 != 'E') {
      component_ends_with_template_args = false;
      const char *t1;
      switch (*t0) {
      case 'S':
        if (t0 + 1 != last && t0[1] == 't')
          goto do_parse_unqualified_name;
        t1 = parse_substitution(t0, last, db);
        if (t1 != t0 && t1 != last) {
          auto name = db.names.back().move_full();
          db.names.pop_back();
          if (db.names.empty())
            return first;
          if (!db.names.back().first.empty()) {
            db.names.back().first += "::" + name;
            db.subs.push_back(typename C::sub_type(1, db.names.back()));
          } else
            db.names.back().first = name;
          pop_subs = true;
          t0 = t1;
        } else
          return first;
        break;
      case 'T':
        t1 = parse_template_param(t0, last, db);
        if (t1 != t0 && t1 != last) {
          auto name = db.names.back().move_full();
          db.names.pop_back();
          if (db.names.empty())
            return first;
          if (!db.names.back().first.empty())
            db.names.back().first += "::" + name;
          else
            db.names.back().first = name;
          db.subs.push_back(typename C::sub_type(1, db.names.back()));
          pop_subs = true;
          t0 = t1;
        } else
          return first;
        break;
      case 'D':
        if (t0 + 1 != last && t0[1] != 't' && t0[1] != 'T')
          goto do_parse_unqualified_name;
        t1 = parse_decltype(t0, last, db);
        if (t1 != t0 && t1 != last) {
          auto name = db.names.back().move_full();
          db.names.pop_back();
          if (db.names.empty())
            return first;
          if (!db.names.back().first.empty())
            db.names.back().first += "::" + name;
          else
            db.names.back().first = name;
          db.subs.push_back(typename C::sub_type(1, db.names.back()));
          pop_subs = true;
          t0 = t1;
        } else
          return first;
        break;
      case 'I':
        t1 = parse_template_args(t0, last, db);
        if (t1 != t0 && t1 != last) {
          auto name = db.names.back().move_full();
          db.names.pop_back();
          if (db.names.empty())
            return first;
          db.names.back().first += name;
          db.subs.push_back(typename C::sub_type(1, db.names.back()));
          t0 = t1;
          component_ends_with_template_args = true;
        } else
          return first;
        break;
      case 'L':
        if (++t0 == last)
          return first;
        break;
      default:
      do_parse_unqualified_name:
        t1 = parse_unqualified_name(t0, last, db);
        if (t1 != t0 && t1 != last) {
          auto name = db.names.back().move_full();
          db.names.pop_back();
          if (db.names.empty())
            return first;
          if (!db.names.back().first.empty())
            db.names.back().first += "::" + name;
          else
            db.names.back().first = name;
          db.subs.push_back(typename C::sub_type(1, db.names.back()));
          pop_subs = true;
          t0 = t1;
        } else
          return first;
      }
    }
    first = t0 + 1;
    db.cv = cv;
    if (pop_subs && !db.subs.empty())
      db.subs.pop_back();
    if (ends_with_template_args)
      *ends_with_template_args = component_ends_with_template_args;
  }
  return first;
}

// <discriminator> := _ <non-negative number>      # when number < 10
//                 := __ <non-negative number> _   # when number >= 10
//  extension      := decimal-digit+               # at the end of string

static const char *parse_discriminator(const char *first, const char *last) {
  // parse but ignore discriminator
  if (first != last) {
    if (*first == '_') {
      const char *t1 = first + 1;
      if (t1 != last) {
        if (std::isdigit(*t1))
          first = t1 + 1;
        else if (*t1 == '_') {
          for (++t1; t1 != last && std::isdigit(*t1); ++t1)
            ;
          if (t1 != last && *t1 == '_')
            first = t1 + 1;
        }
      }
    } else if (std::isdigit(*first)) {
      const char *t1 = first + 1;
      for (; t1 != last && std::isdigit(*t1); ++t1)
        ;
      if (t1 == last)
        first = last;
    }
  }
  return first;
}

// <local-name> := Z <function encoding> E <entity name> [<discriminator>]
//              := Z <function encoding> E s [<discriminator>]
//              := Z <function encoding> Ed [ <parameter number> ] _ <entity
//              name>

template <class C>
static const char *parse_local_name(const char *first, const char *last, C &db,
                                    bool *ends_with_template_args) {
  if (first != last && *first == 'Z') {
    const char *t = parse_encoding(first + 1, last, db);
    if (t != first + 1 && t != last && *t == 'E' && ++t != last) {
      switch (*t) {
      case 's':
        first = parse_discriminator(t + 1, last);
        if (db.names.empty())
          return first;
        db.names.back().first.append("::string literal");
        break;
      case 'd':
        if (++t != last) {
          const char *t1 = parse_number(t, last);
          if (t1 != last && *t1 == '_') {
            t = t1 + 1;
            t1 = parse_name(t, last, db, ends_with_template_args);
            if (t1 != t) {
              if (db.names.size() < 2)
                return first;
              auto name = db.names.back().move_full();
              db.names.pop_back();
              if (db.names.empty())
                return first;
              db.names.back().first.append("::");
              db.names.back().first.append(name);
              first = t1;
            } else if (!db.names.empty())
              db.names.pop_back();
          }
        }
        break;
      default: {
        const char *t1 = parse_name(t, last, db, ends_with_template_args);
        if (t1 != t) {
          // parse but ignore discriminator
          first = parse_discriminator(t1, last);
          if (db.names.size() < 2)
            return first;
          auto name = db.names.back().move_full();
          db.names.pop_back();
          if (db.names.empty())
            return first;
          db.names.back().first.append("::");
          db.names.back().first.append(name);
        } else if (!db.names.empty())
          db.names.pop_back();
      } break;
      }
    }
  }
  return first;
}

// <name> ::= <nested-name> // N
//        ::= <local-name> # See Scope Encoding below  // Z
//        ::= <unscoped-template-name> <template-args>
//        ::= <unscoped-name>

// <unscoped-template-name> ::= <unscoped-name>
//                          ::= <substitution>

template <class C>
static const char *parse_name(const char *first, const char *last, C &db,
                              bool *ends_with_template_args) {
  if (last - first >= 2) {
    const char *t0 = first;
    // extension: ignore L here
    if (*t0 == 'L')
      ++t0;
    switch (*t0) {
    case 'N': {
      const char *t1 = parse_nested_name(t0, last, db, ends_with_template_args);
      if (t1 != t0)
        first = t1;
      break;
    }
    case 'Z': {
      const char *t1 = parse_local_name(t0, last, db, ends_with_template_args);
      if (t1 != t0)
        first = t1;
      break;
    }
    default: {
      const char *t1 = parse_unscoped_name(t0, last, db);
      if (t1 != t0) {
        if (t1 != last &&
            *t1 == 'I') // <unscoped-template-name> <template-args>
        {
          if (db.names.empty())
            return first;
          db.subs.push_back(typename C::sub_type(1, db.names.back()));
          t0 = t1;
          t1 = parse_template_args(t0, last, db);
          if (t1 != t0) {
            if (db.names.size() < 2)
              return first;
            auto tmp = db.names.back().move_full();
            db.names.pop_back();
            if (db.names.empty())
              return first;
            db.names.back().first += tmp;
            first = t1;
            if (ends_with_template_args)
              *ends_with_template_args = true;
          }
        } else // <unscoped-name>
          first = t1;
      } else { // try <substitution> <template-args>
        t1 = parse_substitution(t0, last, db);
        if (t1 != t0 && t1 != last && *t1 == 'I') {
          t0 = t1;
          t1 = parse_template_args(t0, last, db);
          if (t1 != t0) {
            if (db.names.size() < 2)
              return first;
            auto tmp = db.names.back().move_full();
            db.names.pop_back();
            if (db.names.empty())
              return first;
            db.names.back().first += tmp;
            first = t1;
            if (ends_with_template_args)
              *ends_with_template_args = true;
          }
        }
      }
      break;
    }
    }
  }
  return first;
}

// <call-offset> ::= h <nv-offset> _
//               ::= v <v-offset> _
//
// <nv-offset> ::= <offset number>
//               # non-virtual base override
//
// <v-offset>  ::= <offset number> _ <virtual offset number>
//               # virtual base override, with vcall offset

static const char *parse_call_offset(const char *first, const char *last) {
  if (first != last) {
    switch (*first) {
    case 'h': {
      const char *t = parse_number(first + 1, last);
      if (t != first + 1 && t != last && *t == '_')
        first = t + 1;
    } break;
    case 'v': {
      const char *t = parse_number(first + 1, last);
      if (t != first + 1 && t != last && *t == '_') {
        const char *t2 = parse_number(++t, last);
        if (t2 != t && t2 != last && *t2 == '_')
          first = t2 + 1;
      }
    } break;
    }
  }
  return first;
}

// <special-name> ::= TV <type>    # virtual table
//                ::= TT <type>    # VTT structure (construction vtable index)
//                ::= TI <type>    # typeinfo structure
//                ::= TS <type>    # typeinfo name (null-terminated byte string)
//                ::= Tc <call-offset> <call-offset> <base encoding>
//                    # base is the nominal target function of thunk
//                    # first call-offset is 'this' adjustment
//                    # second call-offset is result adjustment
//                ::= T <call-offset> <base encoding>
//                    # base is the nominal target function of thunk
//                ::= GV <object name> # Guard variable for one-time
//                initialization
//                                     # No <type>
//      extension ::= TC <first type> <number> _ <second type> # construction
//      vtable for second-in-first
//      extension ::= GR <object name> # reference temporary for object

template <class C>
static const char *parse_special_name(const char *first, const char *last,
                                      C &db) {
  if (last - first > 2) {
    const char *t;
    switch (*first) {
    case 'T':
      switch (first[1]) {
      case 'V':
        // TV <type>    # virtual table
        t = parse_type(first + 2, last, db);
        if (t != first + 2) {
          if (db.names.empty())
            return first;
          db.names.back().first.insert(0, "vtable for ");
          first = t;
        }
        break;
      case 'T':
        // TT <type>    # VTT structure (construction vtable index)
        t = parse_type(first + 2, last, db);
        if (t != first + 2) {
          if (db.names.empty())
            return first;
          db.names.back().first.insert(0, "VTT for ");
          first = t;
        }
        break;
      case 'I':
        // TI <type>    # typeinfo structure
        t = parse_type(first + 2, last, db);
        if (t != first + 2) {
          if (db.names.empty())
            return first;
          db.names.back().first.insert(0, "typeinfo for ");
          first = t;
        }
        break;
      case 'S':
        // TS <type>    # typeinfo name (null-terminated byte string)
        t = parse_type(first + 2, last, db);
        if (t != first + 2) {
          if (db.names.empty())
            return first;
          db.names.back().first.insert(0, "typeinfo name for ");
          first = t;
        }
        break;
      case 'c':
        // Tc <call-offset> <call-offset> <base encoding>
        {
          const char *t0 = parse_call_offset(first + 2, last);
          if (t0 == first + 2)
            break;
          const char *t1 = parse_call_offset(t0, last);
          if (t1 == t0)
            break;
          t = parse_encoding(t1, last, db);
          if (t != t1) {
            if (db.names.empty())
              return first;
            db.names.back().first.insert(0, "covariant return thunk to ");
            first = t;
          }
        }
        break;
      case 'C':
        // extension ::= TC <first type> <number> _ <second type> # construction
        // vtable for second-in-first
        t = parse_type(first + 2, last, db);
        if (t != first + 2) {
          const char *t0 = parse_number(t, last);
          if (t0 != t && t0 != last && *t0 == '_') {
            const char *t1 = parse_type(++t0, last, db);
            if (t1 != t0) {
              if (db.names.size() < 2)
                return first;
              auto left = db.names.back().move_full();
              db.names.pop_back();
              if (db.names.empty())
                return first;
              db.names.back().first = "construction vtable for " +
                                      std::move(left) + "-in-" +
                                      db.names.back().move_full();
              first = t1;
            }
          }
        }
        break;
      default:
        // T <call-offset> <base encoding>
        {
          const char *t0 = parse_call_offset(first + 1, last);
          if (t0 == first + 1)
            break;
          t = parse_encoding(t0, last, db);
          if (t != t0) {
            if (db.names.empty())
              return first;
            if (first[1] == 'v') {
              db.names.back().first.insert(0, "virtual thunk to ");
              first = t;
            } else {
              db.names.back().first.insert(0, "non-virtual thunk to ");
              first = t;
            }
          }
        }
        break;
      }
      break;
    case 'G':
      switch (first[1]) {
      case 'V':
        // GV <object name> # Guard variable for one-time initialization
        t = parse_name(first + 2, last, db);
        if (t != first + 2) {
          if (db.names.empty())
            return first;
          db.names.back().first.insert(0, "guard variable for ");
          first = t;
        }
        break;
      case 'R':
        // extension ::= GR <object name> # reference temporary for object
        t = parse_name(first + 2, last, db);
        if (t != first + 2) {
          if (db.names.empty())
            return first;
          db.names.back().first.insert(0, "reference temporary for ");
          first = t;
        }
        break;
      }
      break;
    }
  }
  return first;
}

namespace {
template <class T> class save_value {
  T &restore_;
  T original_value_;

public:
  save_value(T &restore) : restore_(restore), original_value_(restore) {}

  ~save_value() { restore_ = std::move(original_value_); }

  save_value(const save_value &) = delete;
  save_value &operator=(const save_value &) = delete;
};
}

// <encoding> ::= <function name> <bare-function-type>
//            ::= <data name>
//            ::= <special-name>

template <class C>
static const char *parse_encoding(const char *first, const char *last, C &db) {
  if (first != last) {
    save_value<decltype(db.encoding_depth)> su(db.encoding_depth);
    ++db.encoding_depth;
    save_value<decltype(db.tag_templates)> sb(db.tag_templates);
    if (db.encoding_depth > 1)
      db.tag_templates = true;
    switch (*first) {
    case 'G':
    case 'T':
      first = parse_special_name(first, last, db);
      break;
    default: {
      bool ends_with_template_args = false;
      const char *t = parse_name(first, last, db, &ends_with_template_args);
      unsigned cv = db.cv;
      unsigned ref = db.ref;
      if (t != first) {
        if (t != last && *t != 'E' && *t != '.') {
          save_value<bool> sb2(db.tag_templates);
          db.tag_templates = false;
          const char *t2;
          std::string ret2;
          if (db.names.empty())
            return first;
          const std::string &nm = db.names.back().first;
          if (nm.empty())
            return first;
          if (!db.parsed_ctor_dtor_cv && ends_with_template_args) {
            t2 = parse_type(t, last, db);
            if (t2 == t)
              return first;
            if (db.names.size() < 2)
              return first;
            auto ret1 = std::move(db.names.back().first);
            ret2 = std::move(db.names.back().second);
            if (ret2.empty())
              ret1 += ' ';
            db.names.pop_back();
            if (db.names.empty())
              return first;

            db.names.back().first.insert(0, ret1);
            t = t2;
          }
          db.names.back().first += '(';
          if (t != last && *t == 'v') {
            ++t;
          } else {
            bool first_arg = true;
            while (true) {
              size_t k0 = db.names.size();
              t2 = parse_type(t, last, db);
              size_t k1 = db.names.size();
              if (t2 == t)
                break;
              if (k1 > k0) {
                std::string tmp;
                for (size_t k = k0; k < k1; ++k) {
                  if (!tmp.empty())
                    tmp += ", ";
                  tmp += db.names[k].move_full();
                }
                for (size_t k = k0; k < k1; ++k) {
                  if (db.names.empty())
                    return first;
                  db.names.pop_back();
                }
                if (!tmp.empty()) {
                  if (db.names.empty())
                    return first;
                  if (!first_arg)
                    db.names.back().first += ", ";
                  else
                    first_arg = false;
                  db.names.back().first += tmp;
                }
              }
              t = t2;
            }
          }
          if (db.names.empty())
            return first;
          db.names.back().first += ')';
          if (cv & 1)
            db.names.back().first.append(" const");
          if (cv & 2)
            db.names.back().first.append(" volatile");
          if (cv & 4)
            db.names.back().first.append(" restrict");
          if (ref == 1)
            db.names.back().first.append(" &");
          else if (ref == 2)
            db.names.back().first.append(" &&");
          db.names.back().first += ret2;
          first = t;
        } else
          first = t;
      }
      break;
    }
    }
  }
  return first;
}

// _block_invoke
// _block_invoke<decimal-digit>+
// _block_invoke_<decimal-digit>+

template <class C>
static const char *parse_block_invoke(const char *first, const char *last,
                                      C &db) {
  if (last - first >= 13) {
    const char test[] = "_block_invoke";
    const char *t = first;
    for (int i = 0; i < 13; ++i, ++t) {
      if (*t != test[i])
        return first;
    }
    if (t != last) {
      if (*t == '_') {
        // must have at least 1 decimal digit
        if (++t == last || !std::isdigit(*t))
          return first;
        ++t;
      }
      // parse zero or more digits
      while (t != last && isdigit(*t))
        ++t;
    }
    if (db.names.empty())
      return first;
    db.names.back().first.insert(0, "invocation function for block in ");
    first = t;
  }
  return first;
}

// extension
// <dot-suffix> := .<anything and everything>

template <class C>
static const char *parse_dot_suffix(const char *first, const char *last,
                                    C &db) {
  if (first != last && *first == '.') {
    if (db.names.empty())
      return first;
    db.names.back().first += " (" + std::string(first, last) + ")";
    first = last;
  }
  return first;
}

// <block-involcaton-function> ___Z<encoding>_block_invoke
// <block-involcaton-function> ___Z<encoding>_block_invoke<decimal-digit>+
// <block-involcaton-function> ___Z<encoding>_block_invoke_<decimal-digit>+
// <mangled-name> ::= _Z<encoding>
//                ::= <type>

template <class C>
static void demangle(const char *first, const char *last, C &db, int &status) {
  if (first >= last) {
    status = invalid_mangled_name;
    return;
  }
  if (*first == '_') {
    if (last - first >= 4) {
      if (first[1] == 'Z') {
        const char *t = parse_encoding(first + 2, last, db);
        if (t != first + 2 && t != last && *t == '.')
          t = parse_dot_suffix(t, last, db);
        if (t != last)
          status = invalid_mangled_name;
      } else if (first[1] == '_' && first[2] == '_' && first[3] == 'Z') {
        const char *t = parse_encoding(first + 4, last, db);
        if (t != first + 4 && t != last) {
          const char *t1 = parse_block_invoke(t, last, db);
          if (t1 != last)
            status = invalid_mangled_name;
        } else
          status = invalid_mangled_name;
      } else
        status = invalid_mangled_name;
    } else
      status = invalid_mangled_name;
  } else {
    const char *t = parse_type(first, last, db);
    if (t != last)
      status = invalid_mangled_name;
  }
  if (status == success && db.names.empty())
    status = invalid_mangled_name;
}

namespace {
template <class StrT> struct string_pair {
  StrT first;
  StrT second;

  string_pair() = default;
  string_pair(StrT f) : first(std::move(f)) {}
  string_pair(StrT f, StrT s) : first(std::move(f)), second(std::move(s)) {}
  template <size_t N> string_pair(const char (&s)[N]) : first(s, N - 1) {}

  size_t size() const { return first.size() + second.size(); }
  StrT full() const { return first + second; }
  StrT move_full() { return std::move(first) + std::move(second); }
};

struct Db {
  typedef std::vector<string_pair<std::string>> sub_type;
  typedef std::vector<sub_type> template_param_type;
  sub_type names;
  template_param_type subs;
  std::vector<template_param_type> template_param;
  unsigned cv = 0;
  unsigned ref = 0;
  unsigned encoding_depth = 0;
  bool parsed_ctor_dtor_cv = false;
  bool tag_templates = true;
  bool fix_forward_references = false;
  bool try_to_parse_template_args = true;

  Db() : subs(0, names), template_param(0, subs) {}
};
}

char *llvm::itaniumDemangle(const char *mangled_name, char *buf, size_t *n,
                            int *status) {
  if (mangled_name == nullptr || (buf != nullptr && n == nullptr)) {
    if (status)
      *status = invalid_args;
    return nullptr;
  }

  size_t len = std::strlen(mangled_name);
  if (len < 2 || strncmp(mangled_name, "_Z", 2)) {
    if (len < 4 || strncmp(mangled_name, "___Z", 4)) {
      if (status)
        *status = invalid_mangled_name;
      return nullptr;
    }
  }

  size_t internal_size = buf != nullptr ? *n : 0;
  Db db;
  db.template_param.emplace_back();
  int internal_status = success;
  demangle(mangled_name, mangled_name + len, db, internal_status);
  if (internal_status == success && db.fix_forward_references &&
      !db.template_param.empty() && !db.template_param.front().empty()) {
    db.fix_forward_references = false;
    db.tag_templates = false;
    db.names.clear();
    db.subs.clear();
    demangle(mangled_name, mangled_name + len, db, internal_status);
    if (db.fix_forward_references)
      internal_status = invalid_mangled_name;
  }
  if (internal_status == success) {
    size_t sz = db.names.back().size() + 1;
    if (sz > internal_size) {
      char *newbuf = static_cast<char *>(std::realloc(buf, sz));
      if (newbuf == nullptr) {
        internal_status = memory_alloc_failure;
        buf = nullptr;
      } else {
        buf = newbuf;
        if (n != nullptr)
          *n = sz;
      }
    }
    if (buf != nullptr) {
      db.names.back().first += db.names.back().second;
      std::memcpy(buf, db.names.back().first.data(), sz - 1);
      buf[sz - 1] = char(0);
    }
  } else
    buf = nullptr;
  if (status)
    *status = internal_status;
  return buf;
}
