1d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant//===-------------------------- cxa_demangle.cpp --------------------------===// 2d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant// 3d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant// The LLVM Compiler Infrastructure 4d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant// 5d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 6d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant// Source Licenses. See LICENSE.TXT for details. 7d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant// 8d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant//===----------------------------------------------------------------------===// 9d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant#define _LIBCPP_EXTERN_TEMPLATE(...) 116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant#define _LIBCPP_NO_EXCEPTIONS 12d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant#include <vector> 14d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant#include <algorithm> 15d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant#include <string> 166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant#include <numeric> 176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant#include <cstdlib> 186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant#include <cstring> 196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant#include <cctype> 20d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 21d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnantnamespace __cxxabiv1 22d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{ 23d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantnamespace 25d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{ 26d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantenum 28d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{ 296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant unknown_error = -4, 306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant invalid_args = -3, 316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant invalid_mangled_name, 326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant memory_alloc_failure, 336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant success 34d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant}; 35d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* parse_type(const char* first, const char* last, C& db); 386c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* parse_encoding(const char* first, const char* last, C& db); 406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 41e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert const char* parse_name(const char* first, const char* last, C& db, 42e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert bool* ends_with_template_args = 0); 436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* parse_expression(const char* first, const char* last, C& db); 456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* parse_template_args(const char* first, const char* last, C& db); 476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* parse_operator_name(const char* first, const char* last, C& db); 496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* parse_unqualified_name(const char* first, const char* last, C& db); 516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* parse_decltype(const char* first, const char* last, C& db); 53d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantvoid 566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantprint_stack(const C& db) 576c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant printf("---------\n"); 596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant printf("names:\n"); 606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant for (auto& s : db.names) 616c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant printf("{%s#%s}\n", s.first.c_str(), s.second.c_str()); 626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant int i = -1; 636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant printf("subs:\n"); 646c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant for (auto& v : db.subs) 656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (i >= 0) 676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant printf("S%i_ = {", i); 686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant printf("S_ = {"); 706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant for (auto& s : v) 716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant printf("{%s#%s}", s.first.c_str(), s.second.c_str()); 726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant printf("}\n"); 736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++i; 746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant printf("template_param:\n"); 766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant for (auto& t : db.template_param) 77d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant printf("--\n"); 796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant i = -1; 806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant for (auto& v : t) 81342f2f9ffa476d63a1fe1fa718b3243db2c7c5a7Howard Hinnant { 826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (i >= 0) 836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant printf("T%i_ = {", i); 846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant printf("T_ = {"); 866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant for (auto& s : v) 876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant printf("{%s#%s}", s.first.c_str(), s.second.c_str()); 886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant printf("}\n"); 896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++i; 90342f2f9ffa476d63a1fe1fa718b3243db2c7c5a7Howard Hinnant } 91d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant printf("---------\n\n"); 93d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant} 94d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantvoid 976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantprint_state(const char* msg, const char* first, const char* last, const C& db) 98d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{ 996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant printf("%s: ", msg); 1006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant for (; first != last; ++first) 1016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant printf("%c", *first); 1026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant printf("\n"); 1036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant print_stack(db); 1046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 105d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 1066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <number> ::= [n] <non-negative decimal integer> 107d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 1086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 1096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_number(const char* first, const char* last) 110d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{ 1116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (first != last) 112d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 1136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = first; 1146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (*t == 'n') 1156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++t; 1166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != last) 1176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 1186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (*t == '0') 1196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 1206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t+1; 1216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 1226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else if ('1' <= *t && *t <= '9') 1236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 1246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t+1; 1256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant while (first != last && std::isdigit(*first)) 1266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++first; 1276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 1286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 129d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 1306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 1316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 132d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 1336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class Float> 1346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantstruct float_data; 135d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 1366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <> 1376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantstruct float_data<float> 138f270035a31a0abd92c1592ba0e87db0016127c3eHoward Hinnant{ 1396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant static const size_t mangled_size = 8; 1406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant static const size_t max_demangled_size = 24; 141c62cbea03e7fb9df073bc965d3f7fc5ca5a39438Howard Hinnant static constexpr const char* spec = "%af"; 142f270035a31a0abd92c1592ba0e87db0016127c3eHoward Hinnant}; 143f270035a31a0abd92c1592ba0e87db0016127c3eHoward Hinnant 1446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconstexpr const char* float_data<float>::spec; 145d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 1466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <> 1476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantstruct float_data<double> 148d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{ 1496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant static const size_t mangled_size = 16; 1506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant static const size_t max_demangled_size = 32; 1516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant static constexpr const char* spec = "%a"; 152d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant}; 153d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 1546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconstexpr const char* float_data<double>::spec; 155d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 1566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <> 1576c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantstruct float_data<long double> 158d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{ 159e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert#if defined(__arm__) 160e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert static const size_t mangled_size = 16; 161e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert#else 1626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant static const size_t mangled_size = 20; // May need to be adjusted to 16 or 24 on other platforms 163e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert#endif 1646c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant static const size_t max_demangled_size = 40; 165c62cbea03e7fb9df073bc965d3f7fc5ca5a39438Howard Hinnant static constexpr const char* spec = "%LaL"; 166d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant}; 167d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 1686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconstexpr const char* float_data<long double>::spec; 169d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 1706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class Float, class C> 1716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 1726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_floating_number(const char* first, const char* last, C& db) 173d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{ 1746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const size_t N = float_data<Float>::mangled_size; 1756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (static_cast<std::size_t>(last - first) > N) 176d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 1776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant last = first + N; 1786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant union 1796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 1806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant Float value; 1816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant char buf[sizeof(Float)]; 1826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant }; 1836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = first; 1846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant char* e = buf; 1856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant for (; t != last; ++t, ++e) 1866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 1876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (!isxdigit(*t)) 1886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 1896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant unsigned d1 = isdigit(*t) ? static_cast<unsigned>(*t - '0') : 1906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant static_cast<unsigned>(*t - 'a' + 10); 1916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++t; 1926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant unsigned d0 = isdigit(*t) ? static_cast<unsigned>(*t - '0') : 1936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant static_cast<unsigned>(*t - 'a' + 10); 1946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant *e = static_cast<char>((d1 << 4) + d0); 1956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 1966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (*t == 'E') 1976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 1986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant#if __LITTLE_ENDIAN__ 1996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant std::reverse(buf, e); 2006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant#endif 2016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant char num[float_data<Float>::max_demangled_size] = {0}; 202c62cbea03e7fb9df073bc965d3f7fc5ca5a39438Howard Hinnant int n = snprintf(num, sizeof(num), float_data<Float>::spec, value); 203c62cbea03e7fb9df073bc965d3f7fc5ca5a39438Howard Hinnant if (static_cast<std::size_t>(n) >= sizeof(num)) 204c62cbea03e7fb9df073bc965d3f7fc5ca5a39438Howard Hinnant return first; 205c62cbea03e7fb9df073bc965d3f7fc5ca5a39438Howard Hinnant db.names.push_back(typename C::String(num, static_cast<std::size_t>(n))); 2066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t+1; 2076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 208d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 2096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 2106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 211d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 2126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <source-name> ::= <positive length number> <identifier> 213d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 2146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 2156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 2166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_source_name(const char* first, const char* last, C& db) 217f270035a31a0abd92c1592ba0e87db0016127c3eHoward Hinnant{ 2186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (first != last) 219f270035a31a0abd92c1592ba0e87db0016127c3eHoward Hinnant { 2206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant char c = *first; 2216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (isdigit(c) && first+1 != last) 2226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 2236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = first+1; 2246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant size_t n = static_cast<size_t>(c - '0'); 2256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant for (c = *t; isdigit(c); c = *t) 2266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 2276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant n = n * 10 + static_cast<size_t>(c - '0'); 2286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (++t == last) 2296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 2306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 2316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (static_cast<size_t>(last - t) >= n) 2326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 2336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant typename C::String r(t, n); 2346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (r.substr(0, 10) == "_GLOBAL__N") 2356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("(anonymous namespace)"); 2366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 2376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back(std::move(r)); 2386c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t + n; 2396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 2406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 241f270035a31a0abd92c1592ba0e87db0016127c3eHoward Hinnant } 2426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 2436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 244f270035a31a0abd92c1592ba0e87db0016127c3eHoward Hinnant 2456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <substitution> ::= S <seq-id> _ 2466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= S_ 2476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <substitution> ::= Sa # ::std::allocator 2486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <substitution> ::= Sb # ::std::basic_string 2496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <substitution> ::= Ss # ::std::basic_string < char, 2506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::std::char_traits<char>, 2516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::std::allocator<char> > 2526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <substitution> ::= Si # ::std::basic_istream<char, std::char_traits<char> > 2536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <substitution> ::= So # ::std::basic_ostream<char, std::char_traits<char> > 2546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <substitution> ::= Sd # ::std::basic_iostream<char, std::char_traits<char> > 255f270035a31a0abd92c1592ba0e87db0016127c3eHoward Hinnant 2566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 2576c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 2586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_substitution(const char* first, const char* last, C& db) 259d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{ 2606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last - first >= 2) 261d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 2626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (*first == 'S') 263d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 2646c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (first[1]) 2656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 2666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'a': 2676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("std::allocator"); 2686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 2696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 2706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'b': 2716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("std::basic_string"); 2726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 2736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 2746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 's': 2756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("std::string"); 2766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 2776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 2786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'i': 2796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("std::istream"); 2806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 2816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 2826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'o': 2836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("std::ostream"); 2846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 2856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 2866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'd': 2876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("std::iostream"); 2886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 2896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 2906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case '_': 2916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (!db.subs.empty()) 2926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 2936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant for (const auto& n : db.subs.front()) 2946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back(n); 2956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 2966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 2976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 2986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant default: 2996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (std::isdigit(first[1]) || std::isupper(first[1])) 3006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 3016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant size_t sub = 0; 3026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = first+1; 3036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (std::isdigit(*t)) 3046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant sub = static_cast<size_t>(*t - '0'); 3056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 3066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant sub = static_cast<size_t>(*t - 'A') + 10; 3076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant for (++t; t != last && (std::isdigit(*t) || std::isupper(*t)); ++t) 3086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 3096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant sub *= 36; 3106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (std::isdigit(*t)) 3116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant sub += static_cast<size_t>(*t - '0'); 3126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 3136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant sub += static_cast<size_t>(*t - 'A') + 10; 3146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 3156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t == last || *t != '_') 3166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 3176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++sub; 3186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (sub < db.subs.size()) 3196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 3206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant for (const auto& n : db.subs[sub]) 3216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back(n); 3226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t+1; 3236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 3246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 3256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 3266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 3276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 328d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 3296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 3306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 331d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 3326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <builtin-type> ::= v # void 3336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= w # wchar_t 3346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= b # bool 3356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= c # char 3366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= a # signed char 3376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= h # unsigned char 3386c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= s # short 3396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= t # unsigned short 3406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= i # int 3416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= j # unsigned int 3426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= l # long 3436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= m # unsigned long 3446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= x # long long, __int64 3456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= y # unsigned long long, __int64 3466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= n # __int128 3476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= o # unsigned __int128 3486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= f # float 3496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= d # double 3506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= e # long double, __float80 3516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= g # __float128 3526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= z # ellipsis 3536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= Dd # IEEE 754r decimal floating point (64 bits) 3546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= De # IEEE 754r decimal floating point (128 bits) 3556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= Df # IEEE 754r decimal floating point (32 bits) 3566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= Dh # IEEE 754r half-precision floating point (16 bits) 3576c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= Di # char32_t 3586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= Ds # char16_t 3596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= Da # auto (in dependent new-expressions) 3602950e56d0fb30123dc93a55dc92f5a903c2bec13Anders Carlsson// ::= Dc # decltype(auto) 3616c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= Dn # std::nullptr_t (i.e., decltype(nullptr)) 3626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= u <source-name> # vendor extended type 363d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 3646c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 3656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 3666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_builtin_type(const char* first, const char* last, C& db) 367d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{ 3686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (first != last) 369d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 3706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (*first) 3716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 3726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'v': 3736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("void"); 3746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++first; 3756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 3766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'w': 3776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("wchar_t"); 3786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++first; 3796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 3806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'b': 3816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("bool"); 3826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++first; 3836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 3846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'c': 3856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("char"); 3866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++first; 3876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 3886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'a': 3896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("signed char"); 3906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++first; 3916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 3926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'h': 3936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("unsigned char"); 3946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++first; 3956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 3966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 's': 3976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("short"); 3986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++first; 3996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 4006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 't': 4016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("unsigned short"); 4026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++first; 4036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 4046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'i': 4056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("int"); 4066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++first; 4076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 4086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'j': 4096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("unsigned int"); 4106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++first; 4116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 4126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'l': 4136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("long"); 4146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++first; 4156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 4166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'm': 4176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("unsigned long"); 4186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++first; 4196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 4206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'x': 4216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("long long"); 4226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++first; 4236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 4246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'y': 4256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("unsigned long long"); 4266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++first; 4276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 4286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'n': 4296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("__int128"); 4306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++first; 4316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 4326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'o': 4336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("unsigned __int128"); 4346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++first; 4356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 4366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'f': 4376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("float"); 4386c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++first; 4396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 4406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'd': 4416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("double"); 4426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++first; 4436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 4446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'e': 4456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("long double"); 4466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++first; 4476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 4486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'g': 4496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("__float128"); 4506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++first; 4516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 4526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'z': 4536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("..."); 4546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++first; 4556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 4566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'u': 4576c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 4586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char*t = parse_source_name(first+1, last, db); 4596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+1) 4606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 4616c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 4626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 4636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'D': 4646c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (first+1 != last) 4656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 4666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (first[1]) 4676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 4686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'd': 4696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("decimal64"); 4706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 4716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 4726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'e': 4736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("decimal128"); 4746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 4756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 4766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'f': 4776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("decimal32"); 4786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 4796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 4806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'h': 4816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("decimal16"); 4826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 4836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 4846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'i': 4856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("char32_t"); 4866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 4876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 4886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 's': 4896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("char16_t"); 4906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 4916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 4926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'a': 4936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("auto"); 4946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 4956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 4962950e56d0fb30123dc93a55dc92f5a903c2bec13Anders Carlsson case 'c': 4972950e56d0fb30123dc93a55dc92f5a903c2bec13Anders Carlsson db.names.push_back("decltype(auto)"); 4982950e56d0fb30123dc93a55dc92f5a903c2bec13Anders Carlsson first += 2; 4992950e56d0fb30123dc93a55dc92f5a903c2bec13Anders Carlsson break; 5006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'n': 5016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("std::nullptr_t"); 5026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 5036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 5046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 5056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 5066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 5076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 508d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 5096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 5106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 511d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 5126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <CV-qualifiers> ::= [r] [V] [K] 513d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 5146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 5156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_cv_qualifiers(const char* first, const char* last, unsigned& cv) 516d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{ 5176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant cv = 0; 5186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (first != last) 519d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 5206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (*first == 'r') 521d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 5226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant cv |= 4; 5236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++first; 524d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 5256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (*first == 'V') 526d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 5276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant cv |= 2; 5286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++first; 529d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 5306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (*first == 'K') 531d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 5326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant cv |= 1; 5336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++first; 534d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 535d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 5366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 5376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 538d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 5396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <template-param> ::= T_ # first template parameter 5406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= T <parameter-2 non-negative number> _ 541d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 5426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 5436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 5446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_template_param(const char* first, const char* last, C& db) 5456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 5466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last - first >= 2) 547d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 5486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (*first == 'T') 549d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 5506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (first[1] == '_') 5516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 552753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.template_param.empty()) 553753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 5546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (!db.template_param.back().empty()) 5556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 5566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant for (auto& t : db.template_param.back().front()) 5576c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back(t); 5586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 5596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 5606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 5616c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 562b2d1f94e76c016628f868868ed40a53c2b40b6edHoward Hinnant db.names.push_back("T_"); 5636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 5646c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.fix_forward_references = true; 5656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 5666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 5676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else if (isdigit(first[1])) 5686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 5696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = first+1; 5706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant size_t sub = static_cast<size_t>(*t - '0'); 5716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant for (++t; t != last && isdigit(*t); ++t) 5726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 5736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant sub *= 10; 5746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant sub += static_cast<size_t>(*t - '0'); 5756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 576753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (t == last || *t != '_' || db.template_param.empty()) 5776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 5786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++sub; 5796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (sub < db.template_param.back().size()) 5806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 5816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant for (auto& temp : db.template_param.back()[sub]) 5826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back(temp); 5836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t+1; 5846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 5856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 5866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 587b2d1f94e76c016628f868868ed40a53c2b40b6edHoward Hinnant db.names.push_back(typename C::String(first, t+1)); 5886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t+1; 5896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.fix_forward_references = true; 5906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 5916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 592d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 593d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 5946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 5956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 5966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 5976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// cc <type> <expression> # const_cast<type> (expression) 5986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 5996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 6006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 6016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_const_cast_expr(const char* first, const char* last, C& db) 6026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 6036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last - first >= 3 && first[0] == 'c' && first[1] == 'c') 604d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 6056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_type(first+2, last, db); 6066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+2) 607d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 6086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = parse_expression(t, last, db); 6096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != t) 6106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 611753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.size() < 2) 612753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 6136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto expr = db.names.back().move_full(); 6146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 6156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back() = "const_cast<" + db.names.back().move_full() + ">(" + expr + ")"; 6166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t1; 6176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 618d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 619d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 6206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 6216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 622d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 6236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// dc <type> <expression> # dynamic_cast<type> (expression) 624d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 6256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 6266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 6276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_dynamic_cast_expr(const char* first, const char* last, C& db) 6286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 6296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last - first >= 3 && first[0] == 'd' && first[1] == 'c') 630d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 6316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_type(first+2, last, db); 6326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+2) 633d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 6346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = parse_expression(t, last, db); 6356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != t) 6366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 637753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.size() < 2) 638753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 6396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto expr = db.names.back().move_full(); 6406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 6416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back() = "dynamic_cast<" + db.names.back().move_full() + ">(" + expr + ")"; 6426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t1; 6436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 644d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 645d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 6466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 6476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 648d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 6496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// rc <type> <expression> # reinterpret_cast<type> (expression) 650d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 6516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 6526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 6536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_reinterpret_cast_expr(const char* first, const char* last, C& db) 6546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 6556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last - first >= 3 && first[0] == 'r' && first[1] == 'c') 656d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 6576c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_type(first+2, last, db); 6586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+2) 659d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 6606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = parse_expression(t, last, db); 6616c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != t) 6626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 663753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.size() < 2) 664753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 6656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto expr = db.names.back().move_full(); 6666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 6676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back() = "reinterpret_cast<" + db.names.back().move_full() + ">(" + expr + ")"; 6686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t1; 6696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 670d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 671d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 6726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 6736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 674d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 6756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// sc <type> <expression> # static_cast<type> (expression) 676d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 6776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 6786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 6796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_static_cast_expr(const char* first, const char* last, C& db) 6806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 6816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last - first >= 3 && first[0] == 's' && first[1] == 'c') 682d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 6836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_type(first+2, last, db); 6846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+2) 685d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 6866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = parse_expression(t, last, db); 6876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != t) 6886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 689753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.size() < 2) 690753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 6916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto expr = db.names.back().move_full(); 6926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 6936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back() = "static_cast<" + db.names.back().move_full() + ">(" + expr + ")"; 6946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t1; 6956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 696d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 697d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 6986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 6996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 700d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 7016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// sp <expression> # pack expansion 702d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 7036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 7046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 7056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_pack_expansion(const char* first, const char* last, C& db) 7066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 7076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last - first >= 3 && first[0] == 's' && first[1] == 'p') 708d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 7096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_expression(first+2, last, db); 7106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+2) 7116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 712d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 7136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 7146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 7156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 7166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// st <type> # sizeof (a type) 7176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 7186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 7196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 7206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_sizeof_type_expr(const char* first, const char* last, C& db) 7216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 7226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last - first >= 3 && first[0] == 's' && first[1] == 't') 723d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 7246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_type(first+2, last, db); 7256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+2) 726d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 727753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 728753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 7296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back() = "sizeof (" + db.names.back().move_full() + ")"; 7306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 731d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 732d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 7336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 7346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 7356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 7366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// sz <expr> # sizeof (a expression) 7376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 7386c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 7396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 7406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_sizeof_expr_expr(const char* first, const char* last, C& db) 7416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 7426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last - first >= 3 && first[0] == 's' && first[1] == 'z') 743d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 7446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_expression(first+2, last, db); 7456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+2) 746d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 747753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 748753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 7496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back() = "sizeof (" + db.names.back().move_full() + ")"; 7506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 751d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 752d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 7536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 7546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 755d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 7566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// sZ <template-param> # size of a parameter pack 757d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 7586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 7596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 7606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_sizeof_param_pack_expr(const char* first, const char* last, C& db) 7616c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 7626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last - first >= 3 && first[0] == 's' && first[1] == 'Z' && first[2] == 'T') 763d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 7646c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant size_t k0 = db.names.size(); 7656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_template_param(first+2, last, db); 7666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant size_t k1 = db.names.size(); 7676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+2) 768d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 7696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant typename C::String tmp("sizeof...("); 7706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant size_t k = k0; 7716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (k != k1) 7726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 7736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant tmp += db.names[k].move_full(); 7746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant for (++k; k != k1; ++k) 7756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant tmp += ", " + db.names[k].move_full(); 7766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 7776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant tmp += ")"; 7786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant for (; k1 != k0; --k1) 7796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 7806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back(std::move(tmp)); 7816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 782d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 783d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 7846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 7856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 7866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 7876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <function-param> ::= fp <top-level CV-qualifiers> _ # L == 0, first parameter 7886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= fp <top-level CV-qualifiers> <parameter-2 non-negative number> _ # L == 0, second and later parameters 7896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= fL <L-1 non-negative number> p <top-level CV-qualifiers> _ # L > 0, first parameter 7906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= fL <L-1 non-negative number> p <top-level CV-qualifiers> <parameter-2 non-negative number> _ # L > 0, second and later parameters 7916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 7926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 7936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 7946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_function_param(const char* first, const char* last, C& db) 7956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 7966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last - first >= 3 && *first == 'f') 797d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 7986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (first[1] == 'p') 799d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 8006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant unsigned cv; 8016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_cv_qualifiers(first+2, last, cv); 8026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = parse_number(t, last); 8036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != last && *t1 == '_') 8046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 8056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("fp" + typename C::String(t, t1)); 8066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t1+1; 8076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 808d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 8096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else if (first[1] == 'L') 810d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 8116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant unsigned cv; 8126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t0 = parse_number(first+2, last); 8136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t0 != last && *t0 == 'p') 8146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 8156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++t0; 8166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_cv_qualifiers(t0, last, cv); 8176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = parse_number(t, last); 8186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != last && *t1 == '_') 8196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 8206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("fp" + typename C::String(t, t1)); 8216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t1+1; 8226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 8236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 824d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 825d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 8266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 8276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 828d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 8296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// sZ <function-param> # size of a function parameter pack 830d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 8316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 8326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 8336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_sizeof_function_param_pack_expr(const char* first, const char* last, C& db) 834d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{ 8356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last - first >= 3 && first[0] == 's' && first[1] == 'Z' && first[2] == 'f') 836d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 8376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_function_param(first+2, last, db); 8386c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+2) 839d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 840753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 841753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 8426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back() = "sizeof...(" + db.names.back().move_full() + ")"; 8436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 844d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 845d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 8466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 8476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 8486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 8496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// te <expression> # typeid (expression) 8506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ti <type> # typeid (type) 8516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 8526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 8536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 8546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_typeid_expr(const char* first, const char* last, C& db) 8556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 8566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last - first >= 3 && first[0] == 't' && (first[1] == 'e' || first[1] == 'i')) 857d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 8586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t; 8596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (first[1] == 'e') 8606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_expression(first+2, last, db); 861d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant else 8626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_type(first+2, last, db); 8636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+2) 864d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 865753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 866753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 8676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back() = "typeid(" + db.names.back().move_full() + ")"; 8686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 869d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 870d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 8716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 8726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 873d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 8746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// tw <expression> # throw expression 875d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 8766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 8776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 8786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_throw_expr(const char* first, const char* last, C& db) 8796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 8806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last - first >= 3 && first[0] == 't' && first[1] == 'w') 881d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 8826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_expression(first+2, last, db); 8836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+2) 884d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 885753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 886753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 8876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back() = "throw " + db.names.back().move_full(); 8886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 889d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 890d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 8916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 8926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 893d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 8946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ds <expression> <expression> # expr.*expr 895d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 8966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 8976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 8986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_dot_star_expr(const char* first, const char* last, C& db) 8996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 9006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last - first >= 3 && first[0] == 'd' && first[1] == 's') 901d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 9026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_expression(first+2, last, db); 9036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+2) 904d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 9056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = parse_expression(t, last, db); 9066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != t) 907d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 908753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.size() < 2) 909753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 9106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto expr = db.names.back().move_full(); 9116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 9126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first += ".*" + expr; 9136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t1; 914d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 915d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 916d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 9176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 9186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 9196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 9206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <simple-id> ::= <source-name> [ <template-args> ] 9216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 9226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 9236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 9246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_simple_id(const char* first, const char* last, C& db) 9256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 9266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (first != last) 927d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 9286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_source_name(first, last, db); 9296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first) 930d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 9316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = parse_template_args(t, last, db); 9326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != t) 9336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 934753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.size() < 2) 935753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 9366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto args = db.names.back().move_full(); 9376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 9386c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first += std::move(args); 9396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 9406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t1; 941d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 942d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant else 9436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 944d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 9456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 9466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 947d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 9486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <unresolved-type> ::= <template-param> 9496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= <decltype> 9506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= <substitution> 951d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 9526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 9536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 9546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_unresolved_type(const char* first, const char* last, C& db) 955d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{ 9566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (first != last) 957d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 9586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = first; 9596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (*first) 960d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 9616c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'T': 9626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 9636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant size_t k0 = db.names.size(); 9646c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_template_param(first, last, db); 9656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant size_t k1 = db.names.size(); 9666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first && k1 == k0 + 1) 9676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 9686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); 9696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 9706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 971d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant else 9726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 9736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant for (; k1 != k0; --k1) 9746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 9756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 9766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 9776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 9786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'D': 9796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_decltype(first, last, db); 9806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first) 9816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 982753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 983753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 9846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); 9856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 9866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 9876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 9886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'S': 9896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_substitution(first, last, db); 9906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first) 9916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 9926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 9936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 9946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last - first > 2 && first[1] == 't') 9956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 9966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_unqualified_name(first+2, last, db); 9976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+2) 9986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 999753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 1000753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 10016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.insert(0, "std::"); 10026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); 10036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 10046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 10056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 10066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 10076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 10086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 1009d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 10106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 10116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 10126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 10136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <destructor-name> ::= <unresolved-type> # e.g., ~T or ~decltype(f()) 10146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= <simple-id> # e.g., ~A<2*N> 10156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 10166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 10176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 10186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_destructor_name(const char* first, const char* last, C& db) 10196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 10206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (first != last) 1021d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 10226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_unresolved_type(first, last, db); 10236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t == first) 10246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_simple_id(first, last, db); 10256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first) 1026d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 1027753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 1028753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 10296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.insert(0, "~"); 10306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 1031d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 1032d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 10336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 10346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 1035d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 10366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <base-unresolved-name> ::= <simple-id> # unresolved name 10376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// extension ::= <operator-name> # unresolved operator-function-id 10386c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// extension ::= <operator-name> <template-args> # unresolved operator template-id 10396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= on <operator-name> # unresolved operator-function-id 10406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= on <operator-name> <template-args> # unresolved operator template-id 10416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= dn <destructor-name> # destructor or pseudo-destructor; 10426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// # e.g. ~X or ~X<N-1> 1043d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 10446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 10456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 10466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_base_unresolved_name(const char* first, const char* last, C& db) 10476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 10486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last - first >= 2) 1049d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 10506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if ((first[0] == 'o' || first[0] == 'd') && first[1] == 'n') 1051d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 10526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (first[0] == 'o') 10536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 10546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_operator_name(first+2, last, db); 10556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+2) 10566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 10576c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = parse_template_args(t, last, db); 10586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (first != t) 10596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 1060753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.size() < 2) 1061753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 10626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto args = db.names.back().move_full(); 10636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 10646c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first += std::move(args); 10656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 10666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 10676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 1068d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant else 10696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 10706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_destructor_name(first+2, last, db); 10716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+2) 10726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 10736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 1074d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 1075d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant else 1076d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 10776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_simple_id(first, last, db); 10786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t == first) 10796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 10806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_operator_name(first, last, db); 10816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first) 10826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 10836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = parse_template_args(t, last, db); 10846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (first != t) 10856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 1086753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.size() < 2) 1087753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 10886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto args = db.names.back().move_full(); 10896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 10906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first += std::move(args); 10916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 10926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 10936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 10946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 10956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 1096d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 1097d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 10986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 10996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 1100d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 11016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <unresolved-qualifier-level> ::= <simple-id> 11026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 11036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 11046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 11056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_unresolved_qualifier_level(const char* first, const char* last, C& db) 1106d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{ 11076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return parse_simple_id(first, last, db); 11086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 1109d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 11106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <unresolved-name> 11116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// extension ::= srN <unresolved-type> [<template-args>] <unresolved-qualifier-level>* E <base-unresolved-name> 11126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= [gs] <base-unresolved-name> # x or (with "gs") ::x 11136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= [gs] sr <unresolved-qualifier-level>+ E <base-unresolved-name> 11146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// # A::x, N::y, A<T>::z; "gs" means leading "::" 11156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= sr <unresolved-type> <base-unresolved-name> # T::x / decltype(p)::x 11166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// extension ::= sr <unresolved-type> <template-args> <base-unresolved-name> 11176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// # T::N::x /decltype(p)::N::x 11186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// (ignored) ::= srN <unresolved-type> <unresolved-qualifier-level>+ E <base-unresolved-name> 11196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 11206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 11216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 11226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_unresolved_name(const char* first, const char* last, C& db) 11236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 11246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last - first > 2) 1125d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 11266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = first; 11276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant bool global = false; 11286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t[0] == 'g' && t[1] == 's') 1129d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 11306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant global = true; 11316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t += 2; 1132d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 11336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t2 = parse_base_unresolved_name(t, last, db); 11346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t2 != t) 1135d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 11366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (global) 1137753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant { 1138753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 1139753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 11406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.insert(0, "::"); 1141753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant } 11426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t2; 1143d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 11446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else if (last - t > 2 && t[0] == 's' && t[1] == 'r') 1145d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 11466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t[2] == 'N') 11476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 11486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t += 3; 11496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = parse_unresolved_type(t, last, db); 11506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 == t || t1 == last) 11516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 11526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = t1; 11536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t1 = parse_template_args(t, last, db); 11546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != t) 11556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 1156753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.size() < 2) 1157753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 11586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto args = db.names.back().move_full(); 11596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 11606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first += std::move(args); 11616c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = t1; 11626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t == last) 11636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 11646c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 11656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 11666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 11676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 11686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant while (*t != 'E') 11696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 11706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t1 = parse_unresolved_qualifier_level(t, last, db); 1171753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (t1 == t || t1 == last || db.names.size() < 2) 11726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 11736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto s = db.names.back().move_full(); 11746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 11756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first += "::" + std::move(s); 11766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = t1; 11776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 11786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++t; 11796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t1 = parse_base_unresolved_name(t, last, db); 11806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 == t) 11816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 1182753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (!db.names.empty()) 1183753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant db.names.pop_back(); 11846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 11856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 1186753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.size() < 2) 1187753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 11886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto s = db.names.back().move_full(); 11896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 11906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first += "::" + std::move(s); 11916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t1; 11926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 11936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 11946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 11956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t += 2; 11966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = parse_unresolved_type(t, last, db); 11976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != t) 11986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 11996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = t1; 12006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t1 = parse_template_args(t, last, db); 12016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != t) 12026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 1203753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.size() < 2) 1204753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 12056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto args = db.names.back().move_full(); 12066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 12076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first += std::move(args); 12086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = t1; 12096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 12106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t1 = parse_base_unresolved_name(t, last, db); 12116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 == t) 12126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 1213753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (!db.names.empty()) 1214753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant db.names.pop_back(); 12156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 12166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 1217753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.size() < 2) 1218753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 12196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto s = db.names.back().move_full(); 12206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 12216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first += "::" + std::move(s); 12226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t1; 12236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 12246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 12256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 12266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t1 = parse_unresolved_qualifier_level(t, last, db); 12276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 == t || t1 == last) 12286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 12296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = t1; 12306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (global) 1231753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant { 1232753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 1233753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 12346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.insert(0, "::"); 1235753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant } 12366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant while (*t != 'E') 12376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 12386c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t1 = parse_unresolved_qualifier_level(t, last, db); 1239753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (t1 == t || t1 == last || db.names.size() < 2) 12406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 12416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto s = db.names.back().move_full(); 12426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 12436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first += "::" + std::move(s); 12446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = t1; 12456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 12466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++t; 12476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t1 = parse_base_unresolved_name(t, last, db); 12486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 == t) 12496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 1250753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (!db.names.empty()) 1251753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant db.names.pop_back(); 12526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 12536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 1254753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.size() < 2) 1255753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 12566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto s = db.names.back().move_full(); 12576c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 12586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first += "::" + std::move(s); 12596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t1; 12606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 12616c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 1262d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 1263d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 12646c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 12656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 1266d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 12676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// dt <expression> <unresolved-name> # expr.name 1268d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 12696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 12706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 12716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_dot_expr(const char* first, const char* last, C& db) 12726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 12736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last - first >= 3 && first[0] == 'd' && first[1] == 't') 1274d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 12756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_expression(first+2, last, db); 12766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+2) 1277d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 12786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = parse_unresolved_name(t, last, db); 12796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != t) 12806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 1281753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.size() < 2) 1282753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 12836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto name = db.names.back().move_full(); 12846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 12856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first += "." + name; 12866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t1; 12876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 1288d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 1289d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 12906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 12916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 1292d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 12936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// cl <expression>+ E # call 1294d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 12956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 12966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 12976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_call_expr(const char* first, const char* last, C& db) 12986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 12996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last - first >= 4 && first[0] == 'c' && first[1] == 'l') 1300d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 13016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_expression(first+2, last, db); 13026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+2) 1303d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 13046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t == last) 13056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 1306753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 1307753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 13086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first += db.names.back().second; 13096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().second = typename C::String(); 13106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.append("("); 13116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant bool first_expr = true; 13126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant while (*t != 'E') 13136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 13146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = parse_expression(t, last, db); 13156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 == t || t1 == last) 13166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 1317753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 1318753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 13196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto tmp = db.names.back().move_full(); 13206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 13216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (!tmp.empty()) 13226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 1323753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 1324753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 13256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (!first_expr) 13266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 13276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.append(", "); 13286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first_expr = false; 13296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 13306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.append(tmp); 13316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 13326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = t1; 13336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 13346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++t; 1335753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 1336753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 13376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.append(")"); 13386c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 1339d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 1340d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 13416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 13426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 1343d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 13446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// [gs] nw <expression>* _ <type> E # new (expr-list) type 13456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// [gs] nw <expression>* _ <type> <initializer> # new (expr-list) type (init) 13466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// [gs] na <expression>* _ <type> E # new[] (expr-list) type 13476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// [gs] na <expression>* _ <type> <initializer> # new[] (expr-list) type (init) 13486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <initializer> ::= pi <expression>* E # parenthesized initialization 1349d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 13506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 13516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 13526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_new_expr(const char* first, const char* last, C& db) 13536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 13546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last - first >= 4) 1355d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 13566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = first; 13576c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant bool parsed_gs = false; 13586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t[0] == 'g' && t[1] == 's') 1359d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 13606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t += 2; 13616c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant parsed_gs = true; 1362d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 13636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t[0] == 'n' && (t[1] == 'w' || t[1] == 'a')) 1364d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 13656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant bool is_array = t[1] == 'a'; 13666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t += 2; 13676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t == last) 13686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 13696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant bool has_expr_list = false; 13706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant bool first_expr = true; 13716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant while (*t != '_') 13726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 13736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = parse_expression(t, last, db); 13746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 == t || t1 == last) 13756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 13766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant has_expr_list = true; 13776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (!first_expr) 13786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 1379753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 1380753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 13816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto tmp = db.names.back().move_full(); 13826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 13836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (!tmp.empty()) 13846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 1385753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 1386753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 13876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.append(", "); 13886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.append(tmp); 13896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first_expr = false; 13906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 13916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 13926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = t1; 13936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 13946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++t; 13956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = parse_type(t, last, db); 13966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 == t || t1 == last) 13976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 13986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = t1; 13996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant bool has_init = false; 14006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last - t >= 3 && t[0] == 'p' && t[1] == 'i') 14016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 14026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t += 2; 14036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant has_init = true; 14046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first_expr = true; 14056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant while (*t != 'E') 14066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 14076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t1 = parse_expression(t, last, db); 14086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 == t || t1 == last) 14096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 14106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (!first_expr) 14116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 1412753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 1413753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 14146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto tmp = db.names.back().move_full(); 14156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 14166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (!tmp.empty()) 14176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 1418753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 1419753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 14206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.append(", "); 14216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.append(tmp); 14226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first_expr = false; 14236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 14246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 14256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = t1; 14266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 14276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 14286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (*t != 'E') 14296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 14306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant typename C::String init_list; 14316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (has_init) 14326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 1433753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 1434753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 14356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant init_list = db.names.back().move_full(); 14366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 14376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 1438753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 1439753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 14406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto type = db.names.back().move_full(); 14416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 14426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant typename C::String expr_list; 14436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (has_expr_list) 14446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 1445753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 1446753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 14476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant expr_list = db.names.back().move_full(); 14486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 14496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 14506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant typename C::String r; 14516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (parsed_gs) 14526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant r = "::"; 14536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (is_array) 14546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant r += "[] "; 14556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 14566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant r += " "; 14576c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (has_expr_list) 14586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant r += "(" + expr_list + ") "; 14596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant r += type; 14606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (has_init) 14616c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant r += " (" + init_list + ")"; 14626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back(std::move(r)); 14636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t+1; 1464d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 1465d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 14666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 14676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 1468d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 14696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// cv <type> <expression> # conversion with one argument 14706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// cv <type> _ <expression>* E # conversion with a different number of arguments 1471d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 14726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 14736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 14746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_conversion_expr(const char* first, const char* last, C& db) 14756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 14766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last - first >= 3 && first[0] == 'c' && first[1] == 'v') 1477d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 14786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant bool try_to_parse_template_args = db.try_to_parse_template_args; 14796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.try_to_parse_template_args = false; 14806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_type(first+2, last, db); 14816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.try_to_parse_template_args = try_to_parse_template_args; 14826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+2 && t != last) 1483d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 14846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (*t != '_') 14856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 14866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = parse_expression(t, last, db); 14876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 == t) 14886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 14896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = t1; 14906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 1491d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant else 14926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 14936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++t; 14946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t == last) 14956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 14966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (*t == 'E') 14976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.emplace_back(); 14986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 14996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 15006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant bool first_expr = true; 15016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant while (*t != 'E') 15026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 15036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = parse_expression(t, last, db); 15046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 == t || t1 == last) 15056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 15066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (!first_expr) 15076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 1508753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 1509753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 15106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto tmp = db.names.back().move_full(); 15116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 15126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (!tmp.empty()) 15136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 1514753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 1515753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 15166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.append(", "); 15176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.append(tmp); 15186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first_expr = false; 15196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 15206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 15216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = t1; 15226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 15236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 15246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++t; 15256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 1526753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.size() < 2) 1527753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 15286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto tmp = db.names.back().move_full(); 15296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 15306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back() = "(" + db.names.back().move_full() + ")(" + tmp + ")"; 15316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 1532d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 1533d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 15346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 15356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 1536d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 15376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// pt <expression> <expression> # expr->name 1538d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 15396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 15406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 15416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_arrow_expr(const char* first, const char* last, C& db) 15426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 15436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last - first >= 3 && first[0] == 'p' && first[1] == 't') 1544d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 15456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_expression(first+2, last, db); 15466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+2) 1547d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 15486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = parse_expression(t, last, db); 15496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != t) 15506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 1551753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.size() < 2) 1552753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 15536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto tmp = db.names.back().move_full(); 15546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 15556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first += "->"; 15566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first += tmp; 15576c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t1; 15586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 1559d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 1560d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 15616c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 15626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 15636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 15646c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <ref-qualifier> ::= R # & ref-qualifier 15656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <ref-qualifier> ::= O # && ref-qualifier 15666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 15676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <function-type> ::= F [Y] <bare-function-type> [<ref-qualifier>] E 15686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 15696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 15706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 15716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_function_type(const char* first, const char* last, C& db) 15726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 15736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (first != last && *first == 'F') 1574d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 15756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = first+1; 15766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != last) 1577d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 15786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant bool externC = false; 15796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (*t == 'Y') 15806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 15816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant externC = true; 15826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (++t == last) 15836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 15846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 15856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = parse_type(t, last, db); 15866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != t) 15876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 15886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = t1; 15896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant typename C::String sig("("); 15906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant int ref_qual = 0; 15916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant while (true) 15926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 15936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t == last) 15946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 15956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 15966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 15976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 15986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (*t == 'E') 15996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 16006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++t; 16016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 16026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 16036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (*t == 'v') 16046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 16056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++t; 16066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant continue; 16076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 16086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (*t == 'R' && t+1 != last && t[1] == 'E') 16096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 16106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ref_qual = 1; 16116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++t; 16126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant continue; 16136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 16146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (*t == 'O' && t+1 != last && t[1] == 'E') 16156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 16166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ref_qual = 2; 16176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++t; 16186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant continue; 16196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 16206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant size_t k0 = db.names.size(); 16216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t1 = parse_type(t, last, db); 16226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant size_t k1 = db.names.size(); 16236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 == t || t1 == last) 16246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 16256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant for (size_t k = k0; k < k1; ++k) 16266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 16276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (sig.size() > 1) 16286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant sig += ", "; 16296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant sig += db.names[k].move_full(); 16306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 16316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant for (size_t k = k0; k < k1; ++k) 16326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 16336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = t1; 16346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 16356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant sig += ")"; 16366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (ref_qual) 16376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 16386c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 1: 16396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant sig += " &"; 16406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 16416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 2: 16426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant sig += " &&"; 16436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 16446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 1645753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 1646753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 16476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first += " "; 16486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().second.insert(0, sig); 16496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 16506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 1651d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 1652d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 16536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 16546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 1655d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 16566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <pointer-to-member-type> ::= M <class type> <member type> 1657d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 16586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 16596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 16606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_pointer_to_member_type(const char* first, const char* last, C& db) 1661d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{ 16626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (first != last && *first == 'M') 1663d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 16646c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_type(first+1, last, db); 16656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+1) 1666d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 16676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t2 = parse_type(t, last, db); 16686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t2 != t) 16696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 1670753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.size() < 2) 1671753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 16726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto func = std::move(db.names.back()); 16736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 16746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto class_type = std::move(db.names.back()); 16756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (func.second.front() == '(') 16766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 16776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first = std::move(func.first) + "(" + class_type.move_full() + "::*"; 16786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().second = ")" + std::move(func.second); 16796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 16806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 16816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 16826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first = std::move(func.first) + " " + class_type.move_full() + "::*"; 16836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().second = std::move(func.second); 16846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 16856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t2; 16866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 1687d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 1688d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 16896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 16906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 16916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 16926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <array-type> ::= A <positive dimension number> _ <element type> 16936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= A [<dimension expression>] _ <element type> 16946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 16956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 16966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 16976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_array_type(const char* first, const char* last, C& db) 16986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 16996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (first != last && *first == 'A' && first+1 != last) 1700d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 17016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (first[1] == '_') 1702d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 17036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_type(first+2, last, db); 17046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+2) 17056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 1706753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 1707753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 17086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (db.names.back().second.substr(0, 2) == " [") 17096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().second.erase(0, 1); 17106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().second.insert(0, " []"); 17116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 17126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 1713d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 17146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else if ('1' <= first[1] && first[1] <= '9') 1715d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 17166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_number(first+1, last); 17176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != last && *t == '_') 17186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 17196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t2 = parse_type(t+1, last, db); 17206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t2 != t+1) 17216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 1722753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 1723753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 17246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (db.names.back().second.substr(0, 2) == " [") 17256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().second.erase(0, 1); 17266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().second.insert(0, " [" + typename C::String(first+1, t) + "]"); 17276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t2; 17286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 17296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 1730d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 1731d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant else 1732d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 17336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_expression(first+1, last, db); 17346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+1 && t != last && *t == '_') 17356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 17366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t2 = parse_type(++t, last, db); 17376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t2 != t) 17386c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 1739753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.size() < 2) 1740753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 17416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto type = std::move(db.names.back()); 17426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 17436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto expr = std::move(db.names.back()); 17446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first = std::move(type.first); 17456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (type.second.substr(0, 2) == " [") 17466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant type.second.erase(0, 1); 17476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().second = " [" + expr.move_full() + "]" + std::move(type.second); 17486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t2; 17496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 17506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 1751d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 1752d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 17536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 17546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 1755d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 17566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <decltype> ::= Dt <expression> E # decltype of an id-expression or class member access (C++0x) 17576c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= DT <expression> E # decltype of an expression (C++0x) 1758d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 17596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 17606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 17616c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_decltype(const char* first, const char* last, C& db) 1762d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{ 17636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last - first >= 4 && first[0] == 'D') 1764d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 17656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (first[1]) 1766d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 17676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 't': 17686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'T': 17696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 17706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_expression(first+2, last, db); 17716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+2 && t != last && *t == 'E') 17726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 1773753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 1774753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 17756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back() = "decltype(" + db.names.back().move_full() + ")"; 17766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t+1; 17776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 17786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 17796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 1780d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 1781d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 17826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 17836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 1784d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 17856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// extension: 17866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <vector-type> ::= Dv <positive dimension number> _ 17876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <extended element type> 17886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= Dv [<dimension expression>] _ <element type> 17896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <extended element type> ::= <element type> 17906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= p # AltiVec vector pixel 1791d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 17926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 17936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 17946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_vector_type(const char* first, const char* last, C& db) 1795d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{ 17966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last - first > 3 && first[0] == 'D' && first[1] == 'v') 1797d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 17986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if ('1' <= first[2] && first[2] <= '9') 1799d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 18006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_number(first+2, last); 18016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t == last || *t != '_') 18026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 18036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* num = first + 2; 18046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant size_t sz = static_cast<size_t>(t - num); 18056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (++t != last) 18066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 18076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (*t != 'p') 18086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 18096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = parse_type(t, last, db); 18106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != t) 18116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 1812753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 1813753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 18146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first += " vector[" + typename C::String(num, sz) + "]"; 18156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t1; 18166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 18176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 18186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 18196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 18206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++t; 18216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("pixel vector[" + typename C::String(num, sz) + "]"); 18226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 18236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 18246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 1825d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 1826d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant else 1827d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 18286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant typename C::String num; 18296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = first+2; 18306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (*t1 != '_') 1831d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 18326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_expression(t1, last, db); 18336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != t1) 18346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 1835753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 1836753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 18376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant num = db.names.back().move_full(); 18386c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 18396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t1 = t; 18406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 1841d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 18426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != last && *t1 == '_' && ++t1 != last) 1843d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 18446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_type(t1, last, db); 18456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != t1) 18466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 1847753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 1848753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 18496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first += " vector[" + num + "]"; 18506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 18516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 1852d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 1853d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 1854d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 18556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 18566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 1857d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 18586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <type> ::= <builtin-type> 18596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= <function-type> 18606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= <class-enum-type> 18616c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= <array-type> 18626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= <pointer-to-member-type> 18636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= <template-param> 18646c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= <template-template-param> <template-args> 18656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= <decltype> 18666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= <substitution> 18676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= <CV-qualifiers> <type> 18686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= P <type> # pointer-to 18696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= R <type> # reference-to 18706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= O <type> # rvalue reference-to (C++0x) 18716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= C <type> # complex pair (C 2000) 18726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= G <type> # imaginary (C 2000) 18736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= Dp <type> # pack expansion (C++0x) 18746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= U <source-name> <type> # vendor extended type qualifier 187519e36dddb0023fad0c609328e6686d1bbbced718Howard Hinnant// extension := U <objc-name> <objc-type> # objc-type<identifier> 18766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// extension := <vector-type> # <vector-type> starts with Dv 1877d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 187819e36dddb0023fad0c609328e6686d1bbbced718Howard Hinnant// <objc-name> ::= <k0 number> objcproto <k1 number> <identifier> # k0 = 9 + <number of digits in k1> + k1 187919e36dddb0023fad0c609328e6686d1bbbced718Howard Hinnant// <objc-type> := <source-name> # PU<11+>objcproto 11objc_object<source-name> 11objc_object -> id<source-name> 188019e36dddb0023fad0c609328e6686d1bbbced718Howard Hinnant 18816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 18826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 18836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_type(const char* first, const char* last, C& db) 18846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 18856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (first != last) 1886d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 1887d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant switch (*first) 1888d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 18896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'r': 1890d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant case 'V': 18916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'K': 18926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 18936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant unsigned cv = 0; 18946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_cv_qualifiers(first, last, cv); 18956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first) 1896f270035a31a0abd92c1592ba0e87db0016127c3eHoward Hinnant { 18976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant bool is_function = *t == 'F'; 18986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant size_t k0 = db.names.size(); 18996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = parse_type(t, last, db); 19006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant size_t k1 = db.names.size(); 19016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != t) 1902f270035a31a0abd92c1592ba0e87db0016127c3eHoward Hinnant { 19036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (is_function) 19046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.subs.pop_back(); 19056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.subs.emplace_back(db.names.get_allocator()); 19066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant for (size_t k = k0; k < k1; ++k) 1907f270035a31a0abd92c1592ba0e87db0016127c3eHoward Hinnant { 19086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (is_function) 19096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 19106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant size_t p = db.names[k].second.size(); 19116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (db.names[k].second[p-2] == '&') 19126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant p -= 3; 19136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else if (db.names[k].second.back() == '&') 19146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant p -= 2; 19156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (cv & 1) 19166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 19176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names[k].second.insert(p, " const"); 19186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant p += 6; 19196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 19206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (cv & 2) 19216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 19226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names[k].second.insert(p, " volatile"); 19236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant p += 9; 19246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 19256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (cv & 4) 19266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names[k].second.insert(p, " restrict"); 19276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 19286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 19296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 19306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (cv & 1) 19316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names[k].first.append(" const"); 19326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (cv & 2) 19336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names[k].first.append(" volatile"); 19346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (cv & 4) 19356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names[k].first.append(" restrict"); 19366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 19376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.subs.back().push_back(db.names[k]); 1938f270035a31a0abd92c1592ba0e87db0016127c3eHoward Hinnant } 19396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t1; 1940f270035a31a0abd92c1592ba0e87db0016127c3eHoward Hinnant } 1941f270035a31a0abd92c1592ba0e87db0016127c3eHoward Hinnant } 19426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 1943f270035a31a0abd92c1592ba0e87db0016127c3eHoward Hinnant break; 1944d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant default: 19456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 19466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_builtin_type(first, last, db); 19476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first) 1948d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 19496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 19506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 19516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 1952d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 19536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (*first) 1954d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 19556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'A': 19566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_array_type(first, last, db); 19576c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first) 19586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 1959753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 1960753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 1961d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant first = t; 19626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); 19636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 19646c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 19656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'C': 19666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_type(first+1, last, db); 19676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+1) 19686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 1969753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 1970753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 19716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.append(" complex"); 1972d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant first = t; 19736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); 19746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 19756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 19766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'F': 19776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_function_type(first, last, db); 19786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first) 19796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 1980753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 1981753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 19826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 19836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); 19846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 19856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 19866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'G': 19876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_type(first+1, last, db); 19886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+1) 19896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 1990753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 1991753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 19926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.append(" imaginary"); 19936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 19946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); 19956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 19966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 19976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'M': 19986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_pointer_to_member_type(first, last, db); 19996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first) 20006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 2001753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 2002753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 20036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 20046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); 20056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 20066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 20076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'O': 20086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 20096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant size_t k0 = db.names.size(); 20106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_type(first+1, last, db); 20116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant size_t k1 = db.names.size(); 20126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+1) 2013d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 20146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.subs.emplace_back(db.names.get_allocator()); 20156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant for (size_t k = k0; k < k1; ++k) 2016d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 20176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (db.names[k].second.substr(0, 2) == " [") 20186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 20196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names[k].first += " ("; 20206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names[k].second.insert(0, ")"); 20216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 20226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else if (db.names[k].second.front() == '(') 20236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 20246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names[k].first += "("; 20256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names[k].second.insert(0, ")"); 20266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 20276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names[k].first.append("&&"); 20286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.subs.back().push_back(db.names[k]); 2029d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 20306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 2031d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 20326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 20336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 20346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'P': 20356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 20366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant size_t k0 = db.names.size(); 20376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_type(first+1, last, db); 20386c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant size_t k1 = db.names.size(); 20396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+1) 2040d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 20416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.subs.emplace_back(db.names.get_allocator()); 20426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant for (size_t k = k0; k < k1; ++k) 20436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 20446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (db.names[k].second.substr(0, 2) == " [") 20456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 20466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names[k].first += " ("; 20476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names[k].second.insert(0, ")"); 20486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 20496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else if (db.names[k].second.front() == '(') 20506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 20516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names[k].first += "("; 20526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names[k].second.insert(0, ")"); 20536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 205419e36dddb0023fad0c609328e6686d1bbbced718Howard Hinnant if (first[1] != 'U' || db.names[k].first.substr(0, 12) != "objc_object<") 205519e36dddb0023fad0c609328e6686d1bbbced718Howard Hinnant { 205619e36dddb0023fad0c609328e6686d1bbbced718Howard Hinnant db.names[k].first.append("*"); 205719e36dddb0023fad0c609328e6686d1bbbced718Howard Hinnant } 205819e36dddb0023fad0c609328e6686d1bbbced718Howard Hinnant else 205919e36dddb0023fad0c609328e6686d1bbbced718Howard Hinnant { 206019e36dddb0023fad0c609328e6686d1bbbced718Howard Hinnant db.names[k].first.replace(0, 11, "id"); 206119e36dddb0023fad0c609328e6686d1bbbced718Howard Hinnant } 20626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.subs.back().push_back(db.names[k]); 20636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 2064d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant first = t; 2065d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 20666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 20676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 20686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'R': 20696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 20706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant size_t k0 = db.names.size(); 20716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_type(first+1, last, db); 20726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant size_t k1 = db.names.size(); 20736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+1) 2074d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 20756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.subs.emplace_back(db.names.get_allocator()); 20766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant for (size_t k = k0; k < k1; ++k) 2077d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 20786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (db.names[k].second.substr(0, 2) == " [") 20796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 20806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names[k].first += " ("; 20816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names[k].second.insert(0, ")"); 20826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 20836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else if (db.names[k].second.front() == '(') 20846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 20856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names[k].first += "("; 20866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names[k].second.insert(0, ")"); 20876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 20886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names[k].first.append("&"); 20896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.subs.back().push_back(db.names[k]); 2090d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 20916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 2092d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 20936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 20946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 20956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'T': 20966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 20976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant size_t k0 = db.names.size(); 20986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_template_param(first, last, db); 20996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant size_t k1 = db.names.size(); 21006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first) 2101d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 21026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.subs.emplace_back(db.names.get_allocator()); 21036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant for (size_t k = k0; k < k1; ++k) 21046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.subs.back().push_back(db.names[k]); 21056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (db.try_to_parse_template_args && k1 == k0+1) 2106d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 21076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = parse_template_args(t, last, db); 21086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != t) 21096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 21106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto args = db.names.back().move_full(); 21116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 21126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first += std::move(args); 21136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); 21146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = t1; 21156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 2116d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 21176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 2118d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 21196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 21206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 21216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'U': 21226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (first+1 != last) 2123d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 21246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_source_name(first+1, last, db); 21256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+1) 2126d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 21276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t2 = parse_type(t, last, db); 21286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t2 != t) 21296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 2130753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.size() < 2) 2131753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 213219e36dddb0023fad0c609328e6686d1bbbced718Howard Hinnant auto type = db.names.back().move_full(); 21336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 213419e36dddb0023fad0c609328e6686d1bbbced718Howard Hinnant if (db.names.back().first.substr(0, 9) != "objcproto") 213519e36dddb0023fad0c609328e6686d1bbbced718Howard Hinnant { 213619e36dddb0023fad0c609328e6686d1bbbced718Howard Hinnant db.names.back() = type + " " + db.names.back().move_full(); 213719e36dddb0023fad0c609328e6686d1bbbced718Howard Hinnant } 213819e36dddb0023fad0c609328e6686d1bbbced718Howard Hinnant else 213919e36dddb0023fad0c609328e6686d1bbbced718Howard Hinnant { 214019e36dddb0023fad0c609328e6686d1bbbced718Howard Hinnant auto proto = db.names.back().move_full(); 214119e36dddb0023fad0c609328e6686d1bbbced718Howard Hinnant db.names.pop_back(); 214219e36dddb0023fad0c609328e6686d1bbbced718Howard Hinnant t = parse_source_name(proto.data() + 9, proto.data() + proto.size(), db); 214319e36dddb0023fad0c609328e6686d1bbbced718Howard Hinnant if (t != proto.data() + 9) 214419e36dddb0023fad0c609328e6686d1bbbced718Howard Hinnant { 214519e36dddb0023fad0c609328e6686d1bbbced718Howard Hinnant db.names.back() = type + "<" + db.names.back().move_full() + ">"; 214619e36dddb0023fad0c609328e6686d1bbbced718Howard Hinnant } 214719e36dddb0023fad0c609328e6686d1bbbced718Howard Hinnant else 214819e36dddb0023fad0c609328e6686d1bbbced718Howard Hinnant { 214919e36dddb0023fad0c609328e6686d1bbbced718Howard Hinnant db.names.push_back(type + " " + proto); 215019e36dddb0023fad0c609328e6686d1bbbced718Howard Hinnant } 215119e36dddb0023fad0c609328e6686d1bbbced718Howard Hinnant } 21526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); 21536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t2; 21546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 2155d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 2156d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 21576c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 21586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'S': 21596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (first+1 != last && first[1] == 't') 21606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 21616c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_name(first, last, db); 21626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first) 21636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 2164753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 2165753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 21666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); 21676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 21686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 21696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 21706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 21716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 21726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_substitution(first, last, db); 21736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first) 21746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 21756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 21766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant // Parsed a substitution. If the substitution is a 21776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant // <template-param> it might be followed by <template-args>. 21786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_template_args(first, last, db); 21796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first) 21806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 2181753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.size() < 2) 2182753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 21836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto template_args = db.names.back().move_full(); 21846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 21856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first += template_args; 21866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant // Need to create substitution for <template-template-param> <template-args> 21876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); 21886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 21896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 21906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 21916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 21926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 21936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'D': 21946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (first+1 != last) 21956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 21966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (first[1]) 21976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 21986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'p': 21996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 22006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant size_t k0 = db.names.size(); 22016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_type(first+2, last, db); 22026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant size_t k1 = db.names.size(); 2203f672517e714ff464978992a363dce47de2207472Howard Hinnant if (t != first+2) 22046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 22056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.subs.emplace_back(db.names.get_allocator()); 22066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant for (size_t k = k0; k < k1; ++k) 22076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.subs.back().push_back(db.names[k]); 22086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 22096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 22106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 22116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 22126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 22136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 't': 22146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'T': 22156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_decltype(first, last, db); 22166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first) 22176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 2218753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 2219753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 22206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); 22216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 22226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 22236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 22246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 22256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'v': 22266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_vector_type(first, last, db); 22276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first) 22286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 2229753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 2230753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 22316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); 22326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 22336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 22346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 22356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 22366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 22376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 22386c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant // drop through 22396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant default: 22406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant // must check for builtin-types before class-enum-types to avoid 22416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant // ambiguities with operator-names 22426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_builtin_type(first, last, db); 22436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first) 2244d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 2245d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant first = t; 2246d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 22476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 2248d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 22496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_name(first, last, db); 22506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first) 22516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 2252753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 2253753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 22546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); 22556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 22566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 2257d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 22586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 2259d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 22606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 22616c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 22626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 22636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 22646c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 22656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 22666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 22676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 22686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <operator-name> 22696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= aa # && 22706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= ad # & (unary) 22716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= an # & 22726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= aN # &= 22736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= aS # = 22746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= cl # () 22756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= cm # , 22766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= co # ~ 22776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= cv <type> # (cast) 22786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= da # delete[] 22796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= de # * (unary) 22806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= dl # delete 22816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= dv # / 22826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= dV # /= 22836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= eo # ^ 22846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= eO # ^= 22856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= eq # == 22866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= ge # >= 22876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= gt # > 22886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= ix # [] 22896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= le # <= 2290f29757a358ae9c07d3a768a5b40543fae9d768ddHoward Hinnant// ::= li <source-name> # operator "" 22916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= ls # << 22926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= lS # <<= 22936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= lt # < 22946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= mi # - 22956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= mI # -= 22966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= ml # * 22976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= mL # *= 22986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= mm # -- (postfix in <expression> context) 22996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= na # new[] 23006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= ne # != 23016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= ng # - (unary) 23026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= nt # ! 23036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= nw # new 23046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= oo # || 23056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= or # | 23066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= oR # |= 23076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= pm # ->* 23086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= pl # + 23096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= pL # += 23106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= pp # ++ (postfix in <expression> context) 23116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= ps # + (unary) 23126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= pt # -> 23136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= qu # ? 23146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= rm # % 23156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= rM # %= 23166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= rs # >> 23176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= rS # >>= 23186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= v <digit> <source-name> # vendor extended operator 23196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 23206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 23216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 23226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_operator_name(const char* first, const char* last, C& db) 23236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 23246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last - first >= 2) 23256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 23266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (first[0]) 23276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 23286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'a': 23296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (first[1]) 23306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 23316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'a': 23326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator&&"); 23336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 23346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 23356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'd': 23366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'n': 23376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator&"); 23386c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 23396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 23406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'N': 23416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator&="); 23426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 23436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 23446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'S': 23456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator="); 23466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 2347d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 2348d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 2349d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 2350d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant case 'c': 2351d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant switch (first[1]) 2352d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 2353d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant case 'l': 23546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator()"); 23556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 2356d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 2357d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant case 'm': 23586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator,"); 23596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 2360d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 2361d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant case 'o': 23626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator~"); 23636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 2364d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 2365d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant case 'v': 2366d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 23676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant bool try_to_parse_template_args = db.try_to_parse_template_args; 23686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.try_to_parse_template_args = false; 23696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_type(first+2, last, db); 23706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.try_to_parse_template_args = try_to_parse_template_args; 23716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+2) 2372d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 2373753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 2374753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 23756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.insert(0, "operator "); 23766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.parsed_ctor_dtor_cv = true; 23776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 2378d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 2379d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 2380d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 2381d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 2382d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 2383d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant case 'd': 2384d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant switch (first[1]) 2385d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 2386d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant case 'a': 23876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator delete[]"); 23886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 2389d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 2390d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant case 'e': 23916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator*"); 23926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 2393d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 2394d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant case 'l': 23956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator delete"); 23966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 23976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 23986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'v': 23996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator/"); 24006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 24016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 24026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'V': 24036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator/="); 24046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 24056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 24066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 24076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 24086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'e': 24096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (first[1]) 24106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 24116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'o': 24126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator^"); 24136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 24146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 24156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'O': 24166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator^="); 24176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 24186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 24196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'q': 24206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator=="); 24216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 24226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 24236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 24246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 24256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'g': 24266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (first[1]) 24276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 24286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'e': 24296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator>="); 24306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 24316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 24326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 't': 24336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator>"); 24346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 24356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 24366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 24376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 24386c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'i': 24396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (first[1] == 'x') 24406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 24416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator[]"); 24426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 24436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 24446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 24456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'l': 24466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (first[1]) 24476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 24486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'e': 24496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator<="); 24506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 24516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 2452f29757a358ae9c07d3a768a5b40543fae9d768ddHoward Hinnant case 'i': 2453f29757a358ae9c07d3a768a5b40543fae9d768ddHoward Hinnant { 2454f29757a358ae9c07d3a768a5b40543fae9d768ddHoward Hinnant const char* t = parse_source_name(first+2, last, db); 2455f29757a358ae9c07d3a768a5b40543fae9d768ddHoward Hinnant if (t != first+2) 2456f29757a358ae9c07d3a768a5b40543fae9d768ddHoward Hinnant { 2457f29757a358ae9c07d3a768a5b40543fae9d768ddHoward Hinnant if (db.names.empty()) 2458f29757a358ae9c07d3a768a5b40543fae9d768ddHoward Hinnant return first; 2459f29757a358ae9c07d3a768a5b40543fae9d768ddHoward Hinnant db.names.back().first.insert(0, "operator\"\" "); 2460f29757a358ae9c07d3a768a5b40543fae9d768ddHoward Hinnant first = t; 2461f29757a358ae9c07d3a768a5b40543fae9d768ddHoward Hinnant } 2462f29757a358ae9c07d3a768a5b40543fae9d768ddHoward Hinnant } 2463f29757a358ae9c07d3a768a5b40543fae9d768ddHoward Hinnant break; 24646c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 's': 24656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator<<"); 24666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 24676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 24686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'S': 24696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator<<="); 24706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 24716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 24726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 't': 24736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator<"); 24746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 24756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 24766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 24776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 24786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'm': 24796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (first[1]) 24806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 24816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'i': 24826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator-"); 24836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 24846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 24856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'I': 24866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator-="); 24876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 24886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 24896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'l': 24906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator*"); 24916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 24926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 24936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'L': 24946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator*="); 24956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 24966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 24976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'm': 24986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator--"); 24996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 25006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 25016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 25026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 25036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'n': 25046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (first[1]) 25056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 25066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'a': 25076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator new[]"); 25086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 25096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 25106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'e': 25116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator!="); 25126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 25136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 25146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'g': 25156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator-"); 25166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 25176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 25186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 't': 25196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator!"); 25206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 25216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 25226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'w': 25236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator new"); 25246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 25256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 25266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 25276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 25286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'o': 25296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (first[1]) 25306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 25316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'o': 25326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator||"); 25336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 25346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 25356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'r': 25366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator|"); 25376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 25386c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 25396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'R': 25406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator|="); 25416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 25426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 25436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 25446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 25456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'p': 25466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (first[1]) 25476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 25486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'm': 25496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator->*"); 25506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 25516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 25526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'l': 25536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator+"); 25546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 25556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 25566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'L': 25576c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator+="); 25586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 25596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 25606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'p': 25616c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator++"); 25626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 25636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 25646c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 's': 25656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator+"); 25666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 25676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 25686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 't': 25696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator->"); 25706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 25716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 25726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 25736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 25746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'q': 25756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (first[1] == 'u') 25766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 25776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator?"); 25786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 25796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 25806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 25816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'r': 25826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (first[1]) 25836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 25846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'm': 25856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator%"); 25866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 2587d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 25886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'M': 25896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator%="); 25906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 2591d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 25926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 's': 25936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator>>"); 25946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 25956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 25966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'S': 25976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("operator>>="); 25986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 2599d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 2600d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 2601d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 26026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'v': 26036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (std::isdigit(first[1])) 2604d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 26056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_source_name(first+2, last, db); 26066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+2) 2607d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 2608753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 2609753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 26106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.insert(0, "operator "); 26116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 2612d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 26136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 26146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 26156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 26166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 26176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 26186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 26196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 26206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 26216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 26226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_integer_literal(const char* first, const char* last, const typename C::String& lit, C& db) 26236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 26246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_number(first, last); 26256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first && t != last && *t == 'E') 26266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 26276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (lit.size() > 3) 26286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("(" + lit + ")"); 26296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 26306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.emplace_back(); 26316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (*first == 'n') 26326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 26336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first += '-'; 26346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++first; 26356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 26366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.append(first, t); 26376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (lit.size() <= 3) 26386c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first += lit; 26396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t+1; 26406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 26416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 26426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 26436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 26446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <expr-primary> ::= L <type> <value number> E # integer literal 26456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= L <type> <value float> E # floating literal 26466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= L <string type> E # string literal 26476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= L <nullptr type> E # nullptr literal (i.e., "LDnE") 26486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= L <type> <real-part float> _ <imag-part float> E # complex floating point literal (C 2000) 26496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= L <mangled-name> E # external name 26506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 26516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 26526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 26536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_expr_primary(const char* first, const char* last, C& db) 26546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 26556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last - first >= 4 && *first == 'L') 26566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 26576c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (first[1]) 26586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 26596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'w': 266093433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant { 266193433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant const char* t = parse_integer_literal(first+2, last, "wchar_t", db); 266293433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 266393433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 266493433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant } 266593433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 26666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'b': 26676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (first[3] == 'E') 26686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 26696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (first[2]) 2670d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 26716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case '0': 26726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("false"); 26736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 4; 26746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 26756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case '1': 26766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("true"); 26776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 4; 26786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 2679d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 26806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 26816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 26826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'c': 268393433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant { 268493433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant const char* t = parse_integer_literal(first+2, last, "char", db); 268593433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 268693433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 268793433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant } 268893433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 26896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'a': 269093433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant { 269193433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant const char* t = parse_integer_literal(first+2, last, "signed char", db); 269293433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 269393433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 269493433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant } 269593433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 26966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'h': 269793433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant { 269893433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant const char* t = parse_integer_literal(first+2, last, "unsigned char", db); 269993433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 270093433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 270193433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant } 270293433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 27036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 's': 270493433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant { 270593433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant const char* t = parse_integer_literal(first+2, last, "short", db); 270693433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 270793433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 270893433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant } 270993433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 27106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 't': 271193433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant { 271293433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant const char* t = parse_integer_literal(first+2, last, "unsigned short", db); 271393433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 271493433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 271593433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant } 271693433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 27176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'i': 271893433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant { 271993433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant const char* t = parse_integer_literal(first+2, last, "", db); 272093433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 272193433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 272293433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant } 272393433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 27246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'j': 272593433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant { 272693433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant const char* t = parse_integer_literal(first+2, last, "u", db); 272793433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 272893433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 272993433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant } 273093433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 27316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'l': 273293433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant { 273393433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant const char* t = parse_integer_literal(first+2, last, "l", db); 273493433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 273593433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 273693433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant } 273793433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 27386c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'm': 273993433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant { 274093433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant const char* t = parse_integer_literal(first+2, last, "ul", db); 274193433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 274293433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 274393433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant } 274493433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 27456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'x': 274693433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant { 274793433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant const char* t = parse_integer_literal(first+2, last, "ll", db); 274893433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 274993433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 275093433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant } 275193433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 27526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'y': 275393433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant { 275493433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant const char* t = parse_integer_literal(first+2, last, "ull", db); 275593433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 275693433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 275793433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant } 275893433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 27596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'n': 276093433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant { 276193433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant const char* t = parse_integer_literal(first+2, last, "__int128", db); 276293433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 276393433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 276493433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant } 276593433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 27666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'o': 276793433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant { 276893433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant const char* t = parse_integer_literal(first+2, last, "unsigned __int128", db); 276993433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 277093433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 277193433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant } 277293433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 27736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'f': 277493433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant { 277593433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant const char* t = parse_floating_number<float>(first+2, last, db); 277693433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 277793433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 277893433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant } 277993433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 27806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'd': 278193433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant { 278293433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant const char* t = parse_floating_number<double>(first+2, last, db); 278393433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 278493433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 278593433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant } 278693433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 27876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'e': 278893433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant { 278993433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant const char* t = parse_floating_number<long double>(first+2, last, db); 279093433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 279193433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 279293433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant } 279393433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 27946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case '_': 27956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (first[2] == 'Z') 27966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 27976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_encoding(first+3, last, db); 27986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+3 && t != last && *t == 'E') 27996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t+1; 28006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 28016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 28026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'T': 28036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant // Invalid mangled name per 28046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant // http://sourcerytools.com/pipermail/cxx-abi-dev/2011-August/002422.html 28056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 28066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant default: 28076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 28086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant // might be named type 28096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_type(first+1, last, db); 28106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+1 && t != last) 2811d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 28126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (*t != 'E') 2813d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 28146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* n = t; 28156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant for (; n != last && isdigit(*n); ++n) 28166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ; 28176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (n != t && n != last && *n == 'E') 2818d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 2819753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 2820753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 28216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back() = "(" + db.names.back().move_full() + ")" + typename C::String(t, n); 28226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = n+1; 28236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 2824d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 2825d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 28266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 2827d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 28286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t+1; 28296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 2830d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 2831d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 28326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 28336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 28346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 28356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 28366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 28376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 28386c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class String> 28396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard HinnantString 28406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantbase_name(String& s) 28416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 28426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (s.empty()) 28436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return s; 28446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (s == "std::string") 28456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 28466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant s = "std::basic_string<char, std::char_traits<char>, std::allocator<char> >"; 28476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return "basic_string"; 28486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 28496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (s == "std::istream") 28506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 28516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant s = "std::basic_istream<char, std::char_traits<char> >"; 28526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return "basic_istream"; 28536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 28546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (s == "std::ostream") 28556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 28566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant s = "std::basic_ostream<char, std::char_traits<char> >"; 28576c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return "basic_ostream"; 28586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 28596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (s == "std::iostream") 28606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 28616c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant s = "std::basic_iostream<char, std::char_traits<char> >"; 28626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return "basic_iostream"; 28636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 28646c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* const pf = s.data(); 28656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* pe = pf + s.size(); 28666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (pe[-1] == '>') 28676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 28686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant unsigned c = 1; 28696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant while (true) 28706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 28716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (--pe == pf) 28726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return String(); 28736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (pe[-1] == '<') 28746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 28756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (--c == 0) 2876d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 28776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant --pe; 28786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 2879d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 2880d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 28816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else if (pe[-1] == '>') 28826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++c; 28836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 28846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 28856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* p0 = pe - 1; 28866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant for (; p0 != pf; --p0) 28876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 28886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (*p0 == ':') 28896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 28906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++p0; 2891d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 28926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 28936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 28946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return String(p0, pe); 28956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 28966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 28976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <ctor-dtor-name> ::= C1 # complete object constructor 28986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= C2 # base object constructor 28996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= C3 # complete object allocating constructor 29006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// extension ::= C5 # ? 29016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= D0 # deleting destructor 29026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= D1 # complete object destructor 29036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= D2 # base object destructor 29046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// extension ::= D5 # ? 29056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 29066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 29076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 29086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_ctor_dtor_name(const char* first, const char* last, C& db) 29096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 29106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last-first >= 2 && !db.names.empty()) 29116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 29126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (first[0]) 29136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 29146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'C': 2915d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant switch (first[1]) 2916d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 29176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case '1': 29186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case '2': 29196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case '3': 29206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case '5': 2921753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 2922753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 29236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back(base_name(db.names.back().first)); 29246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 29256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.parsed_ctor_dtor_cv = true; 2926d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 29276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 29286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 29296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'D': 29306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (first[1]) 29316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 29326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case '0': 29336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case '1': 29346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case '2': 29356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case '5': 2936753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 2937753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 29386c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("~" + base_name(db.names.back().first)); 29396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 29406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.parsed_ctor_dtor_cv = true; 2941d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 2942d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 29436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 29446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 29456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 29466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 29476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 29486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 29496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <unnamed-type-name> ::= Ut [ <nonnegative number> ] _ 29506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= <closure-type-name> 29516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// 29526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _ 29536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// 29546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <lambda-sig> ::= <parameter type>+ # Parameter types or "v" if the lambda has no parameters 29556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 29566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 29576c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 29586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_unnamed_type_name(const char* first, const char* last, C& db) 29596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 29606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last - first > 2 && first[0] == 'U') 29616c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 29626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant char type = first[1]; 29636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (type) 29646c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 29656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 't': 29666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 29676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back(typename C::String("'unnamed")); 29686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t0 = first+2; 29696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t0 == last) 29706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 29716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 29726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 29736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 29746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (std::isdigit(*t0)) 29756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 29766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = t0 + 1; 29776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant while (t1 != last && std::isdigit(*t1)) 29786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++t1; 29796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.append(t0, t1); 29806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t0 = t1; 29816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 29826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.push_back('\''); 29836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t0 == last || *t0 != '_') 29846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 29856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 29866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 29876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 29886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t0 + 1; 29896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 2990d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 2991d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant case 'l': 29926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 29936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back(typename C::String("'lambda'(")); 29946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t0 = first+2; 29956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (first[2] == 'v') 2996d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 29976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first += ')'; 29986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++t0; 29996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 30006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 30016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 30026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = parse_type(t0, last, db); 30036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 == t0) 3004d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 30056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 30066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 3007d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 3008753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.size() < 2) 3009753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 30106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto tmp = db.names.back().move_full(); 30116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 30126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.append(tmp); 30136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t0 = t1; 30146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant while (true) 3015d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 30166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t1 = parse_type(t0, last, db); 30176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 == t0) 30186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 3019753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.size() < 2) 3020753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 30216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant tmp = db.names.back().move_full(); 30226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 30236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (!tmp.empty()) 3024d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 30256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.append(", "); 30266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.append(tmp); 3027d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 30286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t0 = t1; 3029d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 30306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.append(")"); 30316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 30326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t0 == last || *t0 != 'E') 30336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 30346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 30356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 30366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 30376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++t0; 30386c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t0 == last) 30396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 30406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 30416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 30426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 30436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (std::isdigit(*t0)) 30446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 30456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = t0 + 1; 30466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant while (t1 != last && std::isdigit(*t1)) 30476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++t1; 30486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.insert(db.names.back().first.begin()+7, t0, t1); 30496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t0 = t1; 30506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 30516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t0 == last || *t0 != '_') 30526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 30536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 30546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 30556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 30566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t0 + 1; 30576c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 30586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 30596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 30606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 30616c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 30626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 30636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 30646c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <unqualified-name> ::= <operator-name> 30656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= <ctor-dtor-name> 30666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= <source-name> 30676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= <unnamed-type-name> 30686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 30696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 30706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 30716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_unqualified_name(const char* first, const char* last, C& db) 30726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 30736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (first != last) 30746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 30756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t; 30766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (*first) 30776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 30786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'C': 30796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'D': 30806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_ctor_dtor_name(first, last, db); 30816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first) 30826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 30836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 30846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'U': 30856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_unnamed_type_name(first, last, db); 30866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first) 30876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 30886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 30896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case '1': 30906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case '2': 30916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case '3': 30926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case '4': 30936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case '5': 30946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case '6': 30956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case '7': 30966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case '8': 30976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case '9': 30986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_source_name(first, last, db); 30996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first) 31006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 31016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 31026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant default: 31036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_operator_name(first, last, db); 31046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first) 31056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 31066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 31076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant }; 31086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 31096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 31106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 31116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 31126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <unscoped-name> ::= <unqualified-name> 31136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= St <unqualified-name> # ::std:: 31146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// extension ::= StL<unqualified-name> 31156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 31166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 31176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 31186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_unscoped_name(const char* first, const char* last, C& db) 31196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 31206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last - first >= 2) 31216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 31226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t0 = first; 31236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant bool St = false; 31246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (first[0] == 'S' && first[1] == 't') 31256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 31266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t0 += 2; 31276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant St = true; 31286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t0 != last && *t0 == 'L') 31296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++t0; 31306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 31316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = parse_unqualified_name(t0, last, db); 31326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != t0) 31336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 31346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (St) 3135753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant { 3136753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 3137753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 31386c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.insert(0, "std::"); 3139753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant } 31406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t1; 31416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 31426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 31436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 31446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 31456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 31466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// at <type> # alignof (a type) 31476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 31486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 31496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 31506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_alignof_type(const char* first, const char* last, C& db) 31516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 31526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last - first >= 3 && first[0] == 'a' && first[1] == 't') 31536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 31546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_type(first+2, last, db); 31556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+2) 31566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 3157753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 3158753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 31596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first = "alignof (" + db.names.back().move_full() + ")"; 31606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 31616c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 31626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 31636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 31646c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 31656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 31666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// az <expression> # alignof (a expression) 31676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 31686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 31696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 31706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_alignof_expr(const char* first, const char* last, C& db) 31716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 31726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last - first >= 3 && first[0] == 'a' && first[1] == 'z') 31736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 31746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_expression(first+2, last, db); 31756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+2) 31766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 3177753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 3178753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 31796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first = "alignof (" + db.names.back().move_full() + ")"; 31806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 31816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 31826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 31836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 31846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 31856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 31866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 31876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 31886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_noexcept_expression(const char* first, const char* last, C& db) 31896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 31906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = parse_expression(first, last, db); 31916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != first) 31926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 3193753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 3194753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 31956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first = "noexcept (" + db.names.back().move_full() + ")"; 31966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t1; 31976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 31986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 31996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 32006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 32016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 32026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 32036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_prefix_expression(const char* first, const char* last, const typename C::String& op, C& db) 32046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 32056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = parse_expression(first, last, db); 32066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != first) 32076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 3208753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 3209753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 32106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first = op + "(" + db.names.back().move_full() + ")"; 32116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t1; 32126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 32136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 32146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 32156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 32166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 32176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 32186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_binary_expression(const char* first, const char* last, const typename C::String& op, C& db) 32196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 32206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = parse_expression(first, last, db); 32216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != first) 32226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 32236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t2 = parse_expression(t1, last, db); 32246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t2 != t1) 32256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 3226753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.size() < 2) 3227753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 32286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto op2 = db.names.back().move_full(); 32296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 32306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto op1 = db.names.back().move_full(); 32316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto& nm = db.names.back().first; 32326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant nm.clear(); 32336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (op == ">") 32346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant nm += '('; 32356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant nm += "(" + op1 + ") " + op + " (" + op2 + ")"; 32366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (op == ">") 32376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant nm += ')'; 32386c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t2; 32396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 32406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 32416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 32426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 32436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 32446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 32456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 32466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <expression> ::= <unary operator-name> <expression> 32476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= <binary operator-name> <expression> <expression> 32486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= <ternary operator-name> <expression> <expression> <expression> 32496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= cl <expression>+ E # call 32506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= cv <type> <expression> # conversion with one argument 32516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= cv <type> _ <expression>* E # conversion with a different number of arguments 32526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= [gs] nw <expression>* _ <type> E # new (expr-list) type 32536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= [gs] nw <expression>* _ <type> <initializer> # new (expr-list) type (init) 32546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= [gs] na <expression>* _ <type> E # new[] (expr-list) type 32556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= [gs] na <expression>* _ <type> <initializer> # new[] (expr-list) type (init) 32566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= [gs] dl <expression> # delete expression 32576c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= [gs] da <expression> # delete[] expression 32586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= pp_ <expression> # prefix ++ 32596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= mm_ <expression> # prefix -- 32606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= ti <type> # typeid (type) 32616c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= te <expression> # typeid (expression) 32626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= dc <type> <expression> # dynamic_cast<type> (expression) 32636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= sc <type> <expression> # static_cast<type> (expression) 32646c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= cc <type> <expression> # const_cast<type> (expression) 32656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= rc <type> <expression> # reinterpret_cast<type> (expression) 32666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= st <type> # sizeof (a type) 32676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= sz <expression> # sizeof (an expression) 32686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= at <type> # alignof (a type) 32696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= az <expression> # alignof (an expression) 32706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= nx <expression> # noexcept (expression) 32716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= <template-param> 32726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= <function-param> 32736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= dt <expression> <unresolved-name> # expr.name 32746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= pt <expression> <unresolved-name> # expr->name 32756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= ds <expression> <expression> # expr.*expr 32766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= sZ <template-param> # size of a parameter pack 32776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= sZ <function-param> # size of a function parameter pack 32786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= sp <expression> # pack expansion 32796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= tw <expression> # throw expression 32806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= tr # throw with no operand (rethrow) 32816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= <unresolved-name> # f(p), N::f(p), ::f(p), 32826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// # freestanding dependent name (e.g., T::x), 32836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// # objectless nonstatic member reference 32846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= <expr-primary> 32856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 32866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 32876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 32886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_expression(const char* first, const char* last, C& db) 32896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 32906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last - first >= 2) 32916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 32926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = first; 32936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant bool parsed_gs = false; 32946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last - first >= 4 && t[0] == 'g' && t[1] == 's') 32956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 32966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t += 2; 32976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant parsed_gs = true; 32986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 32996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (*t) 33006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 33016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'L': 33026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = parse_expr_primary(first, last, db); 33036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 33046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'T': 33056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = parse_template_param(first, last, db); 33066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 33076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'f': 33086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = parse_function_param(first, last, db); 33096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 33106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'a': 33116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (t[1]) 33126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 33136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'a': 331493433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_binary_expression(first+2, last, "&&", db); 331593433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 331693433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 331793433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 33186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'd': 331993433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_prefix_expression(first+2, last, "&", db); 332093433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 332193433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 332293433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 33236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'n': 332493433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_binary_expression(first+2, last, "&", db); 332593433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 332693433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 332793433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 33286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'N': 332993433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_binary_expression(first+2, last, "&=", db); 333093433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 333193433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 333293433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 3333d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant case 'S': 333493433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_binary_expression(first+2, last, "=", db); 333593433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 333693433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 333793433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 3338d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant case 't': 33396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = parse_alignof_type(first, last, db); 33406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 33416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'z': 33426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = parse_alignof_expr(first, last, db); 33436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 33446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 33456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 33466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'c': 33476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (t[1]) 33486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 33496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'c': 33506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = parse_const_cast_expr(first, last, db); 33516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 33526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'l': 33536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = parse_call_expr(first, last, db); 33546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 33556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'm': 335693433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_binary_expression(first+2, last, ",", db); 335793433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 335893433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 33596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 33606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'o': 336193433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_prefix_expression(first+2, last, "~", db); 336293433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 336393433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 336493433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 33656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'v': 33666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = parse_conversion_expr(first, last, db); 3367d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 3368d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 3369d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 33706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'd': 33716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (t[1]) 3372d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 33736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'a': 3374d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 33756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = parse_expression(t+2, last, db); 33766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != t+2) 3377d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 3378753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 3379753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 33806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first = (parsed_gs ? typename C::String("::") : typename C::String()) + 33816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant "delete[] " + db.names.back().move_full(); 33826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t1; 3383d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 3384d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 3385d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 33866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'c': 33876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = parse_dynamic_cast_expr(first, last, db); 3388d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 33896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'e': 339093433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_prefix_expression(first+2, last, "*", db); 339193433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 339293433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 339393433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 3394d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant case 'l': 3395d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 33966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = parse_expression(t+2, last, db); 33976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != t+2) 3398d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 3399753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 3400753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 34016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first = (parsed_gs ? typename C::String("::") : typename C::String()) + 34026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant "delete " + db.names.back().move_full(); 34036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t1; 3404d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 3405d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 3406d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 34076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'n': 34086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return parse_unresolved_name(first, last, db); 34096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 's': 34106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = parse_dot_star_expr(first, last, db); 34116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 34126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 't': 34136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = parse_dot_expr(first, last, db); 34146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 34156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'v': 341693433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_binary_expression(first+2, last, "/", db); 341793433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 341893433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 341993433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 34206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'V': 342193433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_binary_expression(first+2, last, "/=", db); 342293433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 342393433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 342493433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 34256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 34266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 34276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'e': 34286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (t[1]) 34296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 34306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'o': 343193433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_binary_expression(first+2, last, "^", db); 343293433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 343393433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 343493433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 34356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'O': 343693433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_binary_expression(first+2, last, "^=", db); 343793433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 343893433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 343993433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 34406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'q': 344193433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_binary_expression(first+2, last, "==", db); 344293433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 344393433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 344493433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 34456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 34466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 34476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'g': 34486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (t[1]) 34496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 34506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'e': 345193433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_binary_expression(first+2, last, ">=", db); 345293433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 345393433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 345493433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 34556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 't': 345693433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_binary_expression(first+2, last, ">", db); 345793433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 345893433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 345993433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 34606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 34616c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 34626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'i': 34636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t[1] == 'x') 34646c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 34656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = parse_expression(first+2, last, db); 34666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != first+2) 3467d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 34686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t2 = parse_expression(t1, last, db); 34696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t2 != t1) 3470d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 3471753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.size() < 2) 3472753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 34736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto op2 = db.names.back().move_full(); 34746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 34756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto op1 = db.names.back().move_full(); 34766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back() = "(" + op1 + ")[" + op2 + "]"; 34776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t2; 3478d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 34796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 34806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 3481d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 34826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 34836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 34846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'l': 34856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (t[1]) 34866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 34876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'e': 348893433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_binary_expression(first+2, last, "<=", db); 348993433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 349093433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 349193433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 34926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 's': 349393433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_binary_expression(first+2, last, "<<", db); 349493433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 349593433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 349693433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 34976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'S': 349893433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_binary_expression(first+2, last, "<<=", db); 349993433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 350093433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 350193433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 35026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 't': 350393433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_binary_expression(first+2, last, "<", db); 350493433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 350593433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 350693433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 35076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 35086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 35096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'm': 35106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (t[1]) 35116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 35126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'i': 351393433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_binary_expression(first+2, last, "-", db); 351493433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 351593433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 351693433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 35176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'I': 351893433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_binary_expression(first+2, last, "-=", db); 351993433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 352093433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 352193433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 35226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'l': 352393433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_binary_expression(first+2, last, "*", db); 352493433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 352593433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 352693433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 35276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'L': 352893433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_binary_expression(first+2, last, "*=", db); 352993433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 353093433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 353193433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 3532d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant case 'm': 35336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (first+2 != last && first[2] == '_') 353493433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant { 353593433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_prefix_expression(first+3, last, "--", db); 353693433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+3) 353793433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 353893433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant } 35396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 3540d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 35416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = parse_expression(first+2, last, db); 35426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != first+2) 3543d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 3544753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 3545753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 35466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back() = "(" + db.names.back().move_full() + ")--"; 35476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t1; 3548d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 3549d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 3550d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 3551d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 3552d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 3553d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant case 'n': 35546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (t[1]) 3555d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 3556d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant case 'a': 35576c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'w': 35586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = parse_new_expr(first, last, db); 3559d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 3560d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant case 'e': 356193433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_binary_expression(first+2, last, "!=", db); 356293433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 356393433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 356493433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 3565d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant case 'g': 356693433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_prefix_expression(first+2, last, "-", db); 356793433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 356893433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 356993433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 3570d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant case 't': 357193433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_prefix_expression(first+2, last, "!", db); 357293433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 357393433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 357493433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 35756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'x': 357693433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_noexcept_expression(first+2, last, db); 357793433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 357893433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 357993433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 3580d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 3581d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 3582d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant case 'o': 35836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (t[1]) 3584d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 35856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'n': 35866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return parse_unresolved_name(first, last, db); 3587d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant case 'o': 358893433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_binary_expression(first+2, last, "||", db); 358993433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 359093433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 359193433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 3592d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant case 'r': 359393433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_binary_expression(first+2, last, "|", db); 359493433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 359593433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 359693433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 3597d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant case 'R': 359893433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_binary_expression(first+2, last, "|=", db); 359993433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 360093433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 360193433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 3602d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 3603d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 3604d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant case 'p': 36056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (t[1]) 36066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 36076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'm': 360893433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_binary_expression(first+2, last, "->*", db); 360993433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 361093433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 361193433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 36126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'l': 361393433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_binary_expression(first+2, last, "+", db); 361493433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 361593433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 361693433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 36176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'L': 361893433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_binary_expression(first+2, last, "+=", db); 361993433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 362093433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 362193433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 36226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'p': 36236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (first+2 != last && first[2] == '_') 362493433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant { 362593433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_prefix_expression(first+3, last, "++", db); 362693433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+3) 362793433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 362893433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant } 3629d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant else 3630d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 36316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = parse_expression(first+2, last, db); 36326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != first+2) 3633d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 3634753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 3635753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 36366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back() = "(" + db.names.back().move_full() + ")++"; 36376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t1; 3638d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 3639d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 3640d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 36416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 's': 364293433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_prefix_expression(first+2, last, "+", db); 364393433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 364493433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 364593433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 3646d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant case 't': 36476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = parse_arrow_expr(first, last, db); 3648d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 3649d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 3650d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 3651d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant case 'q': 36526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t[1] == 'u') 3653d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 36546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = parse_expression(first+2, last, db); 36556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != first+2) 3656d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 36576c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t2 = parse_expression(t1, last, db); 36586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t2 != t1) 3659d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 36606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t3 = parse_expression(t2, last, db); 36616c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t3 != t2) 3662d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 3663753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.size() < 3) 3664753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 36656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto op3 = db.names.back().move_full(); 36666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 36676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto op2 = db.names.back().move_full(); 36686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 36696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto op1 = db.names.back().move_full(); 36706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back() = "(" + op1 + ") ? (" + op2 + ") : (" + op3 + ")"; 36716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t3; 36726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 36736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 36746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 36756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 36766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 3677d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 3678d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 36796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 36806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 3681d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 3682d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 3683d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 3684d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant case 'r': 36856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (t[1]) 3686d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 36876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'c': 36886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = parse_reinterpret_cast_expr(first, last, db); 3689d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 36906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'm': 369193433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_binary_expression(first+2, last, "%", db); 369293433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 369393433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 369493433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 3695d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant case 'M': 369693433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_binary_expression(first+2, last, "%=", db); 369793433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 369893433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 369993433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 3700d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant case 's': 370193433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_binary_expression(first+2, last, ">>", db); 370293433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 370393433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 370493433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 3705d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant case 'S': 370693433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant t = parse_binary_expression(first+2, last, ">>=", db); 370793433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant if (t != first+2) 370893433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant first = t; 370993433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant break; 3710d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 3711d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 3712d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant case 's': 37136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (t[1]) 3714d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 37156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'c': 37166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = parse_static_cast_expr(first, last, db); 37176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 37186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'p': 37196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = parse_pack_expansion(first, last, db); 37206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 37216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'r': 37226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return parse_unresolved_name(first, last, db); 3723d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant case 't': 37246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = parse_sizeof_type_expr(first, last, db); 3725d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 3726d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant case 'z': 37276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = parse_sizeof_expr_expr(first, last, db); 37286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 37296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'Z': 37306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last - t >= 3) 3731d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 37326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (t[2]) 3733d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 37346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'T': 37356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = parse_sizeof_param_pack_expr(first, last, db); 37366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 37376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'f': 37386c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = parse_sizeof_function_param_pack_expr(first, last, db); 37396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 3740d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 3741d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 3742d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 3743d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 3744d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 37456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 't': 37466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (t[1]) 37476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 37486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'e': 37496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'i': 37506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = parse_typeid_expr(first, last, db); 37516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 37526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'r': 37536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back("throw"); 37546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first += 2; 37556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 37566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'w': 37576c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = parse_throw_expr(first, last, db); 37586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 37596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 37606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 37616c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case '1': 37626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case '2': 37636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case '3': 37646c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case '4': 37656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case '5': 37666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case '6': 37676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case '7': 37686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case '8': 37696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case '9': 37706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return parse_unresolved_name(first, last, db); 3771d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 3772d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 3773d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant return first; 3774d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant} 3775d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 37766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <template-arg> ::= <type> # type or template 37776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= X <expression> E # expression 37786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= <expr-primary> # simple expressions 37796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= J <template-arg>* E # argument pack 37806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= LZ <encoding> E # extension 3781d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 37826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 3783d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnantconst char* 37846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_template_arg(const char* first, const char* last, C& db) 3785d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{ 3786d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant if (first != last) 3787d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 37886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t; 37896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (*first) 3790d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 37916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'X': 37926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_expression(first+1, last, db); 37936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+1) 3794d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 37956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != last && *t == 'E') 37966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t+1; 37976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 37986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 37996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'J': 38006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = first+1; 38016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t == last) 38026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 38036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant while (*t != 'E') 38046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 38056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = parse_template_arg(t, last, db); 38066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 == t) 3807d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant return first; 38086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = t1; 38096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 38106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t+1; 38116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 38126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'L': 38136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant // <expr-primary> or LZ <encoding> E 38146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (first+1 != last && first[1] == 'Z') 38156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 38166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_encoding(first+2, last, db); 38176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+2 && t != last && *t == 'E') 38186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t+1; 3819d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 3820d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant else 38216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = parse_expr_primary(first, last, db); 38226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 38236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant default: 38246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant // <type> 38256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = parse_type(first, last, db); 38266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 3827d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 3828d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 3829d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant return first; 3830d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant} 3831d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 38326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <template-args> ::= I <template-arg>* E 38336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// extension, the abi says <template-arg>+ 3834d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 38356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 3836d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnantconst char* 38376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_template_args(const char* first, const char* last, C& db) 3838d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{ 38396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last - first >= 2 && *first == 'I') 3840d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 38416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (db.tag_templates) 38426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.template_param.back().clear(); 38436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = first+1; 38446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant typename C::String args("<"); 38456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant while (*t != 'E') 3846d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 38476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (db.tag_templates) 38486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.template_param.emplace_back(db.names.get_allocator()); 38496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant size_t k0 = db.names.size(); 38506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = parse_template_arg(t, last, db); 38516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant size_t k1 = db.names.size(); 38526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (db.tag_templates) 38536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.template_param.pop_back(); 38546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 == t || t1 == last) 38556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 38566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (db.tag_templates) 3857d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 38586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.template_param.back().emplace_back(db.names.get_allocator()); 38596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant for (size_t k = k0; k < k1; ++k) 38606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.template_param.back().back().push_back(db.names[k]); 3861d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 38626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant for (size_t k = k0; k < k1; ++k) 38636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 38646c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (args.size() > 1) 38656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant args += ", "; 38666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant args += db.names[k].move_full(); 38676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 38686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant for (; k1 != k0; --k1) 38696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 38706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = t1; 3871d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 38726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t + 1; 38736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (args.back() != '>') 38746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant args += ">"; 38756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 38766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant args += " >"; 38776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.push_back(std::move(args)); 38786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 3879d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 3880d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant return first; 3881d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant} 3882d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 38836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <nested-name> ::= N [<CV-qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E 38846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= N [<CV-qualifiers>] [<ref-qualifier>] <template-prefix> <template-args> E 3885d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant// 3886d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant// <prefix> ::= <prefix> <unqualified-name> 3887d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant// ::= <template-prefix> <template-args> 3888d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant// ::= <template-param> 3889d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant// ::= <decltype> 3890d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant// ::= # empty 3891d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant// ::= <substitution> 3892d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant// ::= <prefix> <data-member-prefix> 3893d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant// extension ::= L 3894d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant// 3895d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant// <template-prefix> ::= <prefix> <template unqualified-name> 3896d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant// ::= <template-param> 3897d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant// ::= <substitution> 3898d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 38996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 3900d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnantconst char* 3901e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albertparse_nested_name(const char* first, const char* last, C& db, 3902e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert bool* ends_with_template_args) 3903d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{ 3904d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant if (first != last && *first == 'N') 3905d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 39066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant unsigned cv; 39076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t0 = parse_cv_qualifiers(first+1, last, cv); 39086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t0 == last) 39096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 39106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.ref = 0; 39116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (*t0 == 'R') 39126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 39136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.ref = 1; 39146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++t0; 39156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 39166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else if (*t0 == 'O') 39176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 39186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.ref = 2; 39196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++t0; 39206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 39216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.emplace_back(); 3922d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant if (last - t0 >= 2 && t0[0] == 'S' && t0[1] == 't') 3923d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 3924d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant t0 += 2; 39256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first = "std"; 3926d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 39276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t0 == last) 39286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 39296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 39306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 39316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 39326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant bool pop_subs = false; 3933e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert bool component_ends_with_template_args = false; 39346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant while (*t0 != 'E') 39356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 3936e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert component_ends_with_template_args = false; 39376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1; 39386c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (*t0) 39396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 39406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'S': 39416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t0 + 1 != last && t0[1] == 't') 39426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant goto do_parse_unqualified_name; 39436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t1 = parse_substitution(t0, last, db); 39446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != t0 && t1 != last) 39456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 39466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto name = db.names.back().move_full(); 39476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 39486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (!db.names.back().first.empty()) 3949d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 39506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first += "::" + name; 39516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); 3952d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 3953d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant else 39546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first = name; 39556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant pop_subs = true; 39566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t0 = t1; 3957d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 39586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 3959d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant return first; 3960d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 3961d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant case 'T': 39626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t1 = parse_template_param(t0, last, db); 39636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != t0 && t1 != last) 3964d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 39656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto name = db.names.back().move_full(); 39666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 39676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (!db.names.back().first.empty()) 39686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first += "::" + name; 3969d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant else 39706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first = name; 39716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); 39726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant pop_subs = true; 39736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t0 = t1; 3974d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 39756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 39766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 3977d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 39786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'D': 39796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t0 + 1 != last && t0[1] != 't' && t0[1] != 'T') 39806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant goto do_parse_unqualified_name; 39816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t1 = parse_decltype(t0, last, db); 39826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != t0 && t1 != last) 39836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 39846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto name = db.names.back().move_full(); 39856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 39866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (!db.names.back().first.empty()) 39876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first += "::" + name; 39886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 39896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first = name; 39906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); 39916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant pop_subs = true; 39926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t0 = t1; 39936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 39946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 3995d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant return first; 39966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 39976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'I': 39986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t1 = parse_template_args(t0, last, db); 39996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != t0 && t1 != last) 4000d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 40016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto name = db.names.back().move_full(); 40026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 40036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first += name; 40046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); 40056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t0 = t1; 4006e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert component_ends_with_template_args = true; 4007d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 4008d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant else 40096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 4010d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 4011d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant case 'L': 40126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (++t0 == last) 4013d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant return first; 40146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 40156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant default: 40166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant do_parse_unqualified_name: 40176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t1 = parse_unqualified_name(t0, last, db); 40186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != t0 && t1 != last) 40196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 40206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto name = db.names.back().move_full(); 40216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 40226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (!db.names.back().first.empty()) 40236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first += "::" + name; 4024d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant else 40256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first = name; 40266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); 40276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant pop_subs = true; 40286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t0 = t1; 4029d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 40306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 4031d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant return first; 4032d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 40336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 40346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t0 + 1; 40356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.cv = cv; 4036f672517e714ff464978992a363dce47de2207472Howard Hinnant if (pop_subs && !db.subs.empty()) 40376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.subs.pop_back(); 4038e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert if (ends_with_template_args) 4039e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert *ends_with_template_args = component_ends_with_template_args; 40406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 40416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 40426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 40436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 40446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <discriminator> := _ <non-negative number> # when number < 10 40456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// := __ <non-negative number> _ # when number >= 10 40466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// extension := decimal-digit+ 40476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 40486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 40496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_discriminator(const char* first, const char* last) 40506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 40516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant // parse but ignore discriminator 40526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (first != last) 40536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 40546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (*first == '_') 40556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 40566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = first+1; 40576c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != last) 4058d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 40596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (std::isdigit(*t1)) 40606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t1+1; 40616c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else if (*t1 == '_') 4062d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 40636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant for (++t1; t1 != last && std::isdigit(*t1); ++t1) 40646c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ; 40656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != last && *t1 == '_') 40666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t1 + 1; 4067d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 4068d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 40696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 40706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else if (std::isdigit(*first)) 40716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 40726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = first+1; 40736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant for (; t1 != last && std::isdigit(*t1); ++t1) 40746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ; 40756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t1; 40766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 40776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 40786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 40796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 40806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 40816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <local-name> := Z <function encoding> E <entity name> [<discriminator>] 40826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// := Z <function encoding> E s [<discriminator>] 40836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// := Z <function encoding> Ed [ <parameter number> ] _ <entity name> 40846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 40856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 40866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char* 4087e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albertparse_local_name(const char* first, const char* last, C& db, 4088e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert bool* ends_with_template_args) 40896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 40906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (first != last && *first == 'Z') 40916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 40926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_encoding(first+1, last, db); 40936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+1 && t != last && *t == 'E' && ++t != last) 40946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 40956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (*t) 4096d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 40976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 's': 40986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = parse_discriminator(t+1, last); 4099753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 4100753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 41016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.append("::string literal"); 41026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 41036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'd': 41046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (++t != last) 4105d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 41066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = parse_number(t, last); 41076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != last && *t1 == '_') 41086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 41096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = t1 + 1; 4110e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert t1 = parse_name(t, last, db, 4111e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert ends_with_template_args); 41126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != t) 41136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 4114753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.size() < 2) 4115753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 41166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto name = db.names.back().move_full(); 41176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 41186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.append("::"); 41196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.append(name); 41206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t1; 41216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 41226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 41236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 41246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 41256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 41266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 41276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant default: 41286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 4129e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert const char* t1 = parse_name(t, last, db, 4130e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert ends_with_template_args); 41316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != t) 41326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 41336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant // parse but ignore discriminator 41346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = parse_discriminator(t1, last); 4135753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.size() < 2) 4136753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 41376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto name = db.names.back().move_full(); 41386c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 41396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.append("::"); 41406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.append(name); 41416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 41426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 41436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 4144d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 4145d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 4146d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 4147d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 4148d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 4149d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant return first; 4150d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant} 4151d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 41526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <name> ::= <nested-name> // N 41536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= <local-name> # See Scope Encoding below // Z 41546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= <unscoped-template-name> <template-args> 41556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= <unscoped-name> 4156d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 41576c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <unscoped-template-name> ::= <unscoped-name> 41586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= <substitution> 41596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 41606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 4161d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnantconst char* 4162e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albertparse_name(const char* first, const char* last, C& db, 4163e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert bool* ends_with_template_args) 4164d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{ 41656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last - first >= 2) 4166d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 41676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t0 = first; 41686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant // extension: ignore L here 41696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (*t0 == 'L') 41706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++t0; 41716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (*t0) 4172d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 41736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'N': 41746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 4175e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert const char* t1 = parse_nested_name(t0, last, db, 4176e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert ends_with_template_args); 41776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != t0) 41786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t1; 4179d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 41806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 41816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'Z': 41826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 4183e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert const char* t1 = parse_local_name(t0, last, db, 4184e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert ends_with_template_args); 41856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != t0) 41866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t1; 41876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 41886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 41896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant default: 41906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 41916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = parse_unscoped_name(t0, last, db); 41926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != t0) 4193d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 41946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != last && *t1 == 'I') // <unscoped-template-name> <template-args> 41956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 4196753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 4197753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 41986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); 41996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t0 = t1; 42006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t1 = parse_template_args(t0, last, db); 42016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != t0) 42026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 4203753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.size() < 2) 4204753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 42056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto tmp = db.names.back().move_full(); 42066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 42076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first += tmp; 42086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t1; 4209e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert if (ends_with_template_args) 4210e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert *ends_with_template_args = true; 42116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 42126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 42136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else // <unscoped-name> 42146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t1; 4215d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 4216d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant else 42176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { // try <substitution> <template-args> 42186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t1 = parse_substitution(t0, last, db); 4219b4033ff8b4db60bbd7f2498d85fd7c4dd0ad5b11Howard Hinnant if (t1 != t0 && t1 != last && *t1 == 'I') 4220d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 42216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t0 = t1; 42226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t1 = parse_template_args(t0, last, db); 42236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != t0) 4224d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 4225753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.size() < 2) 4226753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 42276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto tmp = db.names.back().move_full(); 42286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 42296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first += tmp; 42306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t1; 4231e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert if (ends_with_template_args) 4232e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert *ends_with_template_args = true; 4233d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 42346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 4235d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 4236d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 42376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 4238d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 4239d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 4240d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant return first; 4241d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant} 4242d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 42436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <call-offset> ::= h <nv-offset> _ 42446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= v <v-offset> _ 42456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// 42466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <nv-offset> ::= <offset number> 42476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// # non-virtual base override 42486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// 42496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <v-offset> ::= <offset number> _ <virtual offset number> 42506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// # virtual base override, with vcall offset 4251d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 4252d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnantconst char* 42536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_call_offset(const char* first, const char* last) 4254d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{ 42556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (first != last) 4256d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 42576c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (*first) 4258d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 42596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'h': 4260ab87dcf97e2bba2b2b9aadc0877ebd3b8d7cab42Howard Hinnant { 42616c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_number(first + 1, last); 42626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first + 1 && t != last && *t == '_') 42636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t + 1; 4264ab87dcf97e2bba2b2b9aadc0877ebd3b8d7cab42Howard Hinnant } 42656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 42666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'v': 4267d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 42686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_number(first + 1, last); 42696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first + 1 && t != last && *t == '_') 4270d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 42716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t2 = parse_number(++t, last); 42726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t2 != t && t2 != last && *t2 == '_') 42736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t2 + 1; 4274d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 42756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 42766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 4277d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 4278d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 4279d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant return first; 4280d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant} 4281d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 42826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <special-name> ::= TV <type> # virtual table 42836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= TT <type> # VTT structure (construction vtable index) 42846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= TI <type> # typeinfo structure 42856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= TS <type> # typeinfo name (null-terminated byte string) 42866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= Tc <call-offset> <call-offset> <base encoding> 42876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// # base is the nominal target function of thunk 42886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// # first call-offset is 'this' adjustment 42896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// # second call-offset is result adjustment 42906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= T <call-offset> <base encoding> 42916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// # base is the nominal target function of thunk 42926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= GV <object name> # Guard variable for one-time initialization 42936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// # No <type> 42946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// extension ::= TC <first type> <number> _ <second type> # construction vtable for second-in-first 42956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// extension ::= GR <object name> # reference temporary for object 4296d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 42976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 4298d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnantconst char* 42996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_special_name(const char* first, const char* last, C& db) 4300d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{ 43016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last - first > 2) 4302d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 43036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t; 43046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (*first) 4305d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 43066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'T': 4307d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant switch (first[1]) 4308d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 43096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'V': 43106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant // TV <type> # virtual table 43116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_type(first+2, last, db); 43126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+2) 43136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 4314753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 4315753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 43166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.insert(0, "vtable for "); 43176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 43186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 4319d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 43206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'T': 43216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant // TT <type> # VTT structure (construction vtable index) 43226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_type(first+2, last, db); 43236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+2) 43246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 4325753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 4326753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 43276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.insert(0, "VTT for "); 43286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 43296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 4330d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 43316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'I': 43326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant // TI <type> # typeinfo structure 43336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_type(first+2, last, db); 43346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+2) 43356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 4336753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 4337753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 43386c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.insert(0, "typeinfo for "); 43396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 43406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 4341d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 43426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'S': 43436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant // TS <type> # typeinfo name (null-terminated byte string) 43446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_type(first+2, last, db); 43456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+2) 43466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 4347753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 4348753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 43496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.insert(0, "typeinfo name for "); 43506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 43516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 4352d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 43536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'c': 43546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant // Tc <call-offset> <call-offset> <base encoding> 43556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 43566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t0 = parse_call_offset(first+2, last); 43576c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t0 == first+2) 43586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 43596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = parse_call_offset(t0, last); 43606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 == t0) 43616c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 43626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_encoding(t1, last, db); 43636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != t1) 43646c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 4365753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 4366753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 43676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.insert(0, "covariant return thunk to "); 43686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 43696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 43706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 4371d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 43726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'C': 43736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant // extension ::= TC <first type> <number> _ <second type> # construction vtable for second-in-first 43746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_type(first+2, last, db); 43756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+2) 4376d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 43776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t0 = parse_number(t, last); 43786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t0 != t && t0 != last && *t0 == '_') 43796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 43806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = parse_type(++t0, last, db); 43816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != t0) 43826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 4383753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.size() < 2) 4384753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 43856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto left = db.names.back().move_full(); 43866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 43876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first = "construction vtable for " + 43886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant std::move(left) + "-in-" + 43896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().move_full(); 43906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t1; 43916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 43926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 4393d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 4394d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 4395d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant default: 43966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant // T <call-offset> <base encoding> 4397d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 43986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t0 = parse_call_offset(first+1, last); 43996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t0 == first+1) 44006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 44016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_encoding(t0, last, db); 44026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != t0) 44036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 4404753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 4405753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 44066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (first[2] == 'v') 4407d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 44086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.insert(0, "virtual thunk to "); 44096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 4410d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 44116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 4412d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 44136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.insert(0, "non-virtual thunk to "); 44146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 4415d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 4416d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 44176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 44186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 44196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 44206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 44216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'G': 44226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (first[1]) 44236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 44246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'V': 44256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant // GV <object name> # Guard variable for one-time initialization 44266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_name(first+2, last, db); 44276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+2) 44286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 4429753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 4430753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 44316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.insert(0, "guard variable for "); 44326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 44336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 44346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 44356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'R': 44366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant // extension ::= GR <object name> # reference temporary for object 44376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_name(first+2, last, db); 44386c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+2) 44396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 4440753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 4441753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 44426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.insert(0, "reference temporary for "); 44436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 44446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 4445d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant break; 4446d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 44476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 4448d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 4449d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 4450d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant return first; 4451d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant} 4452d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 4453753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnanttemplate <class T> 4454753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnantclass save_value 4455753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant{ 4456753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant T& restore_; 4457753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant T original_value_; 4458753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnantpublic: 4459753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant save_value(T& restore) 4460753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant : restore_(restore), 4461753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant original_value_(restore) 4462753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant {} 4463753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant 4464753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant ~save_value() 4465753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant { 4466753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant restore_ = std::move(original_value_); 4467753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant } 4468753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant 4469753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant save_value(const save_value&) = delete; 4470753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant save_value& operator=(const save_value&) = delete; 4471753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant}; 4472753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant 44736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <encoding> ::= <function name> <bare-function-type> 44746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= <data name> 44756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// ::= <special-name> 4476d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 44776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 4478d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnantconst char* 44796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_encoding(const char* first, const char* last, C& db) 4480d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{ 4481d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant if (first != last) 4482d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 4483753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant save_value<decltype(db.encoding_depth)> su(db.encoding_depth); 4484753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant ++db.encoding_depth; 4485753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant save_value<decltype(db.tag_templates)> sb(db.tag_templates); 4486753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.encoding_depth > 1) 4487753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant db.tag_templates = true; 44886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant switch (*first) 4489d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 44906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'G': 44916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant case 'T': 44926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = parse_special_name(first, last, db); 44936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 44946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant default: 44956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 4496e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert bool ends_with_template_args = false; 4497e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert const char* t = parse_name(first, last, db, 4498e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert &ends_with_template_args); 44996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant unsigned cv = db.cv; 45006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant unsigned ref = db.ref; 45016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first) 4502d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 45036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != last && *t != 'E' && *t != '.') 4504d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 4505753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant save_value<bool> sb2(db.tag_templates); 45066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.tag_templates = false; 45076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t2; 45086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant typename C::String ret2; 4509753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 4510753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 45116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const typename C::String& nm = db.names.back().first; 4512753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (nm.empty()) 4513753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 4514e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert if (!db.parsed_ctor_dtor_cv && ends_with_template_args) 4515d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 45166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t2 = parse_type(t, last, db); 45176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t2 == t) 45186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return first; 4519753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.size() < 2) 4520753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 45216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant auto ret1 = std::move(db.names.back().first); 45226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ret2 = std::move(db.names.back().second); 45236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (ret2.empty()) 45246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ret1 += ' '; 45256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 45266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.insert(0, ret1); 45276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = t2; 45286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 45296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first += '('; 45306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != last && *t == 'v') 45316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 45326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ++t; 4533d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 45346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 4535d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 45366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant bool first_arg = true; 45376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant while (true) 4538d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 45396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant size_t k0 = db.names.size(); 45406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t2 = parse_type(t, last, db); 45416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant size_t k1 = db.names.size(); 45426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t2 == t) 45436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 45446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (k1 > k0) 4545d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 45466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant typename C::String tmp; 45476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant for (size_t k = k0; k < k1; ++k) 4548d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 45496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (!tmp.empty()) 45506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant tmp += ", "; 45516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant tmp += db.names[k].move_full(); 45526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 45536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant for (size_t k = k0; k < k1; ++k) 45546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.pop_back(); 45556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (!tmp.empty()) 45566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 4557753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 4558753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 45596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (!first_arg) 45606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first += ", "; 45616c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 45626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first_arg = false; 45636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first += tmp; 4564d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 4565d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 45666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = t2; 4567d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 4568d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 4569753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 4570753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 45716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first += ')'; 45726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (cv & 1) 45736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.append(" const"); 45746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (cv & 2) 45756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.append(" volatile"); 45766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (cv & 4) 45776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.append(" restrict"); 45786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (ref == 1) 45796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.append(" &"); 45806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else if (ref == 2) 45816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.append(" &&"); 45826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first += ret2; 45836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 4584d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 45856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 45866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 4587d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 45886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant break; 45896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 4590d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 4591d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 4592d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant return first; 4593d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant} 4594d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 45955dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant// _block_invoke 45965dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant// _block_invoke<decimal-digit>+ 45975dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant// _block_invoke_<decimal-digit>+ 45985dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant 45996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 46005dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnantconst char* 46016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_block_invoke(const char* first, const char* last, C& db) 46025dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant{ 46035dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant if (last - first >= 13) 46045dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant { 46055dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant const char test[] = "_block_invoke"; 46065dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant const char* t = first; 46075dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant for (int i = 0; i < 13; ++i, ++t) 46085dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant { 46095dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant if (*t != test[i]) 46105dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant return first; 46115dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant } 46125dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant if (t != last) 46135dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant { 46145dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant if (*t == '_') 46155dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant { 46165dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant // must have at least 1 decimal digit 46176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (++t == last || !std::isdigit(*t)) 46185dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant return first; 46195dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant ++t; 46205dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant } 46215dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant // parse zero or more digits 46225dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant while (t != last && isdigit(*t)) 46235dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant ++t; 46245dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant } 4625753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 4626753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 46276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first.insert(0, "invocation function for block in "); 46286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = t; 46295dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant } 46305dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant return first; 46315dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant} 46325dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant 46336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// extension 46346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <dot-suffix> := .<anything and everything> 4635d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 46366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 4637d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnantconst char* 46386c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_dot_suffix(const char* first, const char* last, C& db) 4639d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{ 46406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (first != last && *first == '.') 4641d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 4642753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant if (db.names.empty()) 4643753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant return first; 46446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first += " (" + typename C::String(first, last) + ")"; 46456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant first = last; 4646d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 4647d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant return first; 4648d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant} 4649d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 46505dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant// <block-involcaton-function> ___Z<encoding>_block_invoke 46515dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant// <block-involcaton-function> ___Z<encoding>_block_invoke<decimal-digit>+ 46525dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant// <block-involcaton-function> ___Z<encoding>_block_invoke_<decimal-digit>+ 4653d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant// <mangled-name> ::= _Z<encoding> 4654d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant// ::= <type> 4655d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 46566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class C> 4657d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnantvoid 46586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantdemangle(const char* first, const char* last, C& db, int& status) 4659d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{ 4660eb8d46c54e181eea4d33b96a9a13e2ac0bd329a8Howard Hinnant if (first >= last) 4661d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 46626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant status = invalid_mangled_name; 4663d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant return; 4664d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 46656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (*first == '_') 4666d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 46676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (last - first >= 4) 46686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 46696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (first[1] == 'Z') 46706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 46716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_encoding(first+2, last, db); 46726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+2 && t != last && *t == '.') 46736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant t = parse_dot_suffix(t, last, db); 46746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != last) 46756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant status = invalid_mangled_name; 46766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 46776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else if (first[1] == '_' && first[2] == '_' && first[3] == 'Z') 46786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 46796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_encoding(first+4, last, db); 46806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != first+4 && t != last) 46816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 46826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t1 = parse_block_invoke(t, last, db); 46836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t1 != last) 46846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant status = invalid_mangled_name; 46856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 46866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 46876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant status = invalid_mangled_name; 46886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 46896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 46906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant status = invalid_mangled_name; 46916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 46925dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant else 46936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant status = invalid_mangled_name; 46945dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant } 4695d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant else 4696d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 46976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant const char* t = parse_type(first, last, db); 46986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (t != last) 46996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant status = invalid_mangled_name; 47006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 4701eb8d46c54e181eea4d33b96a9a13e2ac0bd329a8Howard Hinnant if (status == success && db.names.empty()) 4702eb8d46c54e181eea4d33b96a9a13e2ac0bd329a8Howard Hinnant status = invalid_mangled_name; 4703d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant} 4704d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 47056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <std::size_t N> 47066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantclass arena 4707d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{ 47086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant static const std::size_t alignment = 16; 47096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant alignas(alignment) char buf_[N]; 47106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant char* ptr_; 47116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 47126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant std::size_t 47136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant align_up(std::size_t n) noexcept 47146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant {return n + (alignment-1) & ~(alignment-1);} 47156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 47166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant bool 47176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant pointer_in_buffer(char* p) noexcept 47186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant {return buf_ <= p && p <= buf_ + N;} 47196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 47206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantpublic: 47216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant arena() noexcept : ptr_(buf_) {} 47226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ~arena() {ptr_ = nullptr;} 47236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant arena(const arena&) = delete; 47246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant arena& operator=(const arena&) = delete; 47256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 47266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant char* allocate(std::size_t n); 47276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant void deallocate(char* p, std::size_t n) noexcept; 4728d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 47296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant static constexpr std::size_t size() {return N;} 47306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant std::size_t used() const {return static_cast<std::size_t>(ptr_ - buf_);} 47316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant void reset() {ptr_ = buf_;} 47326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant}; 47336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 47346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <std::size_t N> 47356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantchar* 47366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantarena<N>::allocate(std::size_t n) 4737d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{ 47386c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant n = align_up(n); 47396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (static_cast<std::size_t>(buf_ + N - ptr_) >= n) 47406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 47416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant char* r = ptr_; 47426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ptr_ += n; 47436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return r; 47446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 47456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return static_cast<char*>(std::malloc(n)); 4746d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant} 4747d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 47486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <std::size_t N> 47496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantvoid 47506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantarena<N>::deallocate(char* p, std::size_t n) noexcept 4751d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{ 47526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (pointer_in_buffer(p)) 4753d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 47546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant n = align_up(n); 47556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (p + n == ptr_) 47566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant ptr_ = p; 4757d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 47586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 47596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant std::free(p); 47606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 47616c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 47626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class T, std::size_t N> 47636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantclass short_alloc 47646c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 47656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant arena<N>& a_; 47666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantpublic: 47676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant typedef T value_type; 47686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 47696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantpublic: 47706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant template <class _Up> struct rebind {typedef short_alloc<_Up, N> other;}; 47716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 47726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant short_alloc(arena<N>& a) noexcept : a_(a) {} 47736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant template <class U> 47746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant short_alloc(const short_alloc<U, N>& a) noexcept 47756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant : a_(a.a_) {} 47766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant short_alloc(const short_alloc&) = default; 47776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant short_alloc& operator=(const short_alloc&) = delete; 47786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 47796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant T* allocate(std::size_t n) 4780d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 47816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return reinterpret_cast<T*>(a_.allocate(n*sizeof(T))); 4782d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 47836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant void deallocate(T* p, std::size_t n) noexcept 4784d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 47856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant a_.deallocate(reinterpret_cast<char*>(p), n*sizeof(T)); 4786d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 47876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 47886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant template <class T1, std::size_t N1, class U, std::size_t M> 47896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant friend 47906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant bool 47916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant operator==(const short_alloc<T1, N1>& x, const short_alloc<U, M>& y) noexcept; 47926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 47936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant template <class U, std::size_t M> friend class short_alloc; 47946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant}; 47956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 47966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class T, std::size_t N, class U, std::size_t M> 47976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantinline 47986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantbool 47996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantoperator==(const short_alloc<T, N>& x, const short_alloc<U, M>& y) noexcept 48006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 48016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return N == M && &x.a_ == &y.a_; 48026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 48036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 48046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class T, std::size_t N, class U, std::size_t M> 48056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantinline 48066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantbool 48076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantoperator!=(const short_alloc<T, N>& x, const short_alloc<U, M>& y) noexcept 48086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 48096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return !(x == y); 48106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 48116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 48126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class T> 48136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantclass malloc_alloc 48146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 48156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantpublic: 48166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant typedef T value_type; 48176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 48186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant malloc_alloc() = default; 48196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant template <class U> malloc_alloc(const malloc_alloc<U>&) noexcept {} 48206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 48216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant T* allocate(std::size_t n) 4822d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 48236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return static_cast<T*>(std::malloc(n*sizeof(T))); 4824d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 48256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant void deallocate(T* p, std::size_t) noexcept 4826d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 48276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant std::free(p); 4828d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 48296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant}; 48306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 48316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class T, class U> 48326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantinline 48336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantbool 48346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantoperator==(const malloc_alloc<T>&, const malloc_alloc<U>&) noexcept 48356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 48366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return true; 4837d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant} 4838d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 48396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class T, class U> 48406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantinline 48416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantbool 48426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantoperator!=(const malloc_alloc<T>& x, const malloc_alloc<U>& y) noexcept 48436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{ 48446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return !(x == y); 48456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} 4846d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 48476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst size_t bs = 4 * 1024; 48486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class T> using Alloc = short_alloc<T, bs>; 48496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class T> using Vector = std::vector<T, Alloc<T>>; 48500240685ed6756ee0eed7c76e37eb2abdc01dcf82Howard Hinnant 4851e45805f0d3f8dafef1297cc7dc49e610713f023bDan Alberttemplate <class StrT> 48526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantstruct string_pair 4853d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{ 4854e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert StrT first; 4855e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert StrT second; 48566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 48576c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant string_pair() = default; 4858e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert string_pair(StrT f) : first(std::move(f)) {} 4859e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert string_pair(StrT f, StrT s) 48606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant : first(std::move(f)), second(std::move(s)) {} 48616c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant template <size_t N> 48626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant string_pair(const char (&s)[N]) : first(s, N-1) {} 48636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 48646c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant size_t size() const {return first.size() + second.size();} 4865e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert StrT full() const {return first + second;} 4866e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert StrT move_full() {return std::move(first) + std::move(second);} 48676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant}; 4868d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 4869061240c142debbe643c5ce78673f019f1c953511Howard Hinnantstruct Db 4870061240c142debbe643c5ce78673f019f1c953511Howard Hinnant{ 4871e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert typedef std::basic_string<char, std::char_traits<char>, 4872e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert malloc_alloc<char>> String; 4873e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert typedef Vector<string_pair<String>> sub_type; 4874061240c142debbe643c5ce78673f019f1c953511Howard Hinnant typedef Vector<sub_type> template_param_type; 4875e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert sub_type names; 4876e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert template_param_type subs; 4877061240c142debbe643c5ce78673f019f1c953511Howard Hinnant Vector<template_param_type> template_param; 4878061240c142debbe643c5ce78673f019f1c953511Howard Hinnant unsigned cv; 4879061240c142debbe643c5ce78673f019f1c953511Howard Hinnant unsigned ref; 4880753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant unsigned encoding_depth; 4881061240c142debbe643c5ce78673f019f1c953511Howard Hinnant bool parsed_ctor_dtor_cv; 4882061240c142debbe643c5ce78673f019f1c953511Howard Hinnant bool tag_templates; 4883061240c142debbe643c5ce78673f019f1c953511Howard Hinnant bool fix_forward_references; 4884061240c142debbe643c5ce78673f019f1c953511Howard Hinnant bool try_to_parse_template_args; 4885061240c142debbe643c5ce78673f019f1c953511Howard Hinnant 4886061240c142debbe643c5ce78673f019f1c953511Howard Hinnant template <size_t N> 4887061240c142debbe643c5ce78673f019f1c953511Howard Hinnant Db(arena<N>& ar) : 4888061240c142debbe643c5ce78673f019f1c953511Howard Hinnant names(ar), 4889061240c142debbe643c5ce78673f019f1c953511Howard Hinnant subs(0, names, ar), 4890061240c142debbe643c5ce78673f019f1c953511Howard Hinnant template_param(0, subs, ar) 4891061240c142debbe643c5ce78673f019f1c953511Howard Hinnant {} 4892061240c142debbe643c5ce78673f019f1c953511Howard Hinnant}; 4893061240c142debbe643c5ce78673f019f1c953511Howard Hinnant 48946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} // unnamed namespace 48956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant 48966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantextern "C" 4897e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert__attribute__ ((__visibility__("default"))) 4898d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnantchar* 4899d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant__cxa_demangle(const char* mangled_name, char* buf, size_t* n, int* status) 4900d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{ 49016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (mangled_name == nullptr || (buf != nullptr && n == nullptr)) 4902d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant { 4903d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant if (status) 49046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant *status = invalid_args; 49056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant return nullptr; 49066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 49078ad6a220cfff34f8ecbadc142891c7728c4d4ed8Howard Hinnant size_t internal_size = buf != nullptr ? *n : 0; 49086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant arena<bs> a; 49096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant Db db(a); 49106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.cv = 0; 491119e36dddb0023fad0c609328e6686d1bbbced718Howard Hinnant db.ref = 0; 4912753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant db.encoding_depth = 0; 49136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.parsed_ctor_dtor_cv = false; 49146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.tag_templates = true; 49156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.template_param.emplace_back(a); 49166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.fix_forward_references = false; 49176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.try_to_parse_template_args = true; 49186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant int internal_status = success; 4919b2d1f94e76c016628f868868ed40a53c2b40b6edHoward Hinnant size_t len = std::strlen(mangled_name); 4920b2d1f94e76c016628f868868ed40a53c2b40b6edHoward Hinnant demangle(mangled_name, mangled_name + len, db, 49216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant internal_status); 4922b2d1f94e76c016628f868868ed40a53c2b40b6edHoward Hinnant if (internal_status == success && db.fix_forward_references && 4923b2d1f94e76c016628f868868ed40a53c2b40b6edHoward Hinnant !db.template_param.empty() && !db.template_param.front().empty()) 4924b2d1f94e76c016628f868868ed40a53c2b40b6edHoward Hinnant { 4925b2d1f94e76c016628f868868ed40a53c2b40b6edHoward Hinnant db.fix_forward_references = false; 4926b2d1f94e76c016628f868868ed40a53c2b40b6edHoward Hinnant db.tag_templates = false; 4927b2d1f94e76c016628f868868ed40a53c2b40b6edHoward Hinnant db.names.clear(); 4928b2d1f94e76c016628f868868ed40a53c2b40b6edHoward Hinnant db.subs.clear(); 4929b2d1f94e76c016628f868868ed40a53c2b40b6edHoward Hinnant demangle(mangled_name, mangled_name + len, db, internal_status); 4930b2d1f94e76c016628f868868ed40a53c2b40b6edHoward Hinnant if (db.fix_forward_references) 4931b2d1f94e76c016628f868868ed40a53c2b40b6edHoward Hinnant internal_status = invalid_mangled_name; 4932b2d1f94e76c016628f868868ed40a53c2b40b6edHoward Hinnant } 49336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (internal_status == success) 49346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 49356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant size_t sz = db.names.back().size() + 1; 49366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (sz > internal_size) 49376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 49386c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant char* newbuf = static_cast<char*>(std::realloc(buf, sz)); 49396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (newbuf == nullptr) 49406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 49416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant internal_status = memory_alloc_failure; 49426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant buf = nullptr; 49436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 49446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 49458ad6a220cfff34f8ecbadc142891c7728c4d4ed8Howard Hinnant { 49466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant buf = newbuf; 49478ad6a220cfff34f8ecbadc142891c7728c4d4ed8Howard Hinnant if (n != nullptr) 49488ad6a220cfff34f8ecbadc142891c7728c4d4ed8Howard Hinnant *n = sz; 49498ad6a220cfff34f8ecbadc142891c7728c4d4ed8Howard Hinnant } 49506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 49516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (buf != nullptr) 49526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant { 49536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant db.names.back().first += db.names.back().second; 49546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant std::memcpy(buf, db.names.back().first.data(), sz-1); 49556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant buf[sz-1] = char(0); 49566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant } 4957d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant } 49586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant else 49596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant buf = nullptr; 49606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant if (status) 49616c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant *status = internal_status; 4962d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant return buf; 4963d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant} 4964d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant 49656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant} // __cxxabiv1 4966