Lines Matching full:db
40 static const char *parse_type(const char *first, const char *last, C &db);
42 static const char *parse_encoding(const char *first, const char *last, C &db);
44 static const char *parse_name(const char *first, const char *last, C &db,
47 static const char *parse_expression(const char *first, const char *last, C &db);
50 C &db);
53 C &db);
56 C &db);
58 static const char *parse_decltype(const char *first, const char *last, C &db);
117 C &db) { in parse_floating_number() argument
145 db.names.push_back(std::string(num, static_cast<std::size_t>(n))); in parse_floating_number()
156 C &db) { in parse_source_name() argument
170 db.names.push_back("(anonymous namespace)"); in parse_source_name()
172 db.names.push_back(std::move(r)); in parse_source_name()
193 C &db) { in parse_substitution() argument
198 db.names.push_back("std::allocator"); in parse_substitution()
202 db.names.push_back("std::basic_string"); in parse_substitution()
206 db.names.push_back("std::string"); in parse_substitution()
210 db.names.push_back("std::istream"); in parse_substitution()
214 db.names.push_back("std::ostream"); in parse_substitution()
218 db.names.push_back("std::iostream"); in parse_substitution()
222 if (!db.subs.empty()) { in parse_substitution()
223 for (const auto &n : db.subs.front()) in parse_substitution()
224 db.names.push_back(n); in parse_substitution()
246 if (sub < db.subs.size()) { in parse_substitution()
247 for (const auto &n : db.subs[sub]) in parse_substitution()
248 db.names.push_back(n); in parse_substitution()
293 C &db) { in parse_builtin_type() argument
297 db.names.push_back("void"); in parse_builtin_type()
301 db.names.push_back("wchar_t"); in parse_builtin_type()
305 db.names.push_back("bool"); in parse_builtin_type()
309 db.names.push_back("char"); in parse_builtin_type()
313 db.names.push_back("signed char"); in parse_builtin_type()
317 db.names.push_back("unsigned char"); in parse_builtin_type()
321 db.names.push_back("short"); in parse_builtin_type()
325 db.names.push_back("unsigned short"); in parse_builtin_type()
329 db.names.push_back("int"); in parse_builtin_type()
333 db.names.push_back("unsigned int"); in parse_builtin_type()
337 db.names.push_back("long"); in parse_builtin_type()
341 db.names.push_back("unsigned long"); in parse_builtin_type()
345 db.names.push_back("long long"); in parse_builtin_type()
349 db.names.push_back("unsigned long long"); in parse_builtin_type()
353 db.names.push_back("__int128"); in parse_builtin_type()
357 db.names.push_back("unsigned __int128"); in parse_builtin_type()
361 db.names.push_back("float"); in parse_builtin_type()
365 db.names.push_back("double"); in parse_builtin_type()
369 db.names.push_back("long double"); in parse_builtin_type()
373 db.names.push_back("__float128"); in parse_builtin_type()
377 db.names.push_back("..."); in parse_builtin_type()
381 const char *t = parse_source_name(first + 1, last, db); in parse_builtin_type()
389 db.names.push_back("decimal64"); in parse_builtin_type()
393 db.names.push_back("decimal128"); in parse_builtin_type()
397 db.names.push_back("decimal32"); in parse_builtin_type()
401 db.names.push_back("decimal16"); in parse_builtin_type()
405 db.names.push_back("char32_t"); in parse_builtin_type()
409 db.names.push_back("char16_t"); in parse_builtin_type()
413 db.names.push_back("auto"); in parse_builtin_type()
417 db.names.push_back("decltype(auto)"); in parse_builtin_type()
421 db.names.push_back("std::nullptr_t"); in parse_builtin_type()
459 C &db) { in parse_template_param() argument
463 if (db.template_param.empty()) in parse_template_param()
465 if (!db.template_param.back().empty()) { in parse_template_param()
466 for (auto &t : db.template_param.back().front()) in parse_template_param()
467 db.names.push_back(t); in parse_template_param()
470 db.names.push_back("T_"); in parse_template_param()
472 db.fix_forward_references = true; in parse_template_param()
481 if (t == last || *t != '_' || db.template_param.empty()) in parse_template_param()
484 if (sub < db.template_param.back().size()) { in parse_template_param()
485 for (auto &temp : db.template_param.back()[sub]) in parse_template_param()
486 db.names.push_back(temp); in parse_template_param()
489 db.names.push_back(std::string(first, t + 1)); in parse_template_param()
491 db.fix_forward_references = true; in parse_template_param()
504 C &db) { in parse_const_cast_expr() argument
506 const char *t = parse_type(first + 2, last, db); in parse_const_cast_expr()
508 const char *t1 = parse_expression(t, last, db); in parse_const_cast_expr()
510 if (db.names.size() < 2) in parse_const_cast_expr()
512 auto expr = db.names.back().move_full(); in parse_const_cast_expr()
513 db.names.pop_back(); in parse_const_cast_expr()
514 if (db.names.empty()) in parse_const_cast_expr()
516 db.names.back() = in parse_const_cast_expr()
517 "const_cast<" + db.names.back().move_full() + ">(" + expr + ")"; in parse_const_cast_expr()
530 C &db) { in parse_dynamic_cast_expr() argument
532 const char *t = parse_type(first + 2, last, db); in parse_dynamic_cast_expr()
534 const char *t1 = parse_expression(t, last, db); in parse_dynamic_cast_expr()
536 if (db.names.size() < 2) in parse_dynamic_cast_expr()
538 auto expr = db.names.back().move_full(); in parse_dynamic_cast_expr()
539 db.names.pop_back(); in parse_dynamic_cast_expr()
540 if (db.names.empty()) in parse_dynamic_cast_expr()
542 db.names.back() = in parse_dynamic_cast_expr()
543 "dynamic_cast<" + db.names.back().move_full() + ">(" + expr + ")"; in parse_dynamic_cast_expr()
556 const char *last, C &db) { in parse_reinterpret_cast_expr() argument
558 const char *t = parse_type(first + 2, last, db); in parse_reinterpret_cast_expr()
560 const char *t1 = parse_expression(t, last, db); in parse_reinterpret_cast_expr()
562 if (db.names.size() < 2) in parse_reinterpret_cast_expr()
564 auto expr = db.names.back().move_full(); in parse_reinterpret_cast_expr()
565 db.names.pop_back(); in parse_reinterpret_cast_expr()
566 if (db.names.empty()) in parse_reinterpret_cast_expr()
568 db.names.back() = "reinterpret_cast<" + db.names.back().move_full() + in parse_reinterpret_cast_expr()
582 C &db) { in parse_static_cast_expr() argument
584 const char *t = parse_type(first + 2, last, db); in parse_static_cast_expr()
586 const char *t1 = parse_expression(t, last, db); in parse_static_cast_expr()
588 if (db.names.size() < 2) in parse_static_cast_expr()
590 auto expr = db.names.back().move_full(); in parse_static_cast_expr()
591 db.names.pop_back(); in parse_static_cast_expr()
592 db.names.back() = in parse_static_cast_expr()
593 "static_cast<" + db.names.back().move_full() + ">(" + expr + ")"; in parse_static_cast_expr()
605 C &db) { in parse_pack_expansion() argument
607 const char *t = parse_expression(first + 2, last, db); in parse_pack_expansion()
618 C &db) { in parse_sizeof_type_expr() argument
620 const char *t = parse_type(first + 2, last, db); in parse_sizeof_type_expr()
622 if (db.names.empty()) in parse_sizeof_type_expr()
624 db.names.back() = "sizeof (" + db.names.back().move_full() + ")"; in parse_sizeof_type_expr()
635 C &db) { in parse_sizeof_expr_expr() argument
637 const char *t = parse_expression(first + 2, last, db); in parse_sizeof_expr_expr()
639 if (db.names.empty()) in parse_sizeof_expr_expr()
641 db.names.back() = "sizeof (" + db.names.back().move_full() + ")"; in parse_sizeof_expr_expr()
653 const char *last, C &db) { in parse_sizeof_param_pack_expr() argument
656 size_t k0 = db.names.size(); in parse_sizeof_param_pack_expr()
657 const char *t = parse_template_param(first + 2, last, db); in parse_sizeof_param_pack_expr()
658 size_t k1 = db.names.size(); in parse_sizeof_param_pack_expr()
663 tmp += db.names[k].move_full(); in parse_sizeof_param_pack_expr()
665 tmp += ", " + db.names[k].move_full(); in parse_sizeof_param_pack_expr()
669 db.names.pop_back(); in parse_sizeof_param_pack_expr()
670 db.names.push_back(std::move(tmp)); in parse_sizeof_param_pack_expr()
688 C &db) { in parse_function_param() argument
695 db.names.push_back("fp" + std::string(t, t1)); in parse_function_param()
706 db.names.push_back("fp" + std::string(t, t1)); in parse_function_param()
721 C &db) { in parse_sizeof_function_param_pack_expr() argument
724 const char *t = parse_function_param(first + 2, last, db); in parse_sizeof_function_param_pack_expr()
726 if (db.names.empty()) in parse_sizeof_function_param_pack_expr()
728 db.names.back() = "sizeof...(" + db.names.back().move_full() + ")"; in parse_sizeof_function_param_pack_expr()
740 C &db) { in parse_typeid_expr() argument
745 t = parse_expression(first + 2, last, db); in parse_typeid_expr()
747 t = parse_type(first + 2, last, db); in parse_typeid_expr()
749 if (db.names.empty()) in parse_typeid_expr()
751 db.names.back() = "typeid(" + db.names.back().move_full() + ")"; in parse_typeid_expr()
762 C &db) { in parse_throw_expr() argument
764 const char *t = parse_expression(first + 2, last, db); in parse_throw_expr()
766 if (db.names.empty()) in parse_throw_expr()
768 db.names.back() = "throw " + db.names.back().move_full(); in parse_throw_expr()
779 C &db) { in parse_dot_star_expr() argument
781 const char *t = parse_expression(first + 2, last, db); in parse_dot_star_expr()
783 const char *t1 = parse_expression(t, last, db); in parse_dot_star_expr()
785 if (db.names.size() < 2) in parse_dot_star_expr()
787 auto expr = db.names.back().move_full(); in parse_dot_star_expr()
788 db.names.pop_back(); in parse_dot_star_expr()
789 db.names.back().first += ".*" + expr; in parse_dot_star_expr()
800 static const char *parse_simple_id(const char *first, const char *last, C &db) { in parse_simple_id() argument
802 const char *t = parse_source_name(first, last, db); in parse_simple_id()
804 const char *t1 = parse_template_args(t, last, db); in parse_simple_id()
806 if (db.names.size() < 2) in parse_simple_id()
808 auto args = db.names.back().move_full(); in parse_simple_id()
809 db.names.pop_back(); in parse_simple_id()
810 db.names.back().first += std::move(args); in parse_simple_id()
825 C &db) { in parse_unresolved_type() argument
830 size_t k0 = db.names.size(); in parse_unresolved_type()
831 t = parse_template_param(first, last, db); in parse_unresolved_type()
832 size_t k1 = db.names.size(); in parse_unresolved_type()
834 db.subs.push_back(typename C::sub_type(1, db.names.back())); in parse_unresolved_type()
838 db.names.pop_back(); in parse_unresolved_type()
843 t = parse_decltype(first, last, db); in parse_unresolved_type()
845 if (db.names.empty()) in parse_unresolved_type()
847 db.subs.push_back(typename C::sub_type(1, db.names.back())); in parse_unresolved_type()
852 t = parse_substitution(first, last, db); in parse_unresolved_type()
857 t = parse_unqualified_name(first + 2, last, db); in parse_unresolved_type()
859 if (db.names.empty()) in parse_unresolved_type()
861 db.names.back().first.insert(0, "std::"); in parse_unresolved_type()
862 db.subs.push_back(typename C::sub_type(1, db.names.back())); in parse_unresolved_type()
880 C &db) { in parse_destructor_name() argument
882 const char *t = parse_unresolved_type(first, last, db); in parse_destructor_name()
884 t = parse_simple_id(first, last, db); in parse_destructor_name()
886 if (db.names.empty()) in parse_destructor_name()
888 db.names.back().first.insert(0, "~"); in parse_destructor_name()
914 const char *last, C &db) { in parse_base_unresolved_name() argument
918 const char *t = parse_operator_name(first + 2, last, db); in parse_base_unresolved_name()
920 first = parse_template_args(t, last, db); in parse_base_unresolved_name()
922 if (db.names.size() < 2) in parse_base_unresolved_name()
924 auto args = db.names.back().move_full(); in parse_base_unresolved_name()
925 db.names.pop_back(); in parse_base_unresolved_name()
926 db.names.back().first += std::move(args); in parse_base_unresolved_name()
930 const char *t = parse_destructor_name(first + 2, last, db); in parse_base_unresolved_name()
935 const char *t = parse_simple_id(first, last, db); in parse_base_unresolved_name()
937 t = parse_operator_name(first, last, db); in parse_base_unresolved_name()
939 first = parse_template_args(t, last, db); in parse_base_unresolved_name()
941 if (db.names.size() < 2) in parse_base_unresolved_name()
943 auto args = db.names.back().move_full(); in parse_base_unresolved_name()
944 db.names.pop_back(); in parse_base_unresolved_name()
945 db.names.back().first += std::move(args); in parse_base_unresolved_name()
959 const char *last, C &db) { in parse_unresolved_qualifier_level() argument
960 return parse_simple_id(first, last, db); in parse_unresolved_qualifier_level()
989 C &db) { in parse_unresolved_name() argument
997 const char *t2 = parse_base_unresolved_name(t, last, db); in parse_unresolved_name()
1000 if (db.names.empty()) in parse_unresolved_name()
1002 db.names.back().first.insert(0, "::"); in parse_unresolved_name()
1008 const char *t1 = parse_unresolved_type(t, last, db); in parse_unresolved_name()
1012 t1 = parse_template_args(t, last, db); in parse_unresolved_name()
1014 if (db.names.size() < 2) in parse_unresolved_name()
1016 auto args = db.names.back().move_full(); in parse_unresolved_name()
1017 db.names.pop_back(); in parse_unresolved_name()
1018 db.names.back().first += std::move(args); in parse_unresolved_name()
1021 db.names.pop_back(); in parse_unresolved_name()
1026 t1 = parse_unresolved_qualifier_level(t, last, db); in parse_unresolved_name()
1027 if (t1 == t || t1 == last || db.names.size() < 2) in parse_unresolved_name()
1029 auto s = db.names.back().move_full(); in parse_unresolved_name()
1030 db.names.pop_back(); in parse_unresolved_name()
1031 db.names.back().first += "::" + std::move(s); in parse_unresolved_name()
1035 t1 = parse_base_unresolved_name(t, last, db); in parse_unresolved_name()
1037 if (!db.names.empty()) in parse_unresolved_name()
1038 db.names.pop_back(); in parse_unresolved_name()
1041 if (db.names.size() < 2) in parse_unresolved_name()
1043 auto s = db.names.back().move_full(); in parse_unresolved_name()
1044 db.names.pop_back(); in parse_unresolved_name()
1045 db.names.back().first += "::" + std::move(s); in parse_unresolved_name()
1049 const char *t1 = parse_unresolved_type(t, last, db); in parse_unresolved_name()
1052 t1 = parse_template_args(t, last, db); in parse_unresolved_name()
1054 if (db.names.size() < 2) in parse_unresolved_name()
1056 auto args = db.names.back().move_full(); in parse_unresolved_name()
1057 db.names.pop_back(); in parse_unresolved_name()
1058 db.names.back().first += std::move(args); in parse_unresolved_name()
1061 t1 = parse_base_unresolved_name(t, last, db); in parse_unresolved_name()
1063 if (!db.names.empty()) in parse_unresolved_name()
1064 db.names.pop_back(); in parse_unresolved_name()
1067 if (db.names.size() < 2) in parse_unresolved_name()
1069 auto s = db.names.back().move_full(); in parse_unresolved_name()
1070 db.names.pop_back(); in parse_unresolved_name()
1071 db.names.back().first += "::" + std::move(s); in parse_unresolved_name()
1074 t1 = parse_unresolved_qualifier_level(t, last, db); in parse_unresolved_name()
1079 if (db.names.empty()) in parse_unresolved_name()
1081 db.names.back().first.insert(0, "::"); in parse_unresolved_name()
1084 t1 = parse_unresolved_qualifier_level(t, last, db); in parse_unresolved_name()
1085 if (t1 == t || t1 == last || db.names.size() < 2) in parse_unresolved_name()
1087 auto s = db.names.back().move_full(); in parse_unresolved_name()
1088 db.names.pop_back(); in parse_unresolved_name()
1089 db.names.back().first += "::" + std::move(s); in parse_unresolved_name()
1093 t1 = parse_base_unresolved_name(t, last, db); in parse_unresolved_name()
1095 if (!db.names.empty()) in parse_unresolved_name()
1096 db.names.pop_back(); in parse_unresolved_name()
1099 if (db.names.size() < 2) in parse_unresolved_name()
1101 auto s = db.names.back().move_full(); in parse_unresolved_name()
1102 db.names.pop_back(); in parse_unresolved_name()
1103 db.names.back().first += "::" + std::move(s); in parse_unresolved_name()
1115 static const char *parse_dot_expr(const char *first, const char *last, C &db) { in parse_dot_expr() argument
1117 const char *t = parse_expression(first + 2, last, db); in parse_dot_expr()
1119 const char *t1 = parse_unresolved_name(t, last, db); in parse_dot_expr()
1121 if (db.names.size() < 2) in parse_dot_expr()
1123 auto name = db.names.back().move_full(); in parse_dot_expr()
1124 db.names.pop_back(); in parse_dot_expr()
1125 if (db.names.empty()) in parse_dot_expr()
1127 db.names.back().first += "." + name; in parse_dot_expr()
1138 static const char *parse_call_expr(const char *first, const char *last, C &db) { in parse_call_expr() argument
1140 const char *t = parse_expression(first + 2, last, db); in parse_call_expr()
1144 if (db.names.empty()) in parse_call_expr()
1146 db.names.back().first += db.names.back().second; in parse_call_expr()
1147 db.names.back().second = std::string(); in parse_call_expr()
1148 db.names.back().first.append("("); in parse_call_expr()
1151 const char *t1 = parse_expression(t, last, db); in parse_call_expr()
1154 if (db.names.empty()) in parse_call_expr()
1156 auto tmp = db.names.back().move_full(); in parse_call_expr()
1157 db.names.pop_back(); in parse_call_expr()
1159 if (db.names.empty()) in parse_call_expr()
1162 db.names.back().first.append(", "); in parse_call_expr()
1165 db.names.back().first.append(tmp); in parse_call_expr()
1170 if (db.names.empty()) in parse_call_expr()
1172 db.names.back().first.append(")"); in parse_call_expr()
1189 static const char *parse_new_expr(const char *first, const char *last, C &db) { in parse_new_expr() argument
1205 const char *t1 = parse_expression(t, last, db); in parse_new_expr()
1210 if (db.names.empty()) in parse_new_expr()
1212 auto tmp = db.names.back().move_full(); in parse_new_expr()
1213 db.names.pop_back(); in parse_new_expr()
1215 if (db.names.empty()) in parse_new_expr()
1217 db.names.back().first.append(", "); in parse_new_expr()
1218 db.names.back().first.append(tmp); in parse_new_expr()
1225 const char *t1 = parse_type(t, last, db); in parse_new_expr()
1235 t1 = parse_expression(t, last, db); in parse_new_expr()
1239 if (db.names.empty()) in parse_new_expr()
1241 auto tmp = db.names.back().move_full(); in parse_new_expr()
1242 db.names.pop_back(); in parse_new_expr()
1244 if (db.names.empty()) in parse_new_expr()
1246 db.names.back().first.append(", "); in parse_new_expr()
1247 db.names.back().first.append(tmp); in parse_new_expr()
1258 if (db.names.empty()) in parse_new_expr()
1260 init_list = db.names.back().move_full(); in parse_new_expr()
1261 db.names.pop_back(); in parse_new_expr()
1263 if (db.names.empty()) in parse_new_expr()
1265 auto type = db.names.back().move_full(); in parse_new_expr()
1266 db.names.pop_back(); in parse_new_expr()
1269 if (db.names.empty()) in parse_new_expr()
1271 expr_list = db.names.back().move_full(); in parse_new_expr()
1272 db.names.pop_back(); in parse_new_expr()
1286 db.names.push_back(std::move(r)); in parse_new_expr()
1300 C &db) { in parse_conversion_expr() argument
1302 bool try_to_parse_template_args = db.try_to_parse_template_args; in parse_conversion_expr()
1303 db.try_to_parse_template_args = false; in parse_conversion_expr()
1304 const char *t = parse_type(first + 2, last, db); in parse_conversion_expr()
1305 db.try_to_parse_template_args = try_to_parse_template_args; in parse_conversion_expr()
1308 const char *t1 = parse_expression(t, last, db); in parse_conversion_expr()
1317 db.names.emplace_back(); in parse_conversion_expr()
1321 const char *t1 = parse_expression(t, last, db); in parse_conversion_expr()
1325 if (db.names.empty()) in parse_conversion_expr()
1327 auto tmp = db.names.back().move_full(); in parse_conversion_expr()
1328 db.names.pop_back(); in parse_conversion_expr()
1330 if (db.names.empty()) in parse_conversion_expr()
1332 db.names.back().first.append(", "); in parse_conversion_expr()
1333 db.names.back().first.append(tmp); in parse_conversion_expr()
1342 if (db.names.size() < 2) in parse_conversion_expr()
1344 auto tmp = db.names.back().move_full(); in parse_conversion_expr()
1345 db.names.pop_back(); in parse_conversion_expr()
1346 db.names.back() = "(" + db.names.back().move_full() + ")(" + tmp + ")"; in parse_conversion_expr()
1357 C &db) { in parse_arrow_expr() argument
1359 const char *t = parse_expression(first + 2, last, db); in parse_arrow_expr()
1361 const char *t1 = parse_expression(t, last, db); in parse_arrow_expr()
1363 if (db.names.size() < 2) in parse_arrow_expr()
1365 auto tmp = db.names.back().move_full(); in parse_arrow_expr()
1366 db.names.pop_back(); in parse_arrow_expr()
1367 db.names.back().first += "->"; in parse_arrow_expr()
1368 db.names.back().first += tmp; in parse_arrow_expr()
1383 C &db) { in parse_function_type() argument
1392 const char *t1 = parse_type(t, last, db); in parse_function_type()
1399 db.names.pop_back(); in parse_function_type()
1420 size_t k0 = db.names.size(); in parse_function_type()
1421 t1 = parse_type(t, last, db); in parse_function_type()
1422 size_t k1 = db.names.size(); in parse_function_type()
1428 sig += db.names[k].move_full(); in parse_function_type()
1431 db.names.pop_back(); in parse_function_type()
1443 if (db.names.empty()) in parse_function_type()
1445 db.names.back().first += " "; in parse_function_type()
1446 db.names.back().second.insert(0, sig); in parse_function_type()
1458 const char *last, C &db) { in parse_pointer_to_member_type() argument
1460 const char *t = parse_type(first + 1, last, db); in parse_pointer_to_member_type()
1462 const char *t2 = parse_type(t, last, db); in parse_pointer_to_member_type()
1464 if (db.names.size() < 2) in parse_pointer_to_member_type()
1466 auto func = std::move(db.names.back()); in parse_pointer_to_member_type()
1467 db.names.pop_back(); in parse_pointer_to_member_type()
1468 auto class_type = std::move(db.names.back()); in parse_pointer_to_member_type()
1470 db.names.back().first = in parse_pointer_to_member_type()
1472 db.names.back().second = ")" + std::move(func.second); in parse_pointer_to_member_type()
1474 db.names.back().first = in parse_pointer_to_member_type()
1476 db.names.back().second = std::move(func.second); in parse_pointer_to_member_type()
1490 C &db) { in parse_array_type() argument
1493 const char *t = parse_type(first + 2, last, db); in parse_array_type()
1495 if (db.names.empty()) in parse_array_type()
1497 if (db.names.back().second.substr(0, 2) == " [") in parse_array_type()
1498 db.names.back().second.erase(0, 1); in parse_array_type()
1499 db.names.back().second.insert(0, " []"); in parse_array_type()
1505 const char *t2 = parse_type(t + 1, last, db); in parse_array_type()
1507 if (db.names.empty()) in parse_array_type()
1509 if (db.names.back().second.substr(0, 2) == " [") in parse_array_type()
1510 db.names.back().second.erase(0, 1); in parse_array_type()
1511 db.names.back().second.insert(0, in parse_array_type()
1517 const char *t = parse_expression(first + 1, last, db); in parse_array_type()
1519 const char *t2 = parse_type(++t, last, db); in parse_array_type()
1521 if (db.names.size() < 2) in parse_array_type()
1523 auto type = std::move(db.names.back()); in parse_array_type()
1524 db.names.pop_back(); in parse_array_type()
1525 auto expr = std::move(db.names.back()); in parse_array_type()
1526 db.names.back().first = std::move(type.first); in parse_array_type()
1529 db.names.back().second = in parse_array_type()
1544 static const char *parse_decltype(const char *first, const char *last, C &db) { in parse_decltype() argument
1549 const char *t = parse_expression(first + 2, last, db); in parse_decltype()
1551 if (db.names.empty()) in parse_decltype()
1553 db.names.back() = "decltype(" + db.names.back().move_full() + ")"; in parse_decltype()
1571 C &db) { in parse_vector_type() argument
1581 const char *t1 = parse_type(t, last, db); in parse_vector_type()
1583 if (db.names.empty()) in parse_vector_type()
1585 db.names.back().first += " vector[" + std::string(num, sz) + "]"; in parse_vector_type()
1590 db.names.push_back("pixel vector[" + std::string(num, sz) + "]"); in parse_vector_type()
1598 const char *t = parse_expression(t1, last, db); in parse_vector_type()
1600 if (db.names.empty()) in parse_vector_type()
1602 num = db.names.back().move_full(); in parse_vector_type()
1603 db.names.pop_back(); in parse_vector_type()
1608 const char *t = parse_type(t1, last, db); in parse_vector_type()
1610 if (db.names.empty()) in parse_vector_type()
1612 db.names.back().first += " vector[" + num + "]"; in parse_vector_type()
1647 static const char *parse_type(const char *first, const char *last, C &db) { in parse_type() argument
1657 size_t k0 = db.names.size(); in parse_type()
1658 const char *t1 = parse_type(t, last, db); in parse_type()
1659 size_t k1 = db.names.size(); in parse_type()
1662 db.subs.pop_back(); in parse_type()
1663 db.subs.emplace_back(); in parse_type()
1666 size_t p = db.names[k].second.size(); in parse_type()
1667 if (db.names[k].second[p - 2] == '&') in parse_type()
1669 else if (db.names[k].second.back() == '&') in parse_type()
1672 db.names[k].second.insert(p, " const"); in parse_type()
1676 db.names[k].second.insert(p, " volatile"); in parse_type()
1680 db.names[k].second.insert(p, " restrict"); in parse_type()
1683 db.names[k].first.append(" const"); in parse_type()
1685 db.names[k].first.append(" volatile"); in parse_type()
1687 db.names[k].first.append(" restrict"); in parse_type()
1689 db.subs.back().push_back(db.names[k]); in parse_type()
1696 const char *t = parse_builtin_type(first, last, db); in parse_type()
1702 t = parse_array_type(first, last, db); in parse_type()
1704 if (db.names.empty()) in parse_type()
1707 db.subs.push_back(typename C::sub_type(1, db.names.back())); in parse_type()
1711 t = parse_type(first + 1, last, db); in parse_type()
1713 if (db.names.empty()) in parse_type()
1715 db.names.back().first.append(" complex"); in parse_type()
1717 db.subs.push_back(typename C::sub_type(1, db.names.back())); in parse_type()
1721 t = parse_function_type(first, last, db); in parse_type()
1723 if (db.names.empty()) in parse_type()
1726 db.subs.push_back(typename C::sub_type(1, db.names.back())); in parse_type()
1730 t = parse_type(first + 1, last, db); in parse_type()
1732 if (db.names.empty()) in parse_type()
1734 db.names.back().first.append(" imaginary"); in parse_type()
1736 db.subs.push_back(typename C::sub_type(1, db.names.back())); in parse_type()
1740 t = parse_pointer_to_member_type(first, last, db); in parse_type()
1742 if (db.names.empty()) in parse_type()
1745 db.subs.push_back(typename C::sub_type(1, db.names.back())); in parse_type()
1749 size_t k0 = db.names.size(); in parse_type()
1750 t = parse_type(first + 1, last, db); in parse_type()
1751 size_t k1 = db.names.size(); in parse_type()
1753 db.subs.emplace_back(); in parse_type()
1755 if (db.names[k].second.substr(0, 2) == " [") { in parse_type()
1756 db.names[k].first += " ("; in parse_type()
1757 db.names[k].second.insert(0, ")"); in parse_type()
1758 } else if (!db.names[k].second.empty() && in parse_type()
1759 db.names[k].second.front() == '(') { in parse_type()
1760 db.names[k].first += "("; in parse_type()
1761 db.names[k].second.insert(0, ")"); in parse_type()
1763 db.names[k].first.append("&&"); in parse_type()
1764 db.subs.back().push_back(db.names[k]); in parse_type()
1771 size_t k0 = db.names.size(); in parse_type()
1772 t = parse_type(first + 1, last, db); in parse_type()
1773 size_t k1 = db.names.size(); in parse_type()
1775 db.subs.emplace_back(); in parse_type()
1777 if (db.names[k].second.substr(0, 2) == " [") { in parse_type()
1778 db.names[k].first += " ("; in parse_type()
1779 db.names[k].second.insert(0, ")"); in parse_type()
1780 } else if (!db.names[k].second.empty() && in parse_type()
1781 db.names[k].second.front() == '(') { in parse_type()
1782 db.names[k].first += "("; in parse_type()
1783 db.names[k].second.insert(0, ")"); in parse_type()
1786 db.names[k].first.substr(0, 12) != "objc_object<") { in parse_type()
1787 db.names[k].first.append("*"); in parse_type()
1789 db.names[k].first.replace(0, 11, "id"); in parse_type()
1791 db.subs.back().push_back(db.names[k]); in parse_type()
1798 size_t k0 = db.names.size(); in parse_type()
1799 t = parse_type(first + 1, last, db); in parse_type()
1800 size_t k1 = db.names.size(); in parse_type()
1802 db.subs.emplace_back(); in parse_type()
1804 if (db.names[k].second.substr(0, 2) == " [") { in parse_type()
1805 db.names[k].first += " ("; in parse_type()
1806 db.names[k].second.insert(0, ")"); in parse_type()
1807 } else if (!db.names[k].second.empty() && in parse_type()
1808 db.names[k].second.front() == '(') { in parse_type()
1809 db.names[k].first += "("; in parse_type()
1810 db.names[k].second.insert(0, ")"); in parse_type()
1812 db.names[k].first.append("&"); in parse_type()
1813 db.subs.back().push_back(db.names[k]); in parse_type()
1820 size_t k0 = db.names.size(); in parse_type()
1821 t = parse_template_param(first, last, db); in parse_type()
1822 size_t k1 = db.names.size(); in parse_type()
1824 db.subs.emplace_back(); in parse_type()
1826 db.subs.back().push_back(db.names[k]); in parse_type()
1827 if (db.try_to_parse_template_args && k1 == k0 + 1) { in parse_type()
1828 const char *t1 = parse_template_args(t, last, db); in parse_type()
1830 auto args = db.names.back().move_full(); in parse_type()
1831 db.names.pop_back(); in parse_type()
1832 db.names.back().first += std::move(args); in parse_type()
1833 db.subs.push_back(typename C::sub_type(1, db.names.back())); in parse_type()
1843 t = parse_source_name(first + 1, last, db); in parse_type()
1845 const char *t2 = parse_type(t, last, db); in parse_type()
1847 if (db.names.size() < 2) in parse_type()
1849 auto type = db.names.back().move_full(); in parse_type()
1850 db.names.pop_back(); in parse_type()
1851 if (db.names.back().first.substr(0, 9) != "objcproto") { in parse_type()
1852 db.names.back() = type + " " + db.names.back().move_full(); in parse_type()
1854 auto proto = db.names.back().move_full(); in parse_type()
1855 db.names.pop_back(); in parse_type()
1857 proto.data() + proto.size(), db); in parse_type()
1859 db.names.back() = in parse_type()
1860 type + "<" + db.names.back().move_full() + ">"; in parse_type()
1862 db.names.push_back(type + " " + proto); in parse_type()
1865 db.subs.push_back(typename C::sub_type(1, db.names.back())); in parse_type()
1873 t = parse_name(first, last, db); in parse_type()
1875 if (db.names.empty()) in parse_type()
1877 db.subs.push_back(typename C::sub_type(1, db.names.back())); in parse_type()
1881 t = parse_substitution(first, last, db); in parse_type()
1886 t = parse_template_args(first, last, db); in parse_type()
1888 if (db.names.size() < 2) in parse_type()
1890 auto template_args = db.names.back().move_full(); in parse_type()
1891 db.names.pop_back(); in parse_type()
1892 db.names.back().first += template_args; in parse_type()
1895 db.subs.push_back(typename C::sub_type(1, db.names.back())); in parse_type()
1905 size_t k0 = db.names.size(); in parse_type()
1906 t = parse_type(first + 2, last, db); in parse_type()
1907 size_t k1 = db.names.size(); in parse_type()
1909 db.subs.emplace_back(); in parse_type()
1911 db.subs.back().push_back(db.names[k]); in parse_type()
1919 t = parse_decltype(first, last, db); in parse_type()
1921 if (db.names.empty()) in parse_type()
1923 db.subs.push_back(typename C::sub_type(1, db.names.back())); in parse_type()
1929 t = parse_vector_type(first, last, db); in parse_type()
1931 if (db.names.empty()) in parse_type()
1933 db.subs.push_back(typename C::sub_type(1, db.names.back())); in parse_type()
1944 t = parse_builtin_type(first, last, db); in parse_type()
1948 t = parse_name(first, last, db); in parse_type()
1950 if (db.names.empty()) in parse_type()
1952 db.subs.push_back(typename C::sub_type(1, db.names.back())); in parse_type()
2021 C &db) { in parse_operator_name() argument
2027 db.names.push_back("operator&&"); in parse_operator_name()
2032 db.names.push_back("operator&"); in parse_operator_name()
2036 db.names.push_back("operator&="); in parse_operator_name()
2040 db.names.push_back("operator="); in parse_operator_name()
2048 db.names.push_back("operator()"); in parse_operator_name()
2052 db.names.push_back("operator,"); in parse_operator_name()
2056 db.names.push_back("operator~"); in parse_operator_name()
2060 bool try_to_parse_template_args = db.try_to_parse_template_args; in parse_operator_name()
2061 db.try_to_parse_template_args = false; in parse_operator_name()
2062 const char *t = parse_type(first + 2, last, db); in parse_operator_name()
2063 db.try_to_parse_template_args = try_to_parse_template_args; in parse_operator_name()
2065 if (db.names.empty()) in parse_operator_name()
2067 db.names.back().first.insert(0, "operator "); in parse_operator_name()
2068 db.parsed_ctor_dtor_cv = true; in parse_operator_name()
2077 db.names.push_back("operator delete[]"); in parse_operator_name()
2081 db.names.push_back("operator*"); in parse_operator_name()
2085 db.names.push_back("operator delete"); in parse_operator_name()
2089 db.names.push_back("operator/"); in parse_operator_name()
2093 db.names.push_back("operator/="); in parse_operator_name()
2101 db.names.push_back("operator^"); in parse_operator_name()
2105 db.names.push_back("operator^="); in parse_operator_name()
2109 db.names.push_back("operator=="); in parse_operator_name()
2117 db.names.push_back("operator>="); in parse_operator_name()
2121 db.names.push_back("operator>"); in parse_operator_name()
2128 db.names.push_back("operator[]"); in parse_operator_name()
2135 db.names.push_back("operator<="); in parse_operator_name()
2139 const char *t = parse_source_name(first + 2, last, db); in parse_operator_name()
2141 if (db.names.empty()) in parse_operator_name()
2143 db.names.back().first.insert(0, "operator\"\" "); in parse_operator_name()
2148 db.names.push_back("operator<<"); in parse_operator_name()
2152 db.names.push_back("operator<<="); in parse_operator_name()
2156 db.names.push_back("operator<"); in parse_operator_name()
2164 db.names.push_back("operator-"); in parse_operator_name()
2168 db.names.push_back("operator-="); in parse_operator_name()
2172 db.names.push_back("operator*"); in parse_operator_name()
2176 db.names.push_back("operator*="); in parse_operator_name()
2180 db.names.push_back("operator--"); in parse_operator_name()
2188 db.names.push_back("operator new[]"); in parse_operator_name()
2192 db.names.push_back("operator!="); in parse_operator_name()
2196 db.names.push_back("operator-"); in parse_operator_name()
2200 db.names.push_back("operator!"); in parse_operator_name()
2204 db.names.push_back("operator new"); in parse_operator_name()
2212 db.names.push_back("operator||"); in parse_operator_name()
2216 db.names.push_back("operator|"); in parse_operator_name()
2220 db.names.push_back("operator|="); in parse_operator_name()
2228 db.names.push_back("operator->*"); in parse_operator_name()
2232 db.names.push_back("operator+"); in parse_operator_name()
2236 db.names.push_back("operator+="); in parse_operator_name()
2240 db.names.push_back("operator++"); in parse_operator_name()
2244 db.names.push_back("operator+"); in parse_operator_name()
2248 db.names.push_back("operator->"); in parse_operator_name()
2255 db.names.push_back("operator?"); in parse_operator_name()
2262 db.names.push_back("operator%"); in parse_operator_name()
2266 db.names.push_back("operator%="); in parse_operator_name()
2270 db.names.push_back("operator>>"); in parse_operator_name()
2274 db.names.push_back("operator>>="); in parse_operator_name()
2281 const char *t = parse_source_name(first + 2, last, db); in parse_operator_name()
2283 if (db.names.empty()) in parse_operator_name()
2285 db.names.back().first.insert(0, "operator "); in parse_operator_name()
2297 const std::string &lit, C &db) { in parse_integer_literal() argument
2301 db.names.push_back("(" + lit + ")"); in parse_integer_literal()
2303 db.names.emplace_back(); in parse_integer_literal()
2305 db.names.back().first += '-'; in parse_integer_literal()
2308 db.names.back().first.append(first, t); in parse_integer_literal()
2310 db.names.back().first += lit; in parse_integer_literal()
2331 C &db) { in parse_expr_primary() argument
2335 const char *t = parse_integer_literal(first + 2, last, "wchar_t", db); in parse_expr_primary()
2343 db.names.push_back("false"); in parse_expr_primary()
2347 db.names.push_back("true"); in parse_expr_primary()
2354 const char *t = parse_integer_literal(first + 2, last, "char", db); in parse_expr_primary()
2359 const char *t = parse_integer_literal(first + 2, last, "signed char", db); in parse_expr_primary()
2365 parse_integer_literal(first + 2, last, "unsigned char", db); in parse_expr_primary()
2370 const char *t = parse_integer_literal(first + 2, last, "short", db); in parse_expr_primary()
2376 parse_integer_literal(first + 2, last, "unsigned short", db); in parse_expr_primary()
2381 const char *t = parse_integer_literal(first + 2, last, "", db); in parse_expr_primary()
2386 const char *t = parse_integer_literal(first + 2, last, "u", db); in parse_expr_primary()
2391 const char *t = parse_integer_literal(first + 2, last, "l", db); in parse_expr_primary()
2396 const char *t = parse_integer_literal(first + 2, last, "ul", db); in parse_expr_primary()
2401 const char *t = parse_integer_literal(first + 2, last, "ll", db); in parse_expr_primary()
2406 const char *t = parse_integer_literal(first + 2, last, "ull", db); in parse_expr_primary()
2411 const char *t = parse_integer_literal(first + 2, last, "__int128", db); in parse_expr_primary()
2417 parse_integer_literal(first + 2, last, "unsigned __int128", db); in parse_expr_primary()
2422 const char *t = parse_floating_number<float>(first + 2, last, db); in parse_expr_primary()
2427 const char *t = parse_floating_number<double>(first + 2, last, db); in parse_expr_primary()
2432 const char *t = parse_floating_number<long double>(first + 2, last, db); in parse_expr_primary()
2438 const char *t = parse_encoding(first + 3, last, db); in parse_expr_primary()
2449 const char *t = parse_type(first + 1, last, db); in parse_expr_primary()
2456 if (db.names.empty()) in parse_expr_primary()
2458 db.names.back() = in parse_expr_primary()
2459 "(" + db.names.back().move_full() + ")" + std::string(t, n); in parse_expr_primary()
2533 C &db) { in parse_ctor_dtor_name() argument
2534 if (last - first >= 2 && !db.names.empty()) { in parse_ctor_dtor_name()
2542 if (db.names.empty()) in parse_ctor_dtor_name()
2544 db.names.push_back(base_name(db.names.back().first)); in parse_ctor_dtor_name()
2546 db.parsed_ctor_dtor_cv = true; in parse_ctor_dtor_name()
2556 if (db.names.empty()) in parse_ctor_dtor_name()
2558 db.names.push_back("~" + base_name(db.names.back().first)); in parse_ctor_dtor_name()
2560 db.parsed_ctor_dtor_cv = true; in parse_ctor_dtor_name()
2579 C &db) { in parse_unnamed_type_name() argument
2584 db.names.push_back(std::string("'unnamed")); in parse_unnamed_type_name()
2587 db.names.pop_back(); in parse_unnamed_type_name()
2594 db.names.back().first.append(t0, t1); in parse_unnamed_type_name()
2597 db.names.back().first.push_back('\''); in parse_unnamed_type_name()
2599 db.names.pop_back(); in parse_unnamed_type_name()
2605 db.names.push_back(std::string("'lambda'(")); in parse_unnamed_type_name()
2608 db.names.back().first += ')'; in parse_unnamed_type_name()
2611 const char *t1 = parse_type(t0, last, db); in parse_unnamed_type_name()
2613 if (!db.names.empty()) in parse_unnamed_type_name()
2614 db.names.pop_back(); in parse_unnamed_type_name()
2617 if (db.names.size() < 2) in parse_unnamed_type_name()
2619 auto tmp = db.names.back().move_full(); in parse_unnamed_type_name()
2620 db.names.pop_back(); in parse_unnamed_type_name()
2621 db.names.back().first.append(tmp); in parse_unnamed_type_name()
2624 t1 = parse_type(t0, last, db); in parse_unnamed_type_name()
2627 if (db.names.size() < 2) in parse_unnamed_type_name()
2629 tmp = db.names.back().move_full(); in parse_unnamed_type_name()
2630 db.names.pop_back(); in parse_unnamed_type_name()
2632 db.names.back().first.append(", "); in parse_unnamed_type_name()
2633 db.names.back().first.append(tmp); in parse_unnamed_type_name()
2637 if (db.names.empty()) in parse_unnamed_type_name()
2639 db.names.back().first.append(")"); in parse_unnamed_type_name()
2642 if (!db.names.empty()) in parse_unnamed_type_name()
2643 db.names.pop_back(); in parse_unnamed_type_name()
2648 if (!db.names.empty()) in parse_unnamed_type_name()
2649 db.names.pop_back(); in parse_unnamed_type_name()
2656 db.names.back().first.insert(db.names.back().first.begin() + 7, t0, t1); in parse_unnamed_type_name()
2660 if (!db.names.empty()) in parse_unnamed_type_name()
2661 db.names.pop_back(); in parse_unnamed_type_name()
2678 C &db) { in parse_unqualified_name() argument
2684 t = parse_ctor_dtor_name(first, last, db); in parse_unqualified_name()
2689 t = parse_unnamed_type_name(first, last, db); in parse_unqualified_name()
2702 t = parse_source_name(first, last, db); in parse_unqualified_name()
2707 t = parse_operator_name(first, last, db); in parse_unqualified_name()
2722 C &db) { in parse_unscoped_name() argument
2732 const char *t1 = parse_unqualified_name(t0, last, db); in parse_unscoped_name()
2735 if (db.names.empty()) in parse_unscoped_name()
2737 db.names.back().first.insert(0, "std::"); in parse_unscoped_name()
2749 C &db) { in parse_alignof_type() argument
2751 const char *t = parse_type(first + 2, last, db); in parse_alignof_type()
2753 if (db.names.empty()) in parse_alignof_type()
2755 db.names.back().first = "alignof (" + db.names.back().move_full() + ")"; in parse_alignof_type()
2767 C &db) { in parse_alignof_expr() argument
2769 const char *t = parse_expression(first + 2, last, db); in parse_alignof_expr()
2771 if (db.names.empty()) in parse_alignof_expr()
2773 db.names.back().first = "alignof (" + db.names.back().move_full() + ")"; in parse_alignof_expr()
2782 const char *last, C &db) { in parse_noexcept_expression() argument
2783 const char *t1 = parse_expression(first, last, db); in parse_noexcept_expression()
2785 if (db.names.empty()) in parse_noexcept_expression()
2787 db.names.back().first = "noexcept (" + db.names.back().move_full() + ")"; in parse_noexcept_expression()
2796 C &db) { in parse_prefix_expression() argument
2797 const char *t1 = parse_expression(first, last, db); in parse_prefix_expression()
2799 if (db.names.empty()) in parse_prefix_expression()
2801 db.names.back().first = op + "(" + db.names.back().move_full() + ")"; in parse_prefix_expression()
2810 C &db) { in parse_binary_expression() argument
2811 const char *t1 = parse_expression(first, last, db); in parse_binary_expression()
2813 const char *t2 = parse_expression(t1, last, db); in parse_binary_expression()
2815 if (db.names.size() < 2) in parse_binary_expression()
2817 auto op2 = db.names.back().move_full(); in parse_binary_expression()
2818 db.names.pop_back(); in parse_binary_expression()
2819 auto op1 = db.names.back().move_full(); in parse_binary_expression()
2820 auto &nm = db.names.back().first; in parse_binary_expression()
2828 } else if (!db.names.empty()) in parse_binary_expression()
2829 db.names.pop_back(); in parse_binary_expression()
2916 C &db) { in parse_expression() argument
2926 first = parse_expr_primary(first, last, db); in parse_expression()
2929 first = parse_template_param(first, last, db); in parse_expression()
2932 first = parse_function_param(first, last, db); in parse_expression()
2937 t = parse_binary_expression(first + 2, last, "&&", db); in parse_expression()
2942 t = parse_prefix_expression(first + 2, last, "&", db); in parse_expression()
2947 t = parse_binary_expression(first + 2, last, "&", db); in parse_expression()
2952 t = parse_binary_expression(first + 2, last, "&=", db); in parse_expression()
2957 t = parse_binary_expression(first + 2, last, "=", db); in parse_expression()
2962 first = parse_alignof_type(first, last, db); in parse_expression()
2965 first = parse_alignof_expr(first, last, db); in parse_expression()
2972 first = parse_const_cast_expr(first, last, db); in parse_expression()
2975 first = parse_call_expr(first, last, db); in parse_expression()
2978 t = parse_binary_expression(first + 2, last, ",", db); in parse_expression()
2983 t = parse_prefix_expression(first + 2, last, "~", db); in parse_expression()
2988 first = parse_conversion_expr(first, last, db); in parse_expression()
2995 const char *t1 = parse_expression(t + 2, last, db); in parse_expression()
2997 if (db.names.empty()) in parse_expression()
2999 db.names.back().first = in parse_expression()
3001 db.names.back().move_full(); in parse_expression()
3006 first = parse_dynamic_cast_expr(first, last, db); in parse_expression()
3009 t = parse_prefix_expression(first + 2, last, "*", db); in parse_expression()
3014 const char *t1 = parse_expression(t + 2, last, db); in parse_expression()
3016 if (db.names.empty()) in parse_expression()
3018 db.names.back().first = in parse_expression()
3020 db.names.back().move_full(); in parse_expression()
3025 return parse_unresolved_name(first, last, db); in parse_expression()
3027 first = parse_dot_star_expr(first, last, db); in parse_expression()
3030 first = parse_dot_expr(first, last, db); in parse_expression()
3033 t = parse_binary_expression(first + 2, last, "/", db); in parse_expression()
3038 t = parse_binary_expression(first + 2, last, "/=", db); in parse_expression()
3047 t = parse_binary_expression(first + 2, last, "^", db); in parse_expression()
3052 t = parse_binary_expression(first + 2, last, "^=", db); in parse_expression()
3057 t = parse_binary_expression(first + 2, last, "==", db); in parse_expression()
3066 t = parse_binary_expression(first + 2, last, ">=", db); in parse_expression()
3071 t = parse_binary_expression(first + 2, last, ">", db); in parse_expression()
3079 const char *t1 = parse_expression(first + 2, last, db); in parse_expression()
3081 const char *t2 = parse_expression(t1, last, db); in parse_expression()
3083 if (db.names.size() < 2) in parse_expression()
3085 auto op2 = db.names.back().move_full(); in parse_expression()
3086 db.names.pop_back(); in parse_expression()
3087 auto op1 = db.names.back().move_full(); in parse_expression()
3088 db.names.back() = "(" + op1 + ")[" + op2 + "]"; in parse_expression()
3090 } else if (!db.names.empty()) in parse_expression()
3091 db.names.pop_back(); in parse_expression()
3098 t = parse_binary_expression(first + 2, last, "<=", db); in parse_expression()
3103 t = parse_binary_expression(first + 2, last, "<<", db); in parse_expression()
3108 t = parse_binary_expression(first + 2, last, "<<=", db); in parse_expression()
3113 t = parse_binary_expression(first + 2, last, "<", db); in parse_expression()
3122 t = parse_binary_expression(first + 2, last, "-", db); in parse_expression()
3127 t = parse_binary_expression(first + 2, last, "-=", db); in parse_expression()
3132 t = parse_binary_expression(first + 2, last, "*", db); in parse_expression()
3137 t = parse_binary_expression(first + 2, last, "*=", db); in parse_expression()
3143 t = parse_prefix_expression(first + 3, last, "--", db); in parse_expression()
3147 const char *t1 = parse_expression(first + 2, last, db); in parse_expression()
3149 if (db.names.empty()) in parse_expression()
3151 db.names.back() = "(" + db.names.back().move_full() + ")--"; in parse_expression()
3162 first = parse_new_expr(first, last, db); in parse_expression()
3165 t = parse_binary_expression(first + 2, last, "!=", db); in parse_expression()
3170 t = parse_prefix_expression(first + 2, last, "-", db); in parse_expression()
3175 t = parse_prefix_expression(first + 2, last, "!", db); in parse_expression()
3180 t = parse_noexcept_expression(first + 2, last, db); in parse_expression()
3189 return parse_unresolved_name(first, last, db); in parse_expression()
3191 t = parse_binary_expression(first + 2, last, "||", db); in parse_expression()
3196 t = parse_binary_expression(first + 2, last, "|", db); in parse_expression()
3201 t = parse_binary_expression(first + 2, last, "|=", db); in parse_expression()
3210 t = parse_binary_expression(first + 2, last, "->*", db); in parse_expression()
3215 t = parse_binary_expression(first + 2, last, "+", db); in parse_expression()
3220 t = parse_binary_expression(first + 2, last, "+=", db); in parse_expression()
3226 t = parse_prefix_expression(first + 3, last, "++", db); in parse_expression()
3230 const char *t1 = parse_expression(first + 2, last, db); in parse_expression()
3232 if (db.names.empty()) in parse_expression()
3234 db.names.back() = "(" + db.names.back().move_full() + ")++"; in parse_expression()
3240 t = parse_prefix_expression(first + 2, last, "+", db); in parse_expression()
3245 first = parse_arrow_expr(first, last, db); in parse_expression()
3251 const char *t1 = parse_expression(first + 2, last, db); in parse_expression()
3253 const char *t2 = parse_expression(t1, last, db); in parse_expression()
3255 const char *t3 = parse_expression(t2, last, db); in parse_expression()
3257 if (db.names.size() < 3) in parse_expression()
3259 auto op3 = db.names.back().move_full(); in parse_expression()
3260 db.names.pop_back(); in parse_expression()
3261 auto op2 = db.names.back().move_full(); in parse_expression()
3262 db.names.pop_back(); in parse_expression()
3263 auto op1 = db.names.back().move_full(); in parse_expression()
3264 db.names.back() = "(" + op1 + ") ? (" + op2 + ") : (" + op3 + ")"; in parse_expression()
3267 if (db.names.size() < 2) in parse_expression()
3269 db.names.pop_back(); in parse_expression()
3270 db.names.pop_back(); in parse_expression()
3272 } else if (!db.names.empty()) in parse_expression()
3273 db.names.pop_back(); in parse_expression()
3280 first = parse_reinterpret_cast_expr(first, last, db); in parse_expression()
3283 t = parse_binary_expression(first + 2, last, "%", db); in parse_expression()
3288 t = parse_binary_expression(first + 2, last, "%=", db); in parse_expression()
3293 t = parse_binary_expression(first + 2, last, ">>", db); in parse_expression()
3298 t = parse_binary_expression(first + 2, last, ">>=", db); in parse_expression()
3307 first = parse_static_cast_expr(first, last, db); in parse_expression()
3310 first = parse_pack_expansion(first, last, db); in parse_expression()
3313 return parse_unresolved_name(first, last, db); in parse_expression()
3315 first = parse_sizeof_type_expr(first, last, db); in parse_expression()
3318 first = parse_sizeof_expr_expr(first, last, db); in parse_expression()
3324 first = parse_sizeof_param_pack_expr(first, last, db); in parse_expression()
3327 first = parse_sizeof_function_param_pack_expr(first, last, db); in parse_expression()
3338 first = parse_typeid_expr(first, last, db); in parse_expression()
3341 db.names.push_back("throw"); in parse_expression()
3345 first = parse_throw_expr(first, last, db); in parse_expression()
3358 return parse_unresolved_name(first, last, db); in parse_expression()
3377 C &db) { in parse_template_arg() argument
3382 t = parse_expression(first + 1, last, db); in parse_template_arg()
3393 const char *t1 = parse_template_arg(t, last, db); in parse_template_arg()
3403 t = parse_encoding(first + 2, last, db); in parse_template_arg()
3407 first = parse_expr_primary(first, last, db); in parse_template_arg()
3411 first = parse_type(first, last, db); in parse_template_arg()
3423 C &db) { in parse_template_args() argument
3425 if (db.tag_templates) in parse_template_args()
3426 db.template_param.back().clear(); in parse_template_args()
3430 if (db.tag_templates) in parse_template_args()
3431 db.template_param.emplace_back(); in parse_template_args()
3432 size_t k0 = db.names.size(); in parse_template_args()
3433 const char *t1 = parse_template_arg(t, last, db); in parse_template_args()
3434 size_t k1 = db.names.size(); in parse_template_args()
3435 if (db.tag_templates) in parse_template_args()
3436 db.template_param.pop_back(); in parse_template_args()
3439 if (db.tag_templates) { in parse_template_args()
3440 db.template_param.back().emplace_back(); in parse_template_args()
3442 db.template_param.back().back().push_back(db.names[k]); in parse_template_args()
3447 args += db.names[k].move_full(); in parse_template_args()
3450 if (!db.names.empty()) in parse_template_args()
3451 db.names.pop_back(); in parse_template_args()
3459 db.names.push_back(std::move(args)); in parse_template_args()
3483 static const char *parse_nested_name(const char *first, const char *last, C &db, in parse_nested_name() argument
3490 db.ref = 0; in parse_nested_name()
3492 db.ref = 1; in parse_nested_name()
3495 db.ref = 2; in parse_nested_name()
3498 db.names.emplace_back(); in parse_nested_name()
3501 db.names.back().first = "std"; in parse_nested_name()
3504 db.names.pop_back(); in parse_nested_name()
3516 t1 = parse_substitution(t0, last, db); in parse_nested_name()
3518 auto name = db.names.back().move_full(); in parse_nested_name()
3519 db.names.pop_back(); in parse_nested_name()
3520 if (db.names.empty()) in parse_nested_name()
3522 if (!db.names.back().first.empty()) { in parse_nested_name()
3523 db.names.back().first += "::" + name; in parse_nested_name()
3524 db.subs.push_back(typename C::sub_type(1, db.names.back())); in parse_nested_name()
3526 db.names.back().first = name; in parse_nested_name()
3533 t1 = parse_template_param(t0, last, db); in parse_nested_name()
3535 auto name = db.names.back().move_full(); in parse_nested_name()
3536 db.names.pop_back(); in parse_nested_name()
3537 if (db.names.empty()) in parse_nested_name()
3539 if (!db.names.back().first.empty()) in parse_nested_name()
3540 db.names.back().first += "::" + name; in parse_nested_name()
3542 db.names.back().first = name; in parse_nested_name()
3543 db.subs.push_back(typename C::sub_type(1, db.names.back())); in parse_nested_name()
3552 t1 = parse_decltype(t0, last, db); in parse_nested_name()
3554 auto name = db.names.back().move_full(); in parse_nested_name()
3555 db.names.pop_back(); in parse_nested_name()
3556 if (db.names.empty()) in parse_nested_name()
3558 if (!db.names.back().first.empty()) in parse_nested_name()
3559 db.names.back().first += "::" + name; in parse_nested_name()
3561 db.names.back().first = name; in parse_nested_name()
3562 db.subs.push_back(typename C::sub_type(1, db.names.back())); in parse_nested_name()
3569 t1 = parse_template_args(t0, last, db); in parse_nested_name()
3571 auto name = db.names.back().move_full(); in parse_nested_name()
3572 db.names.pop_back(); in parse_nested_name()
3573 if (db.names.empty()) in parse_nested_name()
3575 db.names.back().first += name; in parse_nested_name()
3576 db.subs.push_back(typename C::sub_type(1, db.names.back())); in parse_nested_name()
3588 t1 = parse_unqualified_name(t0, last, db); in parse_nested_name()
3590 auto name = db.names.back().move_full(); in parse_nested_name()
3591 db.names.pop_back(); in parse_nested_name()
3592 if (db.names.empty()) in parse_nested_name()
3594 if (!db.names.back().first.empty()) in parse_nested_name()
3595 db.names.back().first += "::" + name; in parse_nested_name()
3597 db.names.back().first = name; in parse_nested_name()
3598 db.subs.push_back(typename C::sub_type(1, db.names.back())); in parse_nested_name()
3606 db.cv = cv; in parse_nested_name()
3607 if (pop_subs && !db.subs.empty()) in parse_nested_name()
3608 db.subs.pop_back(); in parse_nested_name()
3651 static const char *parse_local_name(const char *first, const char *last, C &db, in parse_local_name() argument
3654 const char *t = parse_encoding(first + 1, last, db); in parse_local_name()
3659 if (db.names.empty()) in parse_local_name()
3661 db.names.back().first.append("::string literal"); in parse_local_name()
3668 t1 = parse_name(t, last, db, ends_with_template_args); in parse_local_name()
3670 if (db.names.size() < 2) in parse_local_name()
3672 auto name = db.names.back().move_full(); in parse_local_name()
3673 db.names.pop_back(); in parse_local_name()
3674 if (db.names.empty()) in parse_local_name()
3676 db.names.back().first.append("::"); in parse_local_name()
3677 db.names.back().first.append(name); in parse_local_name()
3679 } else if (!db.names.empty()) in parse_local_name()
3680 db.names.pop_back(); in parse_local_name()
3685 const char *t1 = parse_name(t, last, db, ends_with_template_args); in parse_local_name()
3689 if (db.names.size() < 2) in parse_local_name()
3691 auto name = db.names.back().move_full(); in parse_local_name()
3692 db.names.pop_back(); in parse_local_name()
3693 if (db.names.empty()) in parse_local_name()
3695 db.names.back().first.append("::"); in parse_local_name()
3696 db.names.back().first.append(name); in parse_local_name()
3697 } else if (!db.names.empty()) in parse_local_name()
3698 db.names.pop_back(); in parse_local_name()
3715 static const char *parse_name(const char *first, const char *last, C &db, in parse_name() argument
3724 const char *t1 = parse_nested_name(t0, last, db, ends_with_template_args); in parse_name()
3730 const char *t1 = parse_local_name(t0, last, db, ends_with_template_args); in parse_name()
3736 const char *t1 = parse_unscoped_name(t0, last, db); in parse_name()
3741 if (db.names.empty()) in parse_name()
3743 db.subs.push_back(typename C::sub_type(1, db.names.back())); in parse_name()
3745 t1 = parse_template_args(t0, last, db); in parse_name()
3747 if (db.names.size() < 2) in parse_name()
3749 auto tmp = db.names.back().move_full(); in parse_name()
3750 db.names.pop_back(); in parse_name()
3751 if (db.names.empty()) in parse_name()
3753 db.names.back().first += tmp; in parse_name()
3761 t1 = parse_substitution(t0, last, db); in parse_name()
3764 t1 = parse_template_args(t0, last, db); in parse_name()
3766 if (db.names.size() < 2) in parse_name()
3768 auto tmp = db.names.back().move_full(); in parse_name()
3769 db.names.pop_back(); in parse_name()
3770 if (db.names.empty()) in parse_name()
3772 db.names.back().first += tmp; in parse_name()
3835 C &db) { in parse_special_name() argument
3843 t = parse_type(first + 2, last, db); in parse_special_name()
3845 if (db.names.empty()) in parse_special_name()
3847 db.names.back().first.insert(0, "vtable for "); in parse_special_name()
3853 t = parse_type(first + 2, last, db); in parse_special_name()
3855 if (db.names.empty()) in parse_special_name()
3857 db.names.back().first.insert(0, "VTT for "); in parse_special_name()
3863 t = parse_type(first + 2, last, db); in parse_special_name()
3865 if (db.names.empty()) in parse_special_name()
3867 db.names.back().first.insert(0, "typeinfo for "); in parse_special_name()
3873 t = parse_type(first + 2, last, db); in parse_special_name()
3875 if (db.names.empty()) in parse_special_name()
3877 db.names.back().first.insert(0, "typeinfo name for "); in parse_special_name()
3890 t = parse_encoding(t1, last, db); in parse_special_name()
3892 if (db.names.empty()) in parse_special_name()
3894 db.names.back().first.insert(0, "covariant return thunk to "); in parse_special_name()
3902 t = parse_type(first + 2, last, db); in parse_special_name()
3906 const char *t1 = parse_type(++t0, last, db); in parse_special_name()
3908 if (db.names.size() < 2) in parse_special_name()
3910 auto left = db.names.back().move_full(); in parse_special_name()
3911 db.names.pop_back(); in parse_special_name()
3912 if (db.names.empty()) in parse_special_name()
3914 db.names.back().first = "construction vtable for " + in parse_special_name()
3916 db.names.back().move_full(); in parse_special_name()
3928 t = parse_encoding(t0, last, db); in parse_special_name()
3930 if (db.names.empty()) in parse_special_name()
3933 db.names.back().first.insert(0, "virtual thunk to "); in parse_special_name()
3936 db.names.back().first.insert(0, "non-virtual thunk to "); in parse_special_name()
3948 t = parse_name(first + 2, last, db); in parse_special_name()
3950 if (db.names.empty()) in parse_special_name()
3952 db.names.back().first.insert(0, "guard variable for "); in parse_special_name()
3958 t = parse_name(first + 2, last, db); in parse_special_name()
3960 if (db.names.empty()) in parse_special_name()
3962 db.names.back().first.insert(0, "reference temporary for "); in parse_special_name()
3993 static const char *parse_encoding(const char *first, const char *last, C &db) { in parse_encoding() argument
3995 save_value<decltype(db.encoding_depth)> su(db.encoding_depth); in parse_encoding()
3996 ++db.encoding_depth; in parse_encoding()
3997 save_value<decltype(db.tag_templates)> sb(db.tag_templates); in parse_encoding()
3998 if (db.encoding_depth > 1) in parse_encoding()
3999 db.tag_templates = true; in parse_encoding()
4003 first = parse_special_name(first, last, db); in parse_encoding()
4007 const char *t = parse_name(first, last, db, &ends_with_template_args); in parse_encoding()
4008 unsigned cv = db.cv; in parse_encoding()
4009 unsigned ref = db.ref; in parse_encoding()
4012 save_value<bool> sb2(db.tag_templates); in parse_encoding()
4013 db.tag_templates = false; in parse_encoding()
4016 if (db.names.empty()) in parse_encoding()
4018 const std::string &nm = db.names.back().first; in parse_encoding()
4021 if (!db.parsed_ctor_dtor_cv && ends_with_template_args) { in parse_encoding()
4022 t2 = parse_type(t, last, db); in parse_encoding()
4025 if (db.names.size() < 2) in parse_encoding()
4027 auto ret1 = std::move(db.names.back().first); in parse_encoding()
4028 ret2 = std::move(db.names.back().second); in parse_encoding()
4031 db.names.pop_back(); in parse_encoding()
4032 if (db.names.empty()) in parse_encoding()
4035 db.names.back().first.insert(0, ret1); in parse_encoding()
4038 db.names.back().first += '('; in parse_encoding()
4044 size_t k0 = db.names.size(); in parse_encoding()
4045 t2 = parse_type(t, last, db); in parse_encoding()
4046 size_t k1 = db.names.size(); in parse_encoding()
4054 tmp += db.names[k].move_full(); in parse_encoding()
4057 if (db.names.empty()) in parse_encoding()
4059 db.names.pop_back(); in parse_encoding()
4062 if (db.names.empty()) in parse_encoding()
4065 db.names.back().first += ", "; in parse_encoding()
4068 db.names.back().first += tmp; in parse_encoding()
4074 if (db.names.empty()) in parse_encoding()
4076 db.names.back().first += ')'; in parse_encoding()
4078 db.names.back().first.append(" const"); in parse_encoding()
4080 db.names.back().first.append(" volatile"); in parse_encoding()
4082 db.names.back().first.append(" restrict"); in parse_encoding()
4084 db.names.back().first.append(" &"); in parse_encoding()
4086 db.names.back().first.append(" &&"); in parse_encoding()
4087 db.names.back().first += ret2; in parse_encoding()
4105 C &db) { in parse_block_invoke() argument
4124 if (db.names.empty()) in parse_block_invoke()
4126 db.names.back().first.insert(0, "invocation function for block in "); in parse_block_invoke()
4137 C &db) { in parse_dot_suffix() argument
4139 if (db.names.empty()) in parse_dot_suffix()
4141 db.names.back().first += " (" + std::string(first, last) + ")"; in parse_dot_suffix()
4154 static void demangle(const char *first, const char *last, C &db, int &status) { in demangle() argument
4162 const char *t = parse_encoding(first + 2, last, db); in demangle()
4164 t = parse_dot_suffix(t, last, db); in demangle()
4168 const char *t = parse_encoding(first + 4, last, db); in demangle()
4170 const char *t1 = parse_block_invoke(t, last, db); in demangle()
4180 const char *t = parse_type(first, last, db); in demangle()
4184 if (status == success && db.names.empty()) in demangle()
4203 struct Db { struct
4217 Db() : subs(0, names), template_param(0, subs) {} in Db() argument
4239 Db db; in itaniumDemangle() local
4240 db.template_param.emplace_back(); in itaniumDemangle()
4242 demangle(mangled_name, mangled_name + len, db, internal_status); in itaniumDemangle()
4243 if (internal_status == success && db.fix_forward_references && in itaniumDemangle()
4244 !db.template_param.empty() && !db.template_param.front().empty()) { in itaniumDemangle()
4245 db.fix_forward_references = false; in itaniumDemangle()
4246 db.tag_templates = false; in itaniumDemangle()
4247 db.names.clear(); in itaniumDemangle()
4248 db.subs.clear(); in itaniumDemangle()
4249 demangle(mangled_name, mangled_name + len, db, internal_status); in itaniumDemangle()
4250 if (db.fix_forward_references) in itaniumDemangle()
4254 size_t sz = db.names.back().size() + 1; in itaniumDemangle()
4267 db.names.back().first += db.names.back().second; in itaniumDemangle()
4268 std::memcpy(buf, db.names.back().first.data(), sz - 1); in itaniumDemangle()