Lines Matching refs:db
46 const char* parse_type(const char* first, const char* last, C& db);
48 const char* parse_encoding(const char* first, const char* last, C& db);
50 const char* parse_name(const char* first, const char* last, C& db,
53 const char* parse_expression(const char* first, const char* last, C& db);
55 const char* parse_template_args(const char* first, const char* last, C& db);
57 const char* parse_operator_name(const char* first, const char* last, C& db);
59 const char* parse_unqualified_name(const char* first, const char* last, C& db);
61 const char* parse_decltype(const char* first, const char* last, C& db);
65 print_stack(const C& db) in print_stack() argument
69 for (auto& s : db.names) in print_stack()
73 for (auto& v : db.subs) in print_stack()
85 for (auto& t : db.template_param) in print_stack()
106 print_state(const char* msg, const char* first, const char* last, const C& db) in print_state() argument
112 print_stack(db); in print_state()
184 parse_floating_number(const char* first, const char* last, C& db) in parse_floating_number() argument
217 db.names.push_back(typename C::String(num, static_cast<std::size_t>(n))); in parse_floating_number()
228 parse_source_name(const char* first, const char* last, C& db) in parse_source_name() argument
247 db.names.push_back("(anonymous namespace)"); in parse_source_name()
249 db.names.push_back(std::move(r)); in parse_source_name()
270 parse_substitution(const char* first, const char* last, C& db) in parse_substitution() argument
279 db.names.push_back("std::allocator"); in parse_substitution()
283 db.names.push_back("std::basic_string"); in parse_substitution()
287 db.names.push_back("std::string"); in parse_substitution()
291 db.names.push_back("std::istream"); in parse_substitution()
295 db.names.push_back("std::ostream"); in parse_substitution()
299 db.names.push_back("std::iostream"); in parse_substitution()
303 if (!db.subs.empty()) in parse_substitution()
305 for (const auto& n : db.subs.front()) in parse_substitution()
306 db.names.push_back(n); in parse_substitution()
330 if (sub < db.subs.size()) in parse_substitution()
332 for (const auto& n : db.subs[sub]) in parse_substitution()
333 db.names.push_back(n); in parse_substitution()
378 parse_builtin_type(const char* first, const char* last, C& db) in parse_builtin_type() argument
385 db.names.push_back("void"); in parse_builtin_type()
389 db.names.push_back("wchar_t"); in parse_builtin_type()
393 db.names.push_back("bool"); in parse_builtin_type()
397 db.names.push_back("char"); in parse_builtin_type()
401 db.names.push_back("signed char"); in parse_builtin_type()
405 db.names.push_back("unsigned char"); in parse_builtin_type()
409 db.names.push_back("short"); in parse_builtin_type()
413 db.names.push_back("unsigned short"); in parse_builtin_type()
417 db.names.push_back("int"); in parse_builtin_type()
421 db.names.push_back("unsigned int"); in parse_builtin_type()
425 db.names.push_back("long"); in parse_builtin_type()
429 db.names.push_back("unsigned long"); in parse_builtin_type()
433 db.names.push_back("long long"); in parse_builtin_type()
437 db.names.push_back("unsigned long long"); in parse_builtin_type()
441 db.names.push_back("__int128"); in parse_builtin_type()
445 db.names.push_back("unsigned __int128"); in parse_builtin_type()
449 db.names.push_back("float"); in parse_builtin_type()
453 db.names.push_back("double"); in parse_builtin_type()
457 db.names.push_back("long double"); in parse_builtin_type()
461 db.names.push_back("__float128"); in parse_builtin_type()
465 db.names.push_back("..."); in parse_builtin_type()
470 const char*t = parse_source_name(first+1, last, db); in parse_builtin_type()
481 db.names.push_back("decimal64"); in parse_builtin_type()
485 db.names.push_back("decimal128"); in parse_builtin_type()
489 db.names.push_back("decimal32"); in parse_builtin_type()
493 db.names.push_back("decimal16"); in parse_builtin_type()
497 db.names.push_back("char32_t"); in parse_builtin_type()
501 db.names.push_back("char16_t"); in parse_builtin_type()
505 db.names.push_back("auto"); in parse_builtin_type()
509 db.names.push_back("decltype(auto)"); in parse_builtin_type()
513 db.names.push_back("std::nullptr_t"); in parse_builtin_type()
556 parse_template_param(const char* first, const char* last, C& db) in parse_template_param() argument
564 if (db.template_param.empty()) in parse_template_param()
566 if (!db.template_param.back().empty()) in parse_template_param()
568 for (auto& t : db.template_param.back().front()) in parse_template_param()
569 db.names.push_back(t); in parse_template_param()
574 db.names.push_back("T_"); in parse_template_param()
576 db.fix_forward_references = true; in parse_template_param()
588 if (t == last || *t != '_' || db.template_param.empty()) in parse_template_param()
591 if (sub < db.template_param.back().size()) in parse_template_param()
593 for (auto& temp : db.template_param.back()[sub]) in parse_template_param()
594 db.names.push_back(temp); in parse_template_param()
599 db.names.push_back(typename C::String(first, t+1)); in parse_template_param()
601 db.fix_forward_references = true; in parse_template_param()
613 parse_const_cast_expr(const char* first, const char* last, C& db) in parse_const_cast_expr() argument
617 const char* t = parse_type(first+2, last, db); in parse_const_cast_expr()
620 const char* t1 = parse_expression(t, last, db); in parse_const_cast_expr()
623 if (db.names.size() < 2) in parse_const_cast_expr()
625 auto expr = db.names.back().move_full(); in parse_const_cast_expr()
626 db.names.pop_back(); in parse_const_cast_expr()
627 if (db.names.empty()) in parse_const_cast_expr()
629 db.names.back() = "const_cast<" + db.names.back().move_full() + ">(" + expr + ")"; in parse_const_cast_expr()
641 parse_dynamic_cast_expr(const char* first, const char* last, C& db) in parse_dynamic_cast_expr() argument
645 const char* t = parse_type(first+2, last, db); in parse_dynamic_cast_expr()
648 const char* t1 = parse_expression(t, last, db); in parse_dynamic_cast_expr()
651 if (db.names.size() < 2) in parse_dynamic_cast_expr()
653 auto expr = db.names.back().move_full(); in parse_dynamic_cast_expr()
654 db.names.pop_back(); in parse_dynamic_cast_expr()
655 if (db.names.empty()) in parse_dynamic_cast_expr()
657 db.names.back() = "dynamic_cast<" + db.names.back().move_full() + ">(" + expr + ")"; in parse_dynamic_cast_expr()
669 parse_reinterpret_cast_expr(const char* first, const char* last, C& db) in parse_reinterpret_cast_expr() argument
673 const char* t = parse_type(first+2, last, db); in parse_reinterpret_cast_expr()
676 const char* t1 = parse_expression(t, last, db); in parse_reinterpret_cast_expr()
679 if (db.names.size() < 2) in parse_reinterpret_cast_expr()
681 auto expr = db.names.back().move_full(); in parse_reinterpret_cast_expr()
682 db.names.pop_back(); in parse_reinterpret_cast_expr()
683 if (db.names.empty()) in parse_reinterpret_cast_expr()
685 … db.names.back() = "reinterpret_cast<" + db.names.back().move_full() + ">(" + expr + ")"; in parse_reinterpret_cast_expr()
697 parse_static_cast_expr(const char* first, const char* last, C& db) in parse_static_cast_expr() argument
701 const char* t = parse_type(first+2, last, db); in parse_static_cast_expr()
704 const char* t1 = parse_expression(t, last, db); in parse_static_cast_expr()
707 if (db.names.size() < 2) in parse_static_cast_expr()
709 auto expr = db.names.back().move_full(); in parse_static_cast_expr()
710 db.names.pop_back(); in parse_static_cast_expr()
711 db.names.back() = "static_cast<" + db.names.back().move_full() + ">(" + expr + ")"; in parse_static_cast_expr()
723 parse_pack_expansion(const char* first, const char* last, C& db) in parse_pack_expansion() argument
727 const char* t = parse_expression(first+2, last, db); in parse_pack_expansion()
738 parse_sizeof_type_expr(const char* first, const char* last, C& db) in parse_sizeof_type_expr() argument
742 const char* t = parse_type(first+2, last, db); in parse_sizeof_type_expr()
745 if (db.names.empty()) in parse_sizeof_type_expr()
747 db.names.back() = "sizeof (" + db.names.back().move_full() + ")"; in parse_sizeof_type_expr()
758 parse_sizeof_expr_expr(const char* first, const char* last, C& db) in parse_sizeof_expr_expr() argument
762 const char* t = parse_expression(first+2, last, db); in parse_sizeof_expr_expr()
765 if (db.names.empty()) in parse_sizeof_expr_expr()
767 db.names.back() = "sizeof (" + db.names.back().move_full() + ")"; in parse_sizeof_expr_expr()
778 parse_sizeof_param_pack_expr(const char* first, const char* last, C& db) in parse_sizeof_param_pack_expr() argument
782 size_t k0 = db.names.size(); in parse_sizeof_param_pack_expr()
783 const char* t = parse_template_param(first+2, last, db); in parse_sizeof_param_pack_expr()
784 size_t k1 = db.names.size(); in parse_sizeof_param_pack_expr()
791 tmp += db.names[k].move_full(); in parse_sizeof_param_pack_expr()
793 tmp += ", " + db.names[k].move_full(); in parse_sizeof_param_pack_expr()
797 db.names.pop_back(); in parse_sizeof_param_pack_expr()
798 db.names.push_back(std::move(tmp)); in parse_sizeof_param_pack_expr()
812 parse_function_param(const char* first, const char* last, C& db) in parse_function_param() argument
823 db.names.push_back("fp" + typename C::String(t, t1)); in parse_function_param()
838 db.names.push_back("fp" + typename C::String(t, t1)); in parse_function_param()
851 parse_sizeof_function_param_pack_expr(const char* first, const char* last, C& db) in parse_sizeof_function_param_pack_expr() argument
855 const char* t = parse_function_param(first+2, last, db); in parse_sizeof_function_param_pack_expr()
858 if (db.names.empty()) in parse_sizeof_function_param_pack_expr()
860 db.names.back() = "sizeof...(" + db.names.back().move_full() + ")"; in parse_sizeof_function_param_pack_expr()
872 parse_typeid_expr(const char* first, const char* last, C& db) in parse_typeid_expr() argument
878 t = parse_expression(first+2, last, db); in parse_typeid_expr()
880 t = parse_type(first+2, last, db); in parse_typeid_expr()
883 if (db.names.empty()) in parse_typeid_expr()
885 db.names.back() = "typeid(" + db.names.back().move_full() + ")"; in parse_typeid_expr()
896 parse_throw_expr(const char* first, const char* last, C& db) in parse_throw_expr() argument
900 const char* t = parse_expression(first+2, last, db); in parse_throw_expr()
903 if (db.names.empty()) in parse_throw_expr()
905 db.names.back() = "throw " + db.names.back().move_full(); in parse_throw_expr()
916 parse_dot_star_expr(const char* first, const char* last, C& db) in parse_dot_star_expr() argument
920 const char* t = parse_expression(first+2, last, db); in parse_dot_star_expr()
923 const char* t1 = parse_expression(t, last, db); in parse_dot_star_expr()
926 if (db.names.size() < 2) in parse_dot_star_expr()
928 auto expr = db.names.back().move_full(); in parse_dot_star_expr()
929 db.names.pop_back(); in parse_dot_star_expr()
930 db.names.back().first += ".*" + expr; in parse_dot_star_expr()
942 parse_simple_id(const char* first, const char* last, C& db) in parse_simple_id() argument
946 const char* t = parse_source_name(first, last, db); in parse_simple_id()
949 const char* t1 = parse_template_args(t, last, db); in parse_simple_id()
952 if (db.names.size() < 2) in parse_simple_id()
954 auto args = db.names.back().move_full(); in parse_simple_id()
955 db.names.pop_back(); in parse_simple_id()
956 db.names.back().first += std::move(args); in parse_simple_id()
972 parse_unresolved_type(const char* first, const char* last, C& db) in parse_unresolved_type() argument
981 size_t k0 = db.names.size(); in parse_unresolved_type()
982 t = parse_template_param(first, last, db); in parse_unresolved_type()
983 size_t k1 = db.names.size(); in parse_unresolved_type()
986 … db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); in parse_unresolved_type()
992 db.names.pop_back(); in parse_unresolved_type()
997 t = parse_decltype(first, last, db); in parse_unresolved_type()
1000 if (db.names.empty()) in parse_unresolved_type()
1002 … db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); in parse_unresolved_type()
1007 t = parse_substitution(first, last, db); in parse_unresolved_type()
1014 t = parse_unqualified_name(first+2, last, db); in parse_unresolved_type()
1017 if (db.names.empty()) in parse_unresolved_type()
1019 db.names.back().first.insert(0, "std::"); in parse_unresolved_type()
1020 … db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); in parse_unresolved_type()
1036 parse_destructor_name(const char* first, const char* last, C& db) in parse_destructor_name() argument
1040 const char* t = parse_unresolved_type(first, last, db); in parse_destructor_name()
1042 t = parse_simple_id(first, last, db); in parse_destructor_name()
1045 if (db.names.empty()) in parse_destructor_name()
1047 db.names.back().first.insert(0, "~"); in parse_destructor_name()
1064 parse_base_unresolved_name(const char* first, const char* last, C& db) in parse_base_unresolved_name() argument
1072 const char* t = parse_operator_name(first+2, last, db); in parse_base_unresolved_name()
1075 first = parse_template_args(t, last, db); in parse_base_unresolved_name()
1078 if (db.names.size() < 2) in parse_base_unresolved_name()
1080 auto args = db.names.back().move_full(); in parse_base_unresolved_name()
1081 db.names.pop_back(); in parse_base_unresolved_name()
1082 db.names.back().first += std::move(args); in parse_base_unresolved_name()
1088 const char* t = parse_destructor_name(first+2, last, db); in parse_base_unresolved_name()
1095 const char* t = parse_simple_id(first, last, db); in parse_base_unresolved_name()
1098 t = parse_operator_name(first, last, db); in parse_base_unresolved_name()
1101 first = parse_template_args(t, last, db); in parse_base_unresolved_name()
1104 if (db.names.size() < 2) in parse_base_unresolved_name()
1106 auto args = db.names.back().move_full(); in parse_base_unresolved_name()
1107 db.names.pop_back(); in parse_base_unresolved_name()
1108 db.names.back().first += std::move(args); in parse_base_unresolved_name()
1123 parse_unresolved_qualifier_level(const char* first, const char* last, C& db) in parse_unresolved_qualifier_level() argument
1125 return parse_simple_id(first, last, db); in parse_unresolved_qualifier_level()
1140 parse_unresolved_name(const char* first, const char* last, C& db) in parse_unresolved_name() argument
1151 const char* t2 = parse_base_unresolved_name(t, last, db); in parse_unresolved_name()
1156 if (db.names.empty()) in parse_unresolved_name()
1158 db.names.back().first.insert(0, "::"); in parse_unresolved_name()
1167 const char* t1 = parse_unresolved_type(t, last, db); in parse_unresolved_name()
1171 t1 = parse_template_args(t, last, db); in parse_unresolved_name()
1174 if (db.names.size() < 2) in parse_unresolved_name()
1176 auto args = db.names.back().move_full(); in parse_unresolved_name()
1177 db.names.pop_back(); in parse_unresolved_name()
1178 db.names.back().first += std::move(args); in parse_unresolved_name()
1182 db.names.pop_back(); in parse_unresolved_name()
1188 t1 = parse_unresolved_qualifier_level(t, last, db); in parse_unresolved_name()
1189 if (t1 == t || t1 == last || db.names.size() < 2) in parse_unresolved_name()
1191 auto s = db.names.back().move_full(); in parse_unresolved_name()
1192 db.names.pop_back(); in parse_unresolved_name()
1193 db.names.back().first += "::" + std::move(s); in parse_unresolved_name()
1197 t1 = parse_base_unresolved_name(t, last, db); in parse_unresolved_name()
1200 if (!db.names.empty()) in parse_unresolved_name()
1201 db.names.pop_back(); in parse_unresolved_name()
1204 if (db.names.size() < 2) in parse_unresolved_name()
1206 auto s = db.names.back().move_full(); in parse_unresolved_name()
1207 db.names.pop_back(); in parse_unresolved_name()
1208 db.names.back().first += "::" + std::move(s); in parse_unresolved_name()
1214 const char* t1 = parse_unresolved_type(t, last, db); in parse_unresolved_name()
1218 t1 = parse_template_args(t, last, db); in parse_unresolved_name()
1221 if (db.names.size() < 2) in parse_unresolved_name()
1223 auto args = db.names.back().move_full(); in parse_unresolved_name()
1224 db.names.pop_back(); in parse_unresolved_name()
1225 db.names.back().first += std::move(args); in parse_unresolved_name()
1228 t1 = parse_base_unresolved_name(t, last, db); in parse_unresolved_name()
1231 if (!db.names.empty()) in parse_unresolved_name()
1232 db.names.pop_back(); in parse_unresolved_name()
1235 if (db.names.size() < 2) in parse_unresolved_name()
1237 auto s = db.names.back().move_full(); in parse_unresolved_name()
1238 db.names.pop_back(); in parse_unresolved_name()
1239 db.names.back().first += "::" + std::move(s); in parse_unresolved_name()
1244 t1 = parse_unresolved_qualifier_level(t, last, db); in parse_unresolved_name()
1250 if (db.names.empty()) in parse_unresolved_name()
1252 db.names.back().first.insert(0, "::"); in parse_unresolved_name()
1256 t1 = parse_unresolved_qualifier_level(t, last, db); in parse_unresolved_name()
1257 if (t1 == t || t1 == last || db.names.size() < 2) in parse_unresolved_name()
1259 auto s = db.names.back().move_full(); in parse_unresolved_name()
1260 db.names.pop_back(); in parse_unresolved_name()
1261 db.names.back().first += "::" + std::move(s); in parse_unresolved_name()
1265 t1 = parse_base_unresolved_name(t, last, db); in parse_unresolved_name()
1268 if (!db.names.empty()) in parse_unresolved_name()
1269 db.names.pop_back(); in parse_unresolved_name()
1272 if (db.names.size() < 2) in parse_unresolved_name()
1274 auto s = db.names.back().move_full(); in parse_unresolved_name()
1275 db.names.pop_back(); in parse_unresolved_name()
1276 db.names.back().first += "::" + std::move(s); in parse_unresolved_name()
1289 parse_dot_expr(const char* first, const char* last, C& db) in parse_dot_expr() argument
1293 const char* t = parse_expression(first+2, last, db); in parse_dot_expr()
1296 const char* t1 = parse_unresolved_name(t, last, db); in parse_dot_expr()
1299 if (db.names.size() < 2) in parse_dot_expr()
1301 auto name = db.names.back().move_full(); in parse_dot_expr()
1302 db.names.pop_back(); in parse_dot_expr()
1303 if (db.names.empty()) in parse_dot_expr()
1305 db.names.back().first += "." + name; in parse_dot_expr()
1317 parse_call_expr(const char* first, const char* last, C& db) in parse_call_expr() argument
1321 const char* t = parse_expression(first+2, last, db); in parse_call_expr()
1326 if (db.names.empty()) in parse_call_expr()
1328 db.names.back().first += db.names.back().second; in parse_call_expr()
1329 db.names.back().second = typename C::String(); in parse_call_expr()
1330 db.names.back().first.append("("); in parse_call_expr()
1334 const char* t1 = parse_expression(t, last, db); in parse_call_expr()
1337 if (db.names.empty()) in parse_call_expr()
1339 auto tmp = db.names.back().move_full(); in parse_call_expr()
1340 db.names.pop_back(); in parse_call_expr()
1343 if (db.names.empty()) in parse_call_expr()
1347 db.names.back().first.append(", "); in parse_call_expr()
1350 db.names.back().first.append(tmp); in parse_call_expr()
1355 if (db.names.empty()) in parse_call_expr()
1357 db.names.back().first.append(")"); in parse_call_expr()
1372 parse_new_expr(const char* first, const char* last, C& db) in parse_new_expr() argument
1393 const char* t1 = parse_expression(t, last, db); in parse_new_expr()
1399 if (db.names.empty()) in parse_new_expr()
1401 auto tmp = db.names.back().move_full(); in parse_new_expr()
1402 db.names.pop_back(); in parse_new_expr()
1405 if (db.names.empty()) in parse_new_expr()
1407 db.names.back().first.append(", "); in parse_new_expr()
1408 db.names.back().first.append(tmp); in parse_new_expr()
1415 const char* t1 = parse_type(t, last, db); in parse_new_expr()
1427 t1 = parse_expression(t, last, db); in parse_new_expr()
1432 if (db.names.empty()) in parse_new_expr()
1434 auto tmp = db.names.back().move_full(); in parse_new_expr()
1435 db.names.pop_back(); in parse_new_expr()
1438 if (db.names.empty()) in parse_new_expr()
1440 db.names.back().first.append(", "); in parse_new_expr()
1441 db.names.back().first.append(tmp); in parse_new_expr()
1453 if (db.names.empty()) in parse_new_expr()
1455 init_list = db.names.back().move_full(); in parse_new_expr()
1456 db.names.pop_back(); in parse_new_expr()
1458 if (db.names.empty()) in parse_new_expr()
1460 auto type = db.names.back().move_full(); in parse_new_expr()
1461 db.names.pop_back(); in parse_new_expr()
1465 if (db.names.empty()) in parse_new_expr()
1467 expr_list = db.names.back().move_full(); in parse_new_expr()
1468 db.names.pop_back(); in parse_new_expr()
1482 db.names.push_back(std::move(r)); in parse_new_expr()
1494 parse_conversion_expr(const char* first, const char* last, C& db) in parse_conversion_expr() argument
1498 bool try_to_parse_template_args = db.try_to_parse_template_args; in parse_conversion_expr()
1499 db.try_to_parse_template_args = false; in parse_conversion_expr()
1500 const char* t = parse_type(first+2, last, db); in parse_conversion_expr()
1501 db.try_to_parse_template_args = try_to_parse_template_args; in parse_conversion_expr()
1506 const char* t1 = parse_expression(t, last, db); in parse_conversion_expr()
1517 db.names.emplace_back(); in parse_conversion_expr()
1523 const char* t1 = parse_expression(t, last, db); in parse_conversion_expr()
1528 if (db.names.empty()) in parse_conversion_expr()
1530 auto tmp = db.names.back().move_full(); in parse_conversion_expr()
1531 db.names.pop_back(); in parse_conversion_expr()
1534 if (db.names.empty()) in parse_conversion_expr()
1536 db.names.back().first.append(", "); in parse_conversion_expr()
1537 db.names.back().first.append(tmp); in parse_conversion_expr()
1546 if (db.names.size() < 2) in parse_conversion_expr()
1548 auto tmp = db.names.back().move_full(); in parse_conversion_expr()
1549 db.names.pop_back(); in parse_conversion_expr()
1550 db.names.back() = "(" + db.names.back().move_full() + ")(" + tmp + ")"; in parse_conversion_expr()
1561 parse_arrow_expr(const char* first, const char* last, C& db) in parse_arrow_expr() argument
1565 const char* t = parse_expression(first+2, last, db); in parse_arrow_expr()
1568 const char* t1 = parse_expression(t, last, db); in parse_arrow_expr()
1571 if (db.names.size() < 2) in parse_arrow_expr()
1573 auto tmp = db.names.back().move_full(); in parse_arrow_expr()
1574 db.names.pop_back(); in parse_arrow_expr()
1575 db.names.back().first += "->"; in parse_arrow_expr()
1576 db.names.back().first += tmp; in parse_arrow_expr()
1591 parse_function_type(const char* first, const char* last, C& db) in parse_function_type() argument
1604 const char* t1 = parse_type(t, last, db); in parse_function_type()
1614 db.names.pop_back(); in parse_function_type()
1639 size_t k0 = db.names.size(); in parse_function_type()
1640 t1 = parse_type(t, last, db); in parse_function_type()
1641 size_t k1 = db.names.size(); in parse_function_type()
1648 sig += db.names[k].move_full(); in parse_function_type()
1651 db.names.pop_back(); in parse_function_type()
1664 if (db.names.empty()) in parse_function_type()
1666 db.names.back().first += " "; in parse_function_type()
1667 db.names.back().second.insert(0, sig); in parse_function_type()
1679 parse_pointer_to_member_type(const char* first, const char* last, C& db) in parse_pointer_to_member_type() argument
1683 const char* t = parse_type(first+1, last, db); in parse_pointer_to_member_type()
1686 const char* t2 = parse_type(t, last, db); in parse_pointer_to_member_type()
1689 if (db.names.size() < 2) in parse_pointer_to_member_type()
1691 auto func = std::move(db.names.back()); in parse_pointer_to_member_type()
1692 db.names.pop_back(); in parse_pointer_to_member_type()
1693 auto class_type = std::move(db.names.back()); in parse_pointer_to_member_type()
1696 … db.names.back().first = std::move(func.first) + "(" + class_type.move_full() + "::*"; in parse_pointer_to_member_type()
1697 db.names.back().second = ")" + std::move(func.second); in parse_pointer_to_member_type()
1701 … db.names.back().first = std::move(func.first) + " " + class_type.move_full() + "::*"; in parse_pointer_to_member_type()
1702 db.names.back().second = std::move(func.second); in parse_pointer_to_member_type()
1716 parse_array_type(const char* first, const char* last, C& db) in parse_array_type() argument
1722 const char* t = parse_type(first+2, last, db); in parse_array_type()
1725 if (db.names.empty()) in parse_array_type()
1727 if (db.names.back().second.substr(0, 2) == " [") in parse_array_type()
1728 db.names.back().second.erase(0, 1); in parse_array_type()
1729 db.names.back().second.insert(0, " []"); in parse_array_type()
1738 const char* t2 = parse_type(t+1, last, db); in parse_array_type()
1741 if (db.names.empty()) in parse_array_type()
1743 if (db.names.back().second.substr(0, 2) == " [") in parse_array_type()
1744 db.names.back().second.erase(0, 1); in parse_array_type()
1745 db.names.back().second.insert(0, " [" + typename C::String(first+1, t) + "]"); in parse_array_type()
1752 const char* t = parse_expression(first+1, last, db); in parse_array_type()
1755 const char* t2 = parse_type(++t, last, db); in parse_array_type()
1758 if (db.names.size() < 2) in parse_array_type()
1760 auto type = std::move(db.names.back()); in parse_array_type()
1761 db.names.pop_back(); in parse_array_type()
1762 auto expr = std::move(db.names.back()); in parse_array_type()
1763 db.names.back().first = std::move(type.first); in parse_array_type()
1766 db.names.back().second = " [" + expr.move_full() + "]" + std::move(type.second); in parse_array_type()
1780 parse_decltype(const char* first, const char* last, C& db) in parse_decltype() argument
1789 const char* t = parse_expression(first+2, last, db); in parse_decltype()
1792 if (db.names.empty()) in parse_decltype()
1794 db.names.back() = "decltype(" + db.names.back().move_full() + ")"; in parse_decltype()
1813 parse_vector_type(const char* first, const char* last, C& db) in parse_vector_type() argument
1828 const char* t1 = parse_type(t, last, db); in parse_vector_type()
1831 if (db.names.empty()) in parse_vector_type()
1833 db.names.back().first += " vector[" + typename C::String(num, sz) + "]"; in parse_vector_type()
1840 db.names.push_back("pixel vector[" + typename C::String(num, sz) + "]"); in parse_vector_type()
1851 const char* t = parse_expression(t1, last, db); in parse_vector_type()
1854 if (db.names.empty()) in parse_vector_type()
1856 num = db.names.back().move_full(); in parse_vector_type()
1857 db.names.pop_back(); in parse_vector_type()
1863 const char* t = parse_type(t1, last, db); in parse_vector_type()
1866 if (db.names.empty()) in parse_vector_type()
1868 db.names.back().first += " vector[" + num + "]"; in parse_vector_type()
1902 parse_type(const char* first, const char* last, C& db) in parse_type() argument
1917 size_t k0 = db.names.size(); in parse_type()
1918 const char* t1 = parse_type(t, last, db); in parse_type()
1919 size_t k1 = db.names.size(); in parse_type()
1923 db.subs.pop_back(); in parse_type()
1924 db.subs.emplace_back(db.names.get_allocator()); in parse_type()
1929 size_t p = db.names[k].second.size(); in parse_type()
1930 if (db.names[k].second[p - 2] == '&' && in parse_type()
1931 db.names[k].second[p - 1] == '&') in parse_type()
1933 else if (db.names[k].second.back() == '&') in parse_type()
1937 db.names[k].second.insert(p, " const"); in parse_type()
1942 db.names[k].second.insert(p, " volatile"); in parse_type()
1946 db.names[k].second.insert(p, " restrict"); in parse_type()
1951 db.names[k].first.append(" const"); in parse_type()
1953 db.names[k].first.append(" volatile"); in parse_type()
1955 db.names[k].first.append(" restrict"); in parse_type()
1957 db.subs.back().push_back(db.names[k]); in parse_type()
1966 const char* t = parse_builtin_type(first, last, db); in parse_type()
1976 t = parse_array_type(first, last, db); in parse_type()
1979 if (db.names.empty()) in parse_type()
1982 … db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); in parse_type()
1986 t = parse_type(first+1, last, db); in parse_type()
1989 if (db.names.empty()) in parse_type()
1991 db.names.back().first.append(" complex"); in parse_type()
1993 … db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); in parse_type()
1997 t = parse_function_type(first, last, db); in parse_type()
2000 if (db.names.empty()) in parse_type()
2003 … db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); in parse_type()
2007 t = parse_type(first+1, last, db); in parse_type()
2010 if (db.names.empty()) in parse_type()
2012 db.names.back().first.append(" imaginary"); in parse_type()
2014 … db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); in parse_type()
2018 t = parse_pointer_to_member_type(first, last, db); in parse_type()
2021 if (db.names.empty()) in parse_type()
2024 … db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); in parse_type()
2029 size_t k0 = db.names.size(); in parse_type()
2030 t = parse_type(first+1, last, db); in parse_type()
2031 size_t k1 = db.names.size(); in parse_type()
2034 db.subs.emplace_back(db.names.get_allocator()); in parse_type()
2037 if (db.names[k].second.substr(0, 2) == " [") in parse_type()
2039 db.names[k].first += " ("; in parse_type()
2040 db.names[k].second.insert(0, ")"); in parse_type()
2042 else if (!db.names[k].second.empty() && in parse_type()
2043 db.names[k].second.front() == '(') in parse_type()
2045 db.names[k].first += "("; in parse_type()
2046 db.names[k].second.insert(0, ")"); in parse_type()
2048 db.names[k].first.append("&&"); in parse_type()
2049 db.subs.back().push_back(db.names[k]); in parse_type()
2057 size_t k0 = db.names.size(); in parse_type()
2058 t = parse_type(first+1, last, db); in parse_type()
2059 size_t k1 = db.names.size(); in parse_type()
2062 db.subs.emplace_back(db.names.get_allocator()); in parse_type()
2065 if (db.names[k].second.substr(0, 2) == " [") in parse_type()
2067 db.names[k].first += " ("; in parse_type()
2068 db.names[k].second.insert(0, ")"); in parse_type()
2070 else if (!db.names[k].second.empty() && in parse_type()
2071 db.names[k].second.front() == '(') in parse_type()
2073 db.names[k].first += "("; in parse_type()
2074 db.names[k].second.insert(0, ")"); in parse_type()
2076 … if (first[1] != 'U' || db.names[k].first.substr(0, 12) != "objc_object<") in parse_type()
2078 db.names[k].first.append("*"); in parse_type()
2082 db.names[k].first.replace(0, 11, "id"); in parse_type()
2084 db.subs.back().push_back(db.names[k]); in parse_type()
2092 size_t k0 = db.names.size(); in parse_type()
2093 t = parse_type(first+1, last, db); in parse_type()
2094 size_t k1 = db.names.size(); in parse_type()
2097 db.subs.emplace_back(db.names.get_allocator()); in parse_type()
2100 if (db.names[k].second.substr(0, 2) == " [") in parse_type()
2102 db.names[k].first += " ("; in parse_type()
2103 db.names[k].second.insert(0, ")"); in parse_type()
2105 else if (!db.names[k].second.empty() && in parse_type()
2106 db.names[k].second.front() == '(') in parse_type()
2108 db.names[k].first += "("; in parse_type()
2109 db.names[k].second.insert(0, ")"); in parse_type()
2111 db.names[k].first.append("&"); in parse_type()
2112 db.subs.back().push_back(db.names[k]); in parse_type()
2120 size_t k0 = db.names.size(); in parse_type()
2121 t = parse_template_param(first, last, db); in parse_type()
2122 size_t k1 = db.names.size(); in parse_type()
2125 db.subs.emplace_back(db.names.get_allocator()); in parse_type()
2127 db.subs.back().push_back(db.names[k]); in parse_type()
2128 if (db.try_to_parse_template_args && k1 == k0+1) in parse_type()
2130 const char* t1 = parse_template_args(t, last, db); in parse_type()
2133 auto args = db.names.back().move_full(); in parse_type()
2134 db.names.pop_back(); in parse_type()
2135 db.names.back().first += std::move(args); in parse_type()
2136 … db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); in parse_type()
2147 t = parse_source_name(first+1, last, db); in parse_type()
2150 const char* t2 = parse_type(t, last, db); in parse_type()
2153 if (db.names.size() < 2) in parse_type()
2155 auto type = db.names.back().move_full(); in parse_type()
2156 db.names.pop_back(); in parse_type()
2157 if (db.names.back().first.substr(0, 9) != "objcproto") in parse_type()
2159 db.names.back() = type + " " + db.names.back().move_full(); in parse_type()
2163 auto proto = db.names.back().move_full(); in parse_type()
2164 db.names.pop_back(); in parse_type()
2165 … t = parse_source_name(proto.data() + 9, proto.data() + proto.size(), db); in parse_type()
2168 … db.names.back() = type + "<" + db.names.back().move_full() + ">"; in parse_type()
2172 db.names.push_back(type + " " + proto); in parse_type()
2175 … db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); in parse_type()
2184 t = parse_name(first, last, db); in parse_type()
2187 if (db.names.empty()) in parse_type()
2189 … db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); in parse_type()
2195 t = parse_substitution(first, last, db); in parse_type()
2201 t = parse_template_args(first, last, db); in parse_type()
2204 if (db.names.size() < 2) in parse_type()
2206 auto template_args = db.names.back().move_full(); in parse_type()
2207 db.names.pop_back(); in parse_type()
2208 db.names.back().first += template_args; in parse_type()
2210 … db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); in parse_type()
2223 size_t k0 = db.names.size(); in parse_type()
2224 t = parse_type(first+2, last, db); in parse_type()
2225 size_t k1 = db.names.size(); in parse_type()
2228 db.subs.emplace_back(db.names.get_allocator()); in parse_type()
2230 db.subs.back().push_back(db.names[k]); in parse_type()
2238 t = parse_decltype(first, last, db); in parse_type()
2241 if (db.names.empty()) in parse_type()
2243 … db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); in parse_type()
2249 t = parse_vector_type(first, last, db); in parse_type()
2252 if (db.names.empty()) in parse_type()
2254 … db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); in parse_type()
2265 t = parse_builtin_type(first, last, db); in parse_type()
2272 t = parse_name(first, last, db); in parse_type()
2275 if (db.names.empty()) in parse_type()
2277 … db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); in parse_type()
2345 parse_operator_name(const char* first, const char* last, C& db) in parse_operator_name() argument
2355 db.names.push_back("operator&&"); in parse_operator_name()
2360 db.names.push_back("operator&"); in parse_operator_name()
2364 db.names.push_back("operator&="); in parse_operator_name()
2368 db.names.push_back("operator="); in parse_operator_name()
2377 db.names.push_back("operator()"); in parse_operator_name()
2381 db.names.push_back("operator,"); in parse_operator_name()
2385 db.names.push_back("operator~"); in parse_operator_name()
2390 bool try_to_parse_template_args = db.try_to_parse_template_args; in parse_operator_name()
2391 db.try_to_parse_template_args = false; in parse_operator_name()
2392 const char* t = parse_type(first+2, last, db); in parse_operator_name()
2393 db.try_to_parse_template_args = try_to_parse_template_args; in parse_operator_name()
2396 if (db.names.empty()) in parse_operator_name()
2398 db.names.back().first.insert(0, "operator "); in parse_operator_name()
2399 db.parsed_ctor_dtor_cv = true; in parse_operator_name()
2410 db.names.push_back("operator delete[]"); in parse_operator_name()
2414 db.names.push_back("operator*"); in parse_operator_name()
2418 db.names.push_back("operator delete"); in parse_operator_name()
2422 db.names.push_back("operator/"); in parse_operator_name()
2426 db.names.push_back("operator/="); in parse_operator_name()
2435 db.names.push_back("operator^"); in parse_operator_name()
2439 db.names.push_back("operator^="); in parse_operator_name()
2443 db.names.push_back("operator=="); in parse_operator_name()
2452 db.names.push_back("operator>="); in parse_operator_name()
2456 db.names.push_back("operator>"); in parse_operator_name()
2464 db.names.push_back("operator[]"); in parse_operator_name()
2472 db.names.push_back("operator<="); in parse_operator_name()
2477 const char* t = parse_source_name(first+2, last, db); in parse_operator_name()
2480 if (db.names.empty()) in parse_operator_name()
2482 db.names.back().first.insert(0, "operator\"\" "); in parse_operator_name()
2488 db.names.push_back("operator<<"); in parse_operator_name()
2492 db.names.push_back("operator<<="); in parse_operator_name()
2496 db.names.push_back("operator<"); in parse_operator_name()
2505 db.names.push_back("operator-"); in parse_operator_name()
2509 db.names.push_back("operator-="); in parse_operator_name()
2513 db.names.push_back("operator*"); in parse_operator_name()
2517 db.names.push_back("operator*="); in parse_operator_name()
2521 db.names.push_back("operator--"); in parse_operator_name()
2530 db.names.push_back("operator new[]"); in parse_operator_name()
2534 db.names.push_back("operator!="); in parse_operator_name()
2538 db.names.push_back("operator-"); in parse_operator_name()
2542 db.names.push_back("operator!"); in parse_operator_name()
2546 db.names.push_back("operator new"); in parse_operator_name()
2555 db.names.push_back("operator||"); in parse_operator_name()
2559 db.names.push_back("operator|"); in parse_operator_name()
2563 db.names.push_back("operator|="); in parse_operator_name()
2572 db.names.push_back("operator->*"); in parse_operator_name()
2576 db.names.push_back("operator+"); in parse_operator_name()
2580 db.names.push_back("operator+="); in parse_operator_name()
2584 db.names.push_back("operator++"); in parse_operator_name()
2588 db.names.push_back("operator+"); in parse_operator_name()
2592 db.names.push_back("operator->"); in parse_operator_name()
2600 db.names.push_back("operator?"); in parse_operator_name()
2608 db.names.push_back("operator%"); in parse_operator_name()
2612 db.names.push_back("operator%="); in parse_operator_name()
2616 db.names.push_back("operator>>"); in parse_operator_name()
2620 db.names.push_back("operator>>="); in parse_operator_name()
2628 const char* t = parse_source_name(first+2, last, db); in parse_operator_name()
2631 if (db.names.empty()) in parse_operator_name()
2633 db.names.back().first.insert(0, "operator "); in parse_operator_name()
2645 parse_integer_literal(const char* first, const char* last, const typename C::String& lit, C& db) in parse_integer_literal() argument
2651 db.names.push_back("(" + lit + ")"); in parse_integer_literal()
2653 db.names.emplace_back(); in parse_integer_literal()
2656 db.names.back().first += '-'; in parse_integer_literal()
2659 db.names.back().first.append(first, t); in parse_integer_literal()
2661 db.names.back().first += lit; in parse_integer_literal()
2676 parse_expr_primary(const char* first, const char* last, C& db) in parse_expr_primary() argument
2684 const char* t = parse_integer_literal(first+2, last, "wchar_t", db); in parse_expr_primary()
2695 db.names.push_back("false"); in parse_expr_primary()
2699 db.names.push_back("true"); in parse_expr_primary()
2707 const char* t = parse_integer_literal(first+2, last, "char", db); in parse_expr_primary()
2714 const char* t = parse_integer_literal(first+2, last, "signed char", db); in parse_expr_primary()
2721 const char* t = parse_integer_literal(first+2, last, "unsigned char", db); in parse_expr_primary()
2728 const char* t = parse_integer_literal(first+2, last, "short", db); in parse_expr_primary()
2735 const char* t = parse_integer_literal(first+2, last, "unsigned short", db); in parse_expr_primary()
2742 const char* t = parse_integer_literal(first+2, last, "", db); in parse_expr_primary()
2749 const char* t = parse_integer_literal(first+2, last, "u", db); in parse_expr_primary()
2756 const char* t = parse_integer_literal(first+2, last, "l", db); in parse_expr_primary()
2763 const char* t = parse_integer_literal(first+2, last, "ul", db); in parse_expr_primary()
2770 const char* t = parse_integer_literal(first+2, last, "ll", db); in parse_expr_primary()
2777 const char* t = parse_integer_literal(first+2, last, "ull", db); in parse_expr_primary()
2784 const char* t = parse_integer_literal(first+2, last, "__int128", db); in parse_expr_primary()
2791 const char* t = parse_integer_literal(first+2, last, "unsigned __int128", db); in parse_expr_primary()
2798 const char* t = parse_floating_number<float>(first+2, last, db); in parse_expr_primary()
2805 const char* t = parse_floating_number<double>(first+2, last, db); in parse_expr_primary()
2812 const char* t = parse_floating_number<long double>(first+2, last, db); in parse_expr_primary()
2820 const char* t = parse_encoding(first+3, last, db); in parse_expr_primary()
2832 const char* t = parse_type(first+1, last, db); in parse_expr_primary()
2842 if (db.names.empty()) in parse_expr_primary()
2844 … db.names.back() = "(" + db.names.back().move_full() + ")" + typename C::String(t, n); in parse_expr_primary()
2933 parse_ctor_dtor_name(const char* first, const char* last, C& db) in parse_ctor_dtor_name() argument
2935 if (last-first >= 2 && !db.names.empty()) in parse_ctor_dtor_name()
2946 if (db.names.empty()) in parse_ctor_dtor_name()
2948 db.names.push_back(base_name(db.names.back().first)); in parse_ctor_dtor_name()
2950 db.parsed_ctor_dtor_cv = true; in parse_ctor_dtor_name()
2961 if (db.names.empty()) in parse_ctor_dtor_name()
2963 db.names.push_back("~" + base_name(db.names.back().first)); in parse_ctor_dtor_name()
2965 db.parsed_ctor_dtor_cv = true; in parse_ctor_dtor_name()
2983 parse_unnamed_type_name(const char* first, const char* last, C& db) in parse_unnamed_type_name() argument
2992 db.names.push_back(typename C::String("'unnamed")); in parse_unnamed_type_name()
2996 db.names.pop_back(); in parse_unnamed_type_name()
3004 db.names.back().first.append(t0, t1); in parse_unnamed_type_name()
3007 db.names.back().first.push_back('\''); in parse_unnamed_type_name()
3010 db.names.pop_back(); in parse_unnamed_type_name()
3018 db.names.push_back(typename C::String("'lambda'(")); in parse_unnamed_type_name()
3022 db.names.back().first += ')'; in parse_unnamed_type_name()
3027 const char* t1 = parse_type(t0, last, db); in parse_unnamed_type_name()
3030 if(!db.names.empty()) in parse_unnamed_type_name()
3031 db.names.pop_back(); in parse_unnamed_type_name()
3034 if (db.names.size() < 2) in parse_unnamed_type_name()
3036 auto tmp = db.names.back().move_full(); in parse_unnamed_type_name()
3037 db.names.pop_back(); in parse_unnamed_type_name()
3038 db.names.back().first.append(tmp); in parse_unnamed_type_name()
3042 t1 = parse_type(t0, last, db); in parse_unnamed_type_name()
3045 if (db.names.size() < 2) in parse_unnamed_type_name()
3047 tmp = db.names.back().move_full(); in parse_unnamed_type_name()
3048 db.names.pop_back(); in parse_unnamed_type_name()
3051 db.names.back().first.append(", "); in parse_unnamed_type_name()
3052 db.names.back().first.append(tmp); in parse_unnamed_type_name()
3056 if(db.names.empty()) in parse_unnamed_type_name()
3058 db.names.back().first.append(")"); in parse_unnamed_type_name()
3062 if (!db.names.empty()) in parse_unnamed_type_name()
3063 db.names.pop_back(); in parse_unnamed_type_name()
3069 if(!db.names.empty()) in parse_unnamed_type_name()
3070 db.names.pop_back(); in parse_unnamed_type_name()
3078 db.names.back().first.insert(db.names.back().first.begin()+7, t0, t1); in parse_unnamed_type_name()
3083 if(!db.names.empty()) in parse_unnamed_type_name()
3084 db.names.pop_back(); in parse_unnamed_type_name()
3102 parse_unqualified_name(const char* first, const char* last, C& db) in parse_unqualified_name() argument
3111 t = parse_ctor_dtor_name(first, last, db); in parse_unqualified_name()
3116 t = parse_unnamed_type_name(first, last, db); in parse_unqualified_name()
3129 t = parse_source_name(first, last, db); in parse_unqualified_name()
3134 t = parse_operator_name(first, last, db); in parse_unqualified_name()
3149 parse_unscoped_name(const char* first, const char* last, C& db) in parse_unscoped_name() argument
3162 const char* t1 = parse_unqualified_name(t0, last, db); in parse_unscoped_name()
3167 if (db.names.empty()) in parse_unscoped_name()
3169 db.names.back().first.insert(0, "std::"); in parse_unscoped_name()
3181 parse_alignof_type(const char* first, const char* last, C& db) in parse_alignof_type() argument
3185 const char* t = parse_type(first+2, last, db); in parse_alignof_type()
3188 if (db.names.empty()) in parse_alignof_type()
3190 db.names.back().first = "alignof (" + db.names.back().move_full() + ")"; in parse_alignof_type()
3201 parse_alignof_expr(const char* first, const char* last, C& db) in parse_alignof_expr() argument
3205 const char* t = parse_expression(first+2, last, db); in parse_alignof_expr()
3208 if (db.names.empty()) in parse_alignof_expr()
3210 db.names.back().first = "alignof (" + db.names.back().move_full() + ")"; in parse_alignof_expr()
3219 parse_noexcept_expression(const char* first, const char* last, C& db) in parse_noexcept_expression() argument
3221 const char* t1 = parse_expression(first, last, db); in parse_noexcept_expression()
3224 if (db.names.empty()) in parse_noexcept_expression()
3226 db.names.back().first = "noexcept (" + db.names.back().move_full() + ")"; in parse_noexcept_expression()
3234 parse_prefix_expression(const char* first, const char* last, const typename C::String& op, C& db) in parse_prefix_expression() argument
3236 const char* t1 = parse_expression(first, last, db); in parse_prefix_expression()
3239 if (db.names.empty()) in parse_prefix_expression()
3241 db.names.back().first = op + "(" + db.names.back().move_full() + ")"; in parse_prefix_expression()
3249 parse_binary_expression(const char* first, const char* last, const typename C::String& op, C& db) in parse_binary_expression() argument
3251 const char* t1 = parse_expression(first, last, db); in parse_binary_expression()
3254 const char* t2 = parse_expression(t1, last, db); in parse_binary_expression()
3257 if (db.names.size() < 2) in parse_binary_expression()
3259 auto op2 = db.names.back().move_full(); in parse_binary_expression()
3260 db.names.pop_back(); in parse_binary_expression()
3261 auto op1 = db.names.back().move_full(); in parse_binary_expression()
3262 auto& nm = db.names.back().first; in parse_binary_expression()
3271 else if(!db.names.empty()) in parse_binary_expression()
3272 db.names.pop_back(); in parse_binary_expression()
3319 parse_expression(const char* first, const char* last, C& db) in parse_expression() argument
3333 first = parse_expr_primary(first, last, db); in parse_expression()
3336 first = parse_template_param(first, last, db); in parse_expression()
3339 first = parse_function_param(first, last, db); in parse_expression()
3345 t = parse_binary_expression(first+2, last, "&&", db); in parse_expression()
3350 t = parse_prefix_expression(first+2, last, "&", db); in parse_expression()
3355 t = parse_binary_expression(first+2, last, "&", db); in parse_expression()
3360 t = parse_binary_expression(first+2, last, "&=", db); in parse_expression()
3365 t = parse_binary_expression(first+2, last, "=", db); in parse_expression()
3370 first = parse_alignof_type(first, last, db); in parse_expression()
3373 first = parse_alignof_expr(first, last, db); in parse_expression()
3381 first = parse_const_cast_expr(first, last, db); in parse_expression()
3384 first = parse_call_expr(first, last, db); in parse_expression()
3387 t = parse_binary_expression(first+2, last, ",", db); in parse_expression()
3392 t = parse_prefix_expression(first+2, last, "~", db); in parse_expression()
3397 first = parse_conversion_expr(first, last, db); in parse_expression()
3406 const char* t1 = parse_expression(t+2, last, db); in parse_expression()
3409 if (db.names.empty()) in parse_expression()
3411 … db.names.back().first = (parsed_gs ? typename C::String("::") : typename C::String()) + in parse_expression()
3412 "delete[] " + db.names.back().move_full(); in parse_expression()
3418 first = parse_dynamic_cast_expr(first, last, db); in parse_expression()
3421 t = parse_prefix_expression(first+2, last, "*", db); in parse_expression()
3427 const char* t1 = parse_expression(t+2, last, db); in parse_expression()
3430 if (db.names.empty()) in parse_expression()
3432 … db.names.back().first = (parsed_gs ? typename C::String("::") : typename C::String()) + in parse_expression()
3433 "delete " + db.names.back().move_full(); in parse_expression()
3439 return parse_unresolved_name(first, last, db); in parse_expression()
3441 first = parse_dot_star_expr(first, last, db); in parse_expression()
3444 first = parse_dot_expr(first, last, db); in parse_expression()
3447 t = parse_binary_expression(first+2, last, "/", db); in parse_expression()
3452 t = parse_binary_expression(first+2, last, "/=", db); in parse_expression()
3462 t = parse_binary_expression(first+2, last, "^", db); in parse_expression()
3467 t = parse_binary_expression(first+2, last, "^=", db); in parse_expression()
3472 t = parse_binary_expression(first+2, last, "==", db); in parse_expression()
3482 t = parse_binary_expression(first+2, last, ">=", db); in parse_expression()
3487 t = parse_binary_expression(first+2, last, ">", db); in parse_expression()
3496 const char* t1 = parse_expression(first+2, last, db); in parse_expression()
3499 const char* t2 = parse_expression(t1, last, db); in parse_expression()
3502 if (db.names.size() < 2) in parse_expression()
3504 auto op2 = db.names.back().move_full(); in parse_expression()
3505 db.names.pop_back(); in parse_expression()
3506 auto op1 = db.names.back().move_full(); in parse_expression()
3507 db.names.back() = "(" + op1 + ")[" + op2 + "]"; in parse_expression()
3510 else if (!db.names.empty()) in parse_expression()
3511 db.names.pop_back(); in parse_expression()
3519 t = parse_binary_expression(first+2, last, "<=", db); in parse_expression()
3524 t = parse_binary_expression(first+2, last, "<<", db); in parse_expression()
3529 t = parse_binary_expression(first+2, last, "<<=", db); in parse_expression()
3534 t = parse_binary_expression(first+2, last, "<", db); in parse_expression()
3544 t = parse_binary_expression(first+2, last, "-", db); in parse_expression()
3549 t = parse_binary_expression(first+2, last, "-=", db); in parse_expression()
3554 t = parse_binary_expression(first+2, last, "*", db); in parse_expression()
3559 t = parse_binary_expression(first+2, last, "*=", db); in parse_expression()
3566 t = parse_prefix_expression(first+3, last, "--", db); in parse_expression()
3572 const char* t1 = parse_expression(first+2, last, db); in parse_expression()
3575 if (db.names.empty()) in parse_expression()
3577 db.names.back() = "(" + db.names.back().move_full() + ")--"; in parse_expression()
3589 first = parse_new_expr(first, last, db); in parse_expression()
3592 t = parse_binary_expression(first+2, last, "!=", db); in parse_expression()
3597 t = parse_prefix_expression(first+2, last, "-", db); in parse_expression()
3602 t = parse_prefix_expression(first+2, last, "!", db); in parse_expression()
3607 t = parse_noexcept_expression(first+2, last, db); in parse_expression()
3617 return parse_unresolved_name(first, last, db); in parse_expression()
3619 t = parse_binary_expression(first+2, last, "||", db); in parse_expression()
3624 t = parse_binary_expression(first+2, last, "|", db); in parse_expression()
3629 t = parse_binary_expression(first+2, last, "|=", db); in parse_expression()
3639 t = parse_binary_expression(first+2, last, "->*", db); in parse_expression()
3644 t = parse_binary_expression(first+2, last, "+", db); in parse_expression()
3649 t = parse_binary_expression(first+2, last, "+=", db); in parse_expression()
3656 t = parse_prefix_expression(first+3, last, "++", db); in parse_expression()
3662 const char* t1 = parse_expression(first+2, last, db); in parse_expression()
3665 if (db.names.empty()) in parse_expression()
3667 db.names.back() = "(" + db.names.back().move_full() + ")++"; in parse_expression()
3673 t = parse_prefix_expression(first+2, last, "+", db); in parse_expression()
3678 first = parse_arrow_expr(first, last, db); in parse_expression()
3685 const char* t1 = parse_expression(first+2, last, db); in parse_expression()
3688 const char* t2 = parse_expression(t1, last, db); in parse_expression()
3691 const char* t3 = parse_expression(t2, last, db); in parse_expression()
3694 if (db.names.size() < 3) in parse_expression()
3696 auto op3 = db.names.back().move_full(); in parse_expression()
3697 db.names.pop_back(); in parse_expression()
3698 auto op2 = db.names.back().move_full(); in parse_expression()
3699 db.names.pop_back(); in parse_expression()
3700 auto op1 = db.names.back().move_full(); in parse_expression()
3701 db.names.back() = "(" + op1 + ") ? (" + op2 + ") : (" + op3 + ")"; in parse_expression()
3706 if (db.names.size() < 2) in parse_expression()
3708 db.names.pop_back(); in parse_expression()
3709 db.names.pop_back(); in parse_expression()
3712 else if (!db.names.empty()) in parse_expression()
3713 db.names.pop_back(); in parse_expression()
3721 first = parse_reinterpret_cast_expr(first, last, db); in parse_expression()
3724 t = parse_binary_expression(first+2, last, "%", db); in parse_expression()
3729 t = parse_binary_expression(first+2, last, "%=", db); in parse_expression()
3734 t = parse_binary_expression(first+2, last, ">>", db); in parse_expression()
3739 t = parse_binary_expression(first+2, last, ">>=", db); in parse_expression()
3749 first = parse_static_cast_expr(first, last, db); in parse_expression()
3752 first = parse_pack_expansion(first, last, db); in parse_expression()
3755 return parse_unresolved_name(first, last, db); in parse_expression()
3757 first = parse_sizeof_type_expr(first, last, db); in parse_expression()
3760 first = parse_sizeof_expr_expr(first, last, db); in parse_expression()
3768 first = parse_sizeof_param_pack_expr(first, last, db); in parse_expression()
3771 first = parse_sizeof_function_param_pack_expr(first, last, db); in parse_expression()
3783 first = parse_typeid_expr(first, last, db); in parse_expression()
3786 db.names.push_back("throw"); in parse_expression()
3790 first = parse_throw_expr(first, last, db); in parse_expression()
3803 return parse_unresolved_name(first, last, db); in parse_expression()
3817 parse_template_arg(const char* first, const char* last, C& db) in parse_template_arg() argument
3825 t = parse_expression(first+1, last, db); in parse_template_arg()
3838 const char* t1 = parse_template_arg(t, last, db); in parse_template_arg()
3849 t = parse_encoding(first+2, last, db); in parse_template_arg()
3854 first = parse_expr_primary(first, last, db); in parse_template_arg()
3858 first = parse_type(first, last, db); in parse_template_arg()
3870 parse_template_args(const char* first, const char* last, C& db) in parse_template_args() argument
3874 if (db.tag_templates) in parse_template_args()
3875 db.template_param.back().clear(); in parse_template_args()
3880 if (db.tag_templates) in parse_template_args()
3881 db.template_param.emplace_back(db.names.get_allocator()); in parse_template_args()
3882 size_t k0 = db.names.size(); in parse_template_args()
3883 const char* t1 = parse_template_arg(t, last, db); in parse_template_args()
3884 size_t k1 = db.names.size(); in parse_template_args()
3885 if (db.tag_templates) in parse_template_args()
3886 db.template_param.pop_back(); in parse_template_args()
3889 if (db.tag_templates) in parse_template_args()
3891 db.template_param.back().emplace_back(db.names.get_allocator()); in parse_template_args()
3893 db.template_param.back().back().push_back(db.names[k]); in parse_template_args()
3899 args += db.names[k].move_full(); in parse_template_args()
3902 if (!db.names.empty()) in parse_template_args()
3903 db.names.pop_back(); in parse_template_args()
3911 db.names.push_back(std::move(args)); in parse_template_args()
3935 parse_nested_name(const char* first, const char* last, C& db, in parse_nested_name() argument
3944 db.ref = 0; in parse_nested_name()
3947 db.ref = 1; in parse_nested_name()
3952 db.ref = 2; in parse_nested_name()
3955 db.names.emplace_back(); in parse_nested_name()
3959 db.names.back().first = "std"; in parse_nested_name()
3963 db.names.pop_back(); in parse_nested_name()
3977 t1 = parse_substitution(t0, last, db); in parse_nested_name()
3980 auto name = db.names.back().move_full(); in parse_nested_name()
3981 db.names.pop_back(); in parse_nested_name()
3982 if (db.names.empty()) in parse_nested_name()
3984 if (!db.names.back().first.empty()) in parse_nested_name()
3986 db.names.back().first += "::" + name; in parse_nested_name()
3987 … db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); in parse_nested_name()
3990 db.names.back().first = name; in parse_nested_name()
3998 t1 = parse_template_param(t0, last, db); in parse_nested_name()
4001 auto name = db.names.back().move_full(); in parse_nested_name()
4002 db.names.pop_back(); in parse_nested_name()
4003 if (db.names.empty()) in parse_nested_name()
4005 if (!db.names.back().first.empty()) in parse_nested_name()
4006 db.names.back().first += "::" + name; in parse_nested_name()
4008 db.names.back().first = name; in parse_nested_name()
4009 … db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); in parse_nested_name()
4019 t1 = parse_decltype(t0, last, db); in parse_nested_name()
4022 auto name = db.names.back().move_full(); in parse_nested_name()
4023 db.names.pop_back(); in parse_nested_name()
4024 if (db.names.empty()) in parse_nested_name()
4026 if (!db.names.back().first.empty()) in parse_nested_name()
4027 db.names.back().first += "::" + name; in parse_nested_name()
4029 db.names.back().first = name; in parse_nested_name()
4030 … db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); in parse_nested_name()
4038 t1 = parse_template_args(t0, last, db); in parse_nested_name()
4041 auto name = db.names.back().move_full(); in parse_nested_name()
4042 db.names.pop_back(); in parse_nested_name()
4043 if (db.names.empty()) in parse_nested_name()
4045 db.names.back().first += name; in parse_nested_name()
4046 … db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); in parse_nested_name()
4059 t1 = parse_unqualified_name(t0, last, db); in parse_nested_name()
4062 auto name = db.names.back().move_full(); in parse_nested_name()
4063 db.names.pop_back(); in parse_nested_name()
4064 if (db.names.empty()) in parse_nested_name()
4066 if (!db.names.back().first.empty()) in parse_nested_name()
4067 db.names.back().first += "::" + name; in parse_nested_name()
4069 db.names.back().first = name; in parse_nested_name()
4070 … db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); in parse_nested_name()
4079 db.cv = cv; in parse_nested_name()
4080 if (pop_subs && !db.subs.empty()) in parse_nested_name()
4081 db.subs.pop_back(); in parse_nested_name()
4132 parse_local_name(const char* first, const char* last, C& db, in parse_local_name() argument
4137 const char* t = parse_encoding(first+1, last, db); in parse_local_name()
4144 if (db.names.empty()) in parse_local_name()
4146 db.names.back().first.append("::string literal"); in parse_local_name()
4155 t1 = parse_name(t, last, db, in parse_local_name()
4159 if (db.names.size() < 2) in parse_local_name()
4161 auto name = db.names.back().move_full(); in parse_local_name()
4162 db.names.pop_back(); in parse_local_name()
4163 if (db.names.empty()) in parse_local_name()
4165 db.names.back().first.append("::"); in parse_local_name()
4166 db.names.back().first.append(name); in parse_local_name()
4169 else if (!db.names.empty()) in parse_local_name()
4170 db.names.pop_back(); in parse_local_name()
4176 const char* t1 = parse_name(t, last, db, in parse_local_name()
4182 if (db.names.size() < 2) in parse_local_name()
4184 auto name = db.names.back().move_full(); in parse_local_name()
4185 db.names.pop_back(); in parse_local_name()
4186 if (db.names.empty()) in parse_local_name()
4188 db.names.back().first.append("::"); in parse_local_name()
4189 db.names.back().first.append(name); in parse_local_name()
4191 else if (!db.names.empty()) in parse_local_name()
4192 db.names.pop_back(); in parse_local_name()
4211 parse_name(const char* first, const char* last, C& db, in parse_name() argument
4224 const char* t1 = parse_nested_name(t0, last, db, in parse_name()
4232 const char* t1 = parse_local_name(t0, last, db, in parse_name()
4240 const char* t1 = parse_unscoped_name(t0, last, db); in parse_name()
4245 if (db.names.empty()) in parse_name()
4247 … db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator())); in parse_name()
4249 t1 = parse_template_args(t0, last, db); in parse_name()
4252 if (db.names.size() < 2) in parse_name()
4254 auto tmp = db.names.back().move_full(); in parse_name()
4255 db.names.pop_back(); in parse_name()
4256 if (db.names.empty()) in parse_name()
4258 db.names.back().first += tmp; in parse_name()
4269 t1 = parse_substitution(t0, last, db); in parse_name()
4273 t1 = parse_template_args(t0, last, db); in parse_name()
4276 if (db.names.size() < 2) in parse_name()
4278 auto tmp = db.names.back().move_full(); in parse_name()
4279 db.names.pop_back(); in parse_name()
4280 if (db.names.empty()) in parse_name()
4282 db.names.back().first += tmp; in parse_name()
4352 parse_special_name(const char* first, const char* last, C& db) in parse_special_name() argument
4364 t = parse_type(first+2, last, db); in parse_special_name()
4367 if (db.names.empty()) in parse_special_name()
4369 db.names.back().first.insert(0, "vtable for "); in parse_special_name()
4375 t = parse_type(first+2, last, db); in parse_special_name()
4378 if (db.names.empty()) in parse_special_name()
4380 db.names.back().first.insert(0, "VTT for "); in parse_special_name()
4386 t = parse_type(first+2, last, db); in parse_special_name()
4389 if (db.names.empty()) in parse_special_name()
4391 db.names.back().first.insert(0, "typeinfo for "); in parse_special_name()
4397 t = parse_type(first+2, last, db); in parse_special_name()
4400 if (db.names.empty()) in parse_special_name()
4402 db.names.back().first.insert(0, "typeinfo name for "); in parse_special_name()
4415 t = parse_encoding(t1, last, db); in parse_special_name()
4418 if (db.names.empty()) in parse_special_name()
4420 db.names.back().first.insert(0, "covariant return thunk to "); in parse_special_name()
4427 t = parse_type(first+2, last, db); in parse_special_name()
4433 const char* t1 = parse_type(++t0, last, db); in parse_special_name()
4436 if (db.names.size() < 2) in parse_special_name()
4438 auto left = db.names.back().move_full(); in parse_special_name()
4439 db.names.pop_back(); in parse_special_name()
4440 if (db.names.empty()) in parse_special_name()
4442 db.names.back().first = "construction vtable for " + in parse_special_name()
4444 db.names.back().move_full(); in parse_special_name()
4456 t = parse_encoding(t0, last, db); in parse_special_name()
4459 if (db.names.empty()) in parse_special_name()
4463 db.names.back().first.insert(0, "virtual thunk to "); in parse_special_name()
4468 db.names.back().first.insert(0, "non-virtual thunk to "); in parse_special_name()
4481 t = parse_name(first+2, last, db); in parse_special_name()
4484 if (db.names.empty()) in parse_special_name()
4486 db.names.back().first.insert(0, "guard variable for "); in parse_special_name()
4492 t = parse_name(first+2, last, db); in parse_special_name()
4495 if (db.names.empty()) in parse_special_name()
4497 db.names.back().first.insert(0, "reference temporary for "); in parse_special_name()
4534 parse_encoding(const char* first, const char* last, C& db) in parse_encoding() argument
4538 save_value<decltype(db.encoding_depth)> su(db.encoding_depth); in parse_encoding()
4539 ++db.encoding_depth; in parse_encoding()
4540 save_value<decltype(db.tag_templates)> sb(db.tag_templates); in parse_encoding()
4541 if (db.encoding_depth > 1) in parse_encoding()
4542 db.tag_templates = true; in parse_encoding()
4547 first = parse_special_name(first, last, db); in parse_encoding()
4552 const char* t = parse_name(first, last, db, in parse_encoding()
4554 unsigned cv = db.cv; in parse_encoding()
4555 unsigned ref = db.ref; in parse_encoding()
4560 save_value<bool> sb2(db.tag_templates); in parse_encoding()
4561 db.tag_templates = false; in parse_encoding()
4564 if (db.names.empty()) in parse_encoding()
4566 const typename C::String& nm = db.names.back().first; in parse_encoding()
4569 if (!db.parsed_ctor_dtor_cv && ends_with_template_args) in parse_encoding()
4571 t2 = parse_type(t, last, db); in parse_encoding()
4574 if (db.names.size() < 2) in parse_encoding()
4576 auto ret1 = std::move(db.names.back().first); in parse_encoding()
4577 ret2 = std::move(db.names.back().second); in parse_encoding()
4580 db.names.pop_back(); in parse_encoding()
4581 if (db.names.empty()) in parse_encoding()
4584 db.names.back().first.insert(0, ret1); in parse_encoding()
4587 db.names.back().first += '('; in parse_encoding()
4597 size_t k0 = db.names.size(); in parse_encoding()
4598 t2 = parse_type(t, last, db); in parse_encoding()
4599 size_t k1 = db.names.size(); in parse_encoding()
4609 tmp += db.names[k].move_full(); in parse_encoding()
4612 if (db.names.empty()) in parse_encoding()
4614 db.names.pop_back(); in parse_encoding()
4618 if (db.names.empty()) in parse_encoding()
4621 db.names.back().first += ", "; in parse_encoding()
4624 db.names.back().first += tmp; in parse_encoding()
4630 if (db.names.empty()) in parse_encoding()
4632 db.names.back().first += ')'; in parse_encoding()
4634 db.names.back().first.append(" const"); in parse_encoding()
4636 db.names.back().first.append(" volatile"); in parse_encoding()
4638 db.names.back().first.append(" restrict"); in parse_encoding()
4640 db.names.back().first.append(" &"); in parse_encoding()
4642 db.names.back().first.append(" &&"); in parse_encoding()
4643 db.names.back().first += ret2; in parse_encoding()
4662 parse_block_invoke(const char* first, const char* last, C& db) in parse_block_invoke() argument
4686 if (db.names.empty()) in parse_block_invoke()
4688 db.names.back().first.insert(0, "invocation function for block in "); in parse_block_invoke()
4699 parse_dot_suffix(const char* first, const char* last, C& db) in parse_dot_suffix() argument
4703 if (db.names.empty()) in parse_dot_suffix()
4705 db.names.back().first += " (" + typename C::String(first, last) + ")"; in parse_dot_suffix()
4719 demangle(const char* first, const char* last, C& db, int& status) in demangle() argument
4732 const char* t = parse_encoding(first+2, last, db); in demangle()
4734 t = parse_dot_suffix(t, last, db); in demangle()
4740 const char* t = parse_encoding(first+4, last, db); in demangle()
4743 const char* t1 = parse_block_invoke(t, last, db); in demangle()
4758 const char* t = parse_type(first, last, db); in demangle()
4762 if (status == success && db.names.empty()) in demangle()
4985 Db db(a); in __cxa_demangle() local
4986 db.template_param.emplace_back(a); in __cxa_demangle()
4989 demangle(mangled_name, mangled_name + len, db, in __cxa_demangle()
4991 if (internal_status == success && db.fix_forward_references && in __cxa_demangle()
4992 !db.template_param.empty() && !db.template_param.front().empty()) in __cxa_demangle()
4994 db.fix_forward_references = false; in __cxa_demangle()
4995 db.tag_templates = false; in __cxa_demangle()
4996 db.names.clear(); in __cxa_demangle()
4997 db.subs.clear(); in __cxa_demangle()
4998 demangle(mangled_name, mangled_name + len, db, internal_status); in __cxa_demangle()
4999 if (db.fix_forward_references) in __cxa_demangle()
5004 size_t sz = db.names.back().size() + 1; in __cxa_demangle()
5022 db.names.back().first += db.names.back().second; in __cxa_demangle()
5023 std::memcpy(buf, db.names.back().first.data(), sz-1); in __cxa_demangle()