Home | History | Annotate | Download | only in Demangle

Lines Matching full:last

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);
49 static const char *parse_template_args(const char *first, const char *last,
52 static const char *parse_operator_name(const char *first, const char *last,
55 static const char *parse_unqualified_name(const char *first, const char *last,
58 static const char *parse_decltype(const char *first, const char *last, C &db);
62 static const char *parse_number(const char *first, const char *last) {
63 if (first != last) {
67 if (t != last) {
72 while (first != last && std::isdigit(*first))
116 static const char *parse_floating_number(const char *first, const char *last,
119 if (static_cast<std::size_t>(last - first) > N) {
120 last = first + N;
127 for (; t != last; ++t, ++e) {
155 static const char *parse_source_name(const char *first, const char *last,
157 if (first != last) {
159 if (isdigit(c) && first + 1 != last) {
164 if (++t == last)
167 if (static_cast<size_t>(last - t) >= n) {
192 static const char *parse_substitution(const char *first, const char *last,
194 if (last - first >= 2) {
236 for (++t; t != last && (std::isdigit(*t) || std::isupper(*t)); ++t) {
243 if (t == last || *t != '_')
292 static const char *parse_builtin_type(const char *first, const char *last,
294 if (first != last) {
381 const char *t = parse_source_name(first + 1, last, db);
386 if (first + 1 != last) {
434 static const char *parse_cv_qualifiers(const char *first, const char *last,
437 if (first != last) {
458 static const char *parse_template_param(const char *first, const char *last,
460 if (last - first >= 2) {
477 for (++t; t != last && isdigit(*t); ++t) {
481 if (t == last || *t != '_' || db.template_param.empty())
503 static const char *parse_const_cast_expr(const char *first, const char *last,
505 if (last - first >= 3 && first[0] == 'c' && first[1] == 'c') {
506 const char *t = parse_type(first + 2, last, db);
508 const char *t1 = parse_expression(t, last, db);
529 static const char *parse_dynamic_cast_expr(const char *first, const char *last,
531 if (last - first >= 3 && first[0] == 'd' && first[1] == 'c') {
532 const char *t = parse_type(first + 2, last, db);
534 const char *t1 = parse_expression(t, last, db);
556 const char *last, C &db) {
557 if (last - first >= 3 && first[0] == 'r' && first[1] == 'c') {
558 const char *t = parse_type(first + 2, last, db);
560 const char *t1 = parse_expression(t, last, db);
581 static const char *parse_static_cast_expr(const char *first, const char *last,
583 if (last - first >= 3 && first[0] == 's' && first[1] == 'c') {
584 const char *t = parse_type(first + 2, last, db);
586 const char *t1 = parse_expression(t, last, db);
604 static const char *parse_pack_expansion(const char *first, const char *last,
606 if (last - first >= 3 && first[0] == 's' && first[1] == 'p') {
607 const char *t = parse_expression(first + 2, last, db);
617 static const char *parse_sizeof_type_expr(const char *first, const char *last,
619 if (last - first >= 3 && first[0] == 's' && first[1] == 't') {
620 const char *t = parse_type(first + 2, last, db);
634 static const char *parse_sizeof_expr_expr(const char *first, const char *last,
636 if (last - first >= 3 && first[0] == 's' && first[1] == 'z') {
637 const char *t = parse_expression(first + 2, last, db);
653 const char *last, C &db) {
654 if (last - first >= 3 && first[0] == 's' && first[1] == 'Z' &&
657 const char *t = parse_template_param(first + 2, last, db);
687 static const char *parse_function_param(const char *first, const char *last,
689 if (last - first >= 3 && *first == 'f') {
692 const char *t = parse_cv_qualifiers(first + 2, last, cv);
693 const char *t1 = parse_number(t, last);
694 if (t1 != last && *t1 == '_') {
700 const char *t0 = parse_number(first + 2, last);
701 if (t0 != last && *t0 == 'p') {
703 const char *t = parse_cv_qualifiers(t0, last, cv);
704 const char *t1 = parse_number(t, last);
705 if (t1 != last && *t1 == '_') {
720 const char *last,
722 if (last - first >= 3 && first[0] == 's' && first[1] == 'Z' &&
724 const char *t = parse_function_param(first + 2, last, db);
739 static const char *parse_typeid_expr(const char *first, const char *last,
741 if (last - first >= 3 && first[0] == 't' &&
745 t = parse_expression(first + 2, last, db);
747 t = parse_type(first + 2, last, db);
761 static const char *parse_throw_expr(const char *first, const char *last,
763 if (last - first >= 3 && first[0] == 't' && first[1] == 'w') {
764 const char *t = parse_expression(first + 2, last, db);
778 static const char *parse_dot_star_expr(const char *first, const char *last,
780 if (last - first >= 3 && first[0] == 'd' && first[1] == 's') {
781 const char *t = parse_expression(first + 2, last, db);
783 const char *t1 = parse_expression(t, last, db);
800 static const char *parse_simple_id(const char *first, const char *last, C &db) {
801 if (first != last) {
802 const char *t = parse_source_name(first, last, db);
804 const char *t1 = parse_template_args(t, last, db);
824 static const char *parse_unresolved_type(const char *first, const char *last,
826 if (first != last) {
831 t = parse_template_param(first, last, db);
843 t = parse_decltype(first, last, db);
852 t = parse_substitution(first, last, db);
856 if (last - first > 2 && first[1] == 't') {
857 t = parse_unqualified_name(first + 2, last, db);
879 static const char *parse_destructor_name(const char *first, const char *last,
881 if (first != last) {
882 const char *t = parse_unresolved_type(first, last, db);
884 t = parse_simple_id(first, last, db);
914 const char *last, C &db) {
915 if (last - first >= 2) {
918 const char *t = parse_operator_name(first + 2, last, db);
920 first = parse_template_args(t, last, db);
930 const char *t = parse_destructor_name(first + 2, last, db);
935 const char *t = parse_simple_id(first, last, db);
937 t = parse_operator_name(first, last, db);
939 first = parse_template_args(t, last, db);
959 const char *last, C &db) {
960 return parse_simple_id(first, last, db);
988 static const char *parse_unresolved_name(const char *first, const char *last,
990 if (last - first > 2) {
997 const char *t2 = parse_base_unresolved_name(t, last, db);
1005 } else if (last - t > 2 && t[0] == 's' && t[1] == 'r') {
1008 const char *t1 = parse_unresolved_type(t, last, db);
1009 if (t1 == t || t1 == last)
1012 t1 = parse_template_args(t, last, db);
1020 if (t == last) {
1026 t1 = parse_unresolved_qualifier_level(t, last, db);
1027 if (t1 == t || t1 == last || db.names.size() < 2)
1035 t1 = parse_base_unresolved_name(t, last, db);
1049 const char *t1 = parse_unresolved_type(t, last, db);
1052 t1 = parse_template_args(t, last, db);
1061 t1 = parse_base_unresolved_name(t, last, db);
1074 t1 = parse_unresolved_qualifier_level(t, last, db);
1075 if (t1 == t || t1 == last)
1084 t1 = parse_unresolved_qualifier_level(t, last, db);
1085 if (t1 == t || t1 == last || db.names.size() < 2)
1093 t1 = parse_base_unresolved_name(t, last, db);
1115 static const char *parse_dot_expr(const char *first, const char *last, C &db) {
1116 if (last - first >= 3 && first[0] == 'd' && first[1] == 't') {
1117 const char *t = parse_expression(first + 2, last, db);
1119 const char *t1 = parse_unresolved_name(t, last, db);
1138 static const char *parse_call_expr(const char *first, const char *last, C &db) {
1139 if (last - first >= 4 && first[0] == 'c' && first[1] == 'l') {
1140 const char *t = parse_expression(first + 2, last, db);
1142 if (t == last)
1151 const char *t1 = parse_expression(t, last, db);
1152 if (t1 == t || t1 == last)
1189 static const char *parse_new_expr(const char *first, const char *last, C &db) {
1190 if (last - first >= 4) {
1200 if (t == last)
1205 const char *t1 = parse_expression(t, last, db);
1206 if (t1 == t || t1 == last)
1225 const char *t1 = parse_type(t, last, db);
1226 if (t1 == t || t1 == last)
1230 if (last - t >= 3 && t[0] == 'p' && t[1] == 'i') {
1235 t1 = parse_expression(t, last, db);
1236 if (t1 == t || t1 == last)
1299 static const char *parse_conversion_expr(const char *first, const char *last,
1301 if (last - first >= 3 && first[0] == 'c' && first[1] == 'v') {
1304 const char *t = parse_type(first + 2, last, db);
1306 if (t != first + 2 && t != last) {
1308 const char *t1 = parse_expression(t, last, db);
1314 if (t == last)
1321 const char *t1 = parse_expression(t, last, db);
1322 if (t1 == t || t1 == last)
1356 static const char *parse_arrow_expr(const char *first, const char *last,
1358 if (last - first >= 3 && first[0] == 'p' && first[1] == 't') {
1359 const char *t = parse_expression(first + 2, last, db);
1361 const char *t1 = parse_expression(t, last, db);
1382 static const char *parse_function_type(const char *first, const char *last,
1384 if (first != last && *first == 'F') {
1386 if (t != last) {
1389 if (++t == last)
1392 const char *t1 = parse_type(t, last, db);
1398 if (t == last) {
1410 if (*t == 'R' && t + 1 != last && t[1] == 'E') {
1415 if (*t == 'O' && t + 1 != last && t[1] == 'E') {
1421 t1 = parse_type(t, last, db);
1423 if (t1 == t || t1 == last)
1458 const char *last, C &db) {
1459 if (first != last && *first == 'M') {
1460 const char *t = parse_type(first + 1, last, db);
1462 const char *t2 = parse_type(t, last, db);
1489 static const char *parse_array_type(const char *first, const char *last,
1491 if (first != last && *first == 'A' && first + 1 != last) {
1493 const char *t = parse_type(first + 2, last, db);
1503 const char *t = parse_number(first + 1, last);
1504 if (t != last && *t == '_') {
1505 const char *t2 = parse_type(t + 1, last, db);
1517 const char *t = parse_expression(first + 1, last, db);
1518 if (t != first + 1 && t != last && *t == '_') {
1519 const char *t2 = parse_type(++t, last, db);
1544 static const char *parse_decltype(const char *first, const char *last, C &db) {
1545 if (last - first >= 4 && first[0] == 'D') {
1549 const char *t = parse_expression(first + 2, last, db);
1550 if (t != first + 2 && t != last && *t == 'E') {
1570 static const char *parse_vector_type(const char *first, const char *last,
1572 if (last - first > 3 && first[0] == 'D' && first[1] == 'v') {
1574 const char *t = parse_number(first + 2, last);
1575 if (t == last || *t != '_')
1579 if (++t != last) {
1581 const char *t1 = parse_type(t, last, db);
1598 const char *t = parse_expression(t1, last, db);
1607 if (t1 != last && *t1 == '_' && ++t1 != last) {
1608 const char *t = parse_type(t1, last, db);
1647 static const char *parse_type(const char *first, const char *last, C &db) {
1648 if (first != last) {
1654 const char *t = parse_cv_qualifiers(first, last, cv);
1658 const char *t1 = parse_type(t, last, db);
1696 const char *t = parse_builtin_type(first, last, db);
1702 t = parse_array_type(first, last, db);
1711 t = parse_type(first + 1, last, db);
1721 t = parse_function_type(first, last, db);
1730 t = parse_type(first + 1, last, db);
1740 t = parse_pointer_to_member_type(first, last, db);
1750 t = parse_type(first + 1, last, db);
1772 t = parse_type(first + 1, last, db);
1799 t = parse_type(first + 1, last, db);
1821 t = parse_template_param(first, last, db);
1828 const char *t1 = parse_template_args(t, last, db);
1842 if (first + 1 != last) {
1843 t = parse_source_name(first + 1, last, db);
1845 const char *t2 = parse_type(t, last, db);
1872 if (first + 1 != last && first[1] == 't') {
1873 t = parse_name(first, last, db);
1881 t = parse_substitution(first, last, db);
1886 t = parse_template_args(first, last, db);
1902 if (first + 1 != last) {
1906 t = parse_type(first + 2, last, db);
1919 t = parse_decltype(first, last, db);
1929 t = parse_vector_type(first, last, db);
1944 t = parse_builtin_type(first, last, db);
1948 t = parse_name(first, last, db);
2020 static const char *parse_operator_name(const char *first, const char *last,
2022 if (last - first >= 2) {
2062 const char *t = parse_type(first + 2, last, db);
2139 const char *t = parse_source_name(first + 2, last, db);
2281 const char *t = parse_source_name(first + 2, last, db);
2296 static const char *parse_integer_literal(const char *first, const char *last,
2298 const char *t = parse_number(first, last);
2299 if (t != first && t != last && *t == 'E') {
2330 static const char *parse_expr_primary(const char *first, const char *last,
2332 if (last - first >= 4 && *first == 'L') {
2335 const char *t = parse_integer_literal(first + 2, last, "wchar_t", db);
2354 const char *t = parse_integer_literal(first + 2, last, "char", db);
2359 const char *t = parse_integer_literal(first + 2, last, "signed char", db);
2365 parse_integer_literal(first + 2, last, "unsigned char", db);
2370 const char *t = parse_integer_literal(first + 2, last, "short", db);
2376 parse_integer_literal(first + 2, last, "unsigned short", db);
2381 const char *t = parse_integer_literal(first + 2, last, "", db);
2386 const char *t = parse_integer_literal(first + 2, last, "u", db);
2391 const char *t = parse_integer_literal(first + 2, last, "l", db);
2396 const char *t = parse_integer_literal(first + 2, last, "ul", db);
2401 const char *t = parse_integer_literal(first + 2, last, "ll", db);
2406 const char *t = parse_integer_literal(first + 2, last, "ull", db);
2411 const char *t = parse_integer_literal(first + 2, last, "__int128", db);
2417 parse_integer_literal(first + 2, last, "unsigned __int128", db);
2422 const char *t = parse_floating_number<float>(first + 2, last, db);
2427 const char *t = parse_floating_number<double>(first + 2, last, db);
2432 const char *t = parse_floating_number<long double>(first + 2, last, db);
2438 const char *t = parse_encoding(first + 3, last, db);
2439 if (t != first + 3 && t != last && *t == 'E')
2449 const char *t = parse_type(first + 1, last, db);
2450 if (t != first + 1 && t != last) {
2453 for (; n != last && isdigit(*n); ++n)
2455 if (n != t && n != last && *n == 'E') {
2532 static const char *parse_ctor_dtor_name(const char *first, const char *last,
2534 if (last - first >= 2 && !db.names.empty()) {
2578 static const char *parse_unnamed_type_name(const char *first, const char *last,
2580 if (last - first > 2 && first[0] == 'U') {
2586 if (t0 == last) {
2592 while (t1 != last
2598 if (t0 == last || *t0 != '_') {
2611 const char *t1 = parse_type(t0, last, db);
2624 t1 = parse_type(t0, last, db);
2641 if (t0 == last || *t0 != 'E') {
2647 if (t0 == last) {
2654 while (t1 != last && std::isdigit(*t1))
2659 if (t0 == last || *t0 != '_') {
2677 static const char *parse_unqualified_name(const char *first, const char *last,
2679 if (first != last) {
2684 t = parse_ctor_dtor_name(first, last, db);
2689 t = parse_unnamed_type_name(first, last, db);
2702 t = parse_source_name(first, last, db);
2707 t = parse_operator_name(first, last, db);
2721 static const char *parse_unscoped_name(const char *first, const char *last,
2723 if (last - first >= 2) {
2729 if (t0 != last && *t0 == 'L')
2732 const char *t1 = parse_unqualified_name(t0, last, db);
2748 static const char *parse_alignof_type(const char *first, const char *last,
2750 if (last - first >= 3 && first[0] == 'a' && first[1] == 't') {
2751 const char *t = parse_type(first + 2, last, db);
2766 static const char *parse_alignof_expr(const char *first, const char *last,
2768 if (last - first >= 3 && first[0] == 'a' && first[1] == 'z') {
2769 const char *t = parse_expression(first + 2, last, db);
2782 const char *last, C &db) {
2783 const char *t1 = parse_expression(first, last, db);
2794 static const char *parse_prefix_expression(const char *first, const char *last,
2797 const char *t1 = parse_expression(first, last, db);
2808 static const char *parse_binary_expression(const char *first, const char *last,
2811 const char *t1 = parse_expression(first, last, db);
2813 const char *t2 = parse_expression(t1, last, db);
2915 static const char *parse_expression(const char *first, const char *last,
2917 if (last - first >= 2) {
2920 if (last - first >= 4 && t[0] == 'g' && t[1] == 's') {
2926 first = parse_expr_primary(first, last, db);
2929 first = parse_template_param(first, last, db);
2932 first = parse_function_param(first, last, db);
2937 t = parse_binary_expression(first + 2, last, "&&", db);
2942 t = parse_prefix_expression(first + 2, last, "&", db);
2947 t = parse_binary_expression(first + 2, last, "&", db);
2952 t = parse_binary_expression(first + 2, last, "&=", db);
2957 t = parse_binary_expression(first + 2, last, "=", db);
2962 first = parse_alignof_type(first, last, db);
2965 first = parse_alignof_expr(first, last, db);
2972 first = parse_const_cast_expr(first, last, db);
2975 first = parse_call_expr(first, last, db);
2978 t = parse_binary_expression(first + 2, last, ",", db);
2983 t = parse_prefix_expression(first + 2, last, "~", db);
2988 first = parse_conversion_expr(first, last, db);
2995 const char *t1 = parse_expression(t + 2, last, db);
3006 first = parse_dynamic_cast_expr(first, last, db);
3009 t = parse_prefix_expression(first + 2, last, "*", db);
3014 const char *t1 = parse_expression(t + 2, last, db);
3025 return parse_unresolved_name(first, last, db);
3027 first = parse_dot_star_expr(first, last, db);
3030 first = parse_dot_expr(first, last, db);
3033 t = parse_binary_expression(first + 2, last, "/", db);
3038 t = parse_binary_expression(first + 2, last, "/=", db);
3047 t = parse_binary_expression(first + 2, last, "^", db);
3052 t = parse_binary_expression(first + 2, last, "^=", db);
3057 t = parse_binary_expression(first + 2, last, "==", db);
3066 t = parse_binary_expression(first + 2, last, ">=", db);
3071 t = parse_binary_expression(first + 2, last, ">", db);
3079 const char *t1 = parse_expression(first + 2, last, db);
3081 const char *t2 = parse_expression(t1, last, db);
3098 t = parse_binary_expression(first + 2, last, "<=", db);
3103 t = parse_binary_expression(first + 2, last, "<<", db);
3108 t = parse_binary_expression(first + 2, last, "<<=", db);
3113 t = parse_binary_expression(first + 2, last, "<", db);
3122 t = parse_binary_expression(first + 2, last, "-", db);
3127 t = parse_binary_expression(first + 2, last, "-=", db);
3132 t = parse_binary_expression(first + 2, last, "*", db);
3137 t = parse_binary_expression(first + 2, last, "*=", db);
3142 if (first + 2 != last && first[2] == '_') {
3143 t = parse_prefix_expression(first + 3, last, "--", db);
3147 const char *t1 = parse_expression(first + 2, last, db);
3162 first = parse_new_expr(first, last, db);
3165 t = parse_binary_expression(first + 2, last, "!=", db);
3170 t = parse_prefix_expression(first + 2, last, "-", db);
3175 t = parse_prefix_expression(first + 2, last, "!", db);
3180 t = parse_noexcept_expression(first + 2, last, db);
3189 return parse_unresolved_name(first, last, db);
3191 t = parse_binary_expression(first + 2, last, "||", db);
3196 t = parse_binary_expression(first + 2, last, "|", db);
3201 t = parse_binary_expression(first + 2, last, "|=", db);
3210 t = parse_binary_expression(first + 2, last, "->*", db);
3215 t = parse_binary_expression(first + 2, last, "+", db);
3220 t = parse_binary_expression(first + 2, last, "+=", db);
3225 if (first + 2 != last && first[2] == '_') {
3226 t = parse_prefix_expression(first + 3, last, "++", db);
3230 const char *t1 = parse_expression(first + 2, last, db);
3240 t = parse_prefix_expression(first + 2, last, "+", db);
3245 first = parse_arrow_expr(first, last, db);
3251 const char *t1 = parse_expression(first + 2, last, db);
3253 const char *t2 = parse_expression(t1, last, db);
3255 const char *t3 = parse_expression(t2, last, db);
3280 first = parse_reinterpret_cast_expr(first, last, db);
3283 t = parse_binary_expression(first + 2, last, "%", db);
3288 t = parse_binary_expression(first + 2, last, "%=", db);
3293 t = parse_binary_expression(first + 2, last, ">>", db);
3298 t = parse_binary_expression(first + 2, last, ">>=", db);
3307 first = parse_static_cast_expr(first, last, db);
3310 first = parse_pack_expansion(first, last, db);
3313 return parse_unresolved_name(first, last, db);
3315 first = parse_sizeof_type_expr(first, last, db);
3318 first = parse_sizeof_expr_expr(first, last, db);
3321 if (last - t >= 3) {
3324 first = parse_sizeof_param_pack_expr(first, last, db);
3327 first = parse_sizeof_function_param_pack_expr(first, last, db);
3338 first = parse_typeid_expr(first, last, db);
3345 first = parse_throw_expr(first, last, db);
3358 return parse_unresolved_name(first, last, db);
3376 static const char *parse_template_arg(const char *first, const char *last,
3378 if (first != last) {
3382 t = parse_expression(first + 1, last, db);
3384 if (t != last && *t == 'E')
3390 if (t == last)
3393 const char *t1 = parse_template_arg(t, last, db);
3402 if (first + 1 != last && first[1] == 'Z') {
3403 t = parse_encoding(first + 2, last, db);
3404 if (t != first + 2 && t != last && *t == 'E')
3407 first = parse_expr_primary(first, last, db);
3411 first = parse_type(first, last, db);
3422 static const char *parse_template_args(const char *first, const char *last,
3424 if (last - first >= 2 && *first == 'I') {
3433 const char *t1 = parse_template_arg(t, last, db);
3437 if (t1 == t || t1 == last)
3483 static const char *parse_nested_name(const char *first, const char *last, C &db,
3485 if (first != last && *first == 'N') {
3487 const char *t0 = parse_cv_qualifiers(first + 1, last, cv);
3488 if (t0 == last)
3499 if (last - t0 >= 2 && t0[0] == 'S' && t0[1] == 't') {
3503 if (t0 == last) {
3514 if (t0 + 1 != last && t0[1] == 't')
3516 t1 = parse_substitution(t0, last, db);
3517 if (t1 != t0 && t1 != last) {
3533 t1 = parse_template_param(t0, last, db);
3534 if (t1 != t0 && t1 != last) {
3550 if (t0 + 1 != last && t0[1] != 't' && t0[1] != 'T')
3552 t1 = parse_decltype(t0, last, db);
3553 if (t1 != t0 && t1 != last) {
3569 t1 = parse_template_args(t0, last, db);
3570 if (t1 != t0 && t1 != last) {
3583 if (++t0 == last)
3588 t1 = parse_unqualified_name(t0, last, db);
3589 if (t1 != t0 && t1 != last) {
3619 static const char *parse_discriminator(const char *first, const char *last) {
3621 if (first != last) {
3624 if (t1 != last) {
3628 for (++t1; t1 != last && std::isdigit(*t1); ++t1)
3630 if (t1 != last && *t1 == '_')
3636 for (; t1 != last && std::isdigit(*t1); ++t1)
3638 if (t1 == last)
3639 first = last;
3651 static const char *parse_local_name(const char *first, const char *last, C &db,
3653 if (first != last && *first == 'Z') {
3654 const char *t = parse_encoding(first + 1, last, db);
3655 if (t != first + 1 && t != last && *t == 'E' && ++t != last) {
3658 first = parse_discriminator(t + 1, last);
3664 if (++t != last) {
3665 const char *t1 = parse_number(t, last);
3666 if (t1 != last && *t1 == '_') {
3668 t1 = parse_name(t, last, db, ends_with_template_args);
3685 const char *t1 = parse_name(t, last, db, ends_with_template_args);
3688 first = parse_discriminator(t1, last);
3715 static const char *parse_name(const char *first, const char *last, C &db,
3717 if (last - first >= 2) {
3724 const char *t1 = parse_nested_name(t0, last, db, ends_with_template_args);
3730 const char *t1 = parse_local_name(t0, last, db, ends_with_template_args);
3736 const char *t1 = parse_unscoped_name(t0, last, db);
3738 if (t1 != last &&
3745 t1 = parse_template_args(t0, last, db);
3761 t1 = parse_substitution(t0, last, db);
3762 if (t1 != t0 && t1 != last && *t1 == 'I') {
3764 t1 = parse_template_args(t0, last, db);
3795 static const char *parse_call_offset(const char *first, const char *last) {
3796 if (first != last) {
3799 const char *t = parse_number(first + 1, last);
3800 if (t != first + 1 && t != last && *t == '_')
3804 const char *t = parse_number(first + 1, last);
3805 if (t != first + 1 && t != last && *t == '_') {
3806 const char *t2 = parse_number(++t, last);
3807 if (t2 != t && t2 != last && *t2 == '_')
3834 static const char *parse_special_name(const char *first, const char *last,
3836 if (last - first > 2) {
3843 t = parse_type(first + 2, last, db);
3853 t = parse_type(first + 2, last, db);
3863 t = parse_type(first + 2, last, db);
3873 t = parse_type(first + 2, last, db);
3884 const char *t0 = parse_call_offset(first + 2, last);
3887 const char *t1 = parse_call_offset(t0, last);
3890 t = parse_encoding(t1, last, db);
3902 t = parse_type(first + 2, last, db);
3904 const char *t0 = parse_number(t, last);
3905 if (t0 != t && t0 != last && *t0 == '_') {
3906 const char *t1 = parse_type(++t0, last, db);
3925 const char *t0 = parse_call_offset(first + 1, last);
3928 t = parse_encoding(t0, last, db);
3948 t = parse_name(first + 2, last, db);
3958 t = parse_name(first + 2, last, db);
3993 static const char *parse_encoding(const char *first, const char *last, C &db) {
3994 if (first != last) {
4003 first = parse_special_name(first, last, db);
4007 const char *t = parse_name(first, last, db, &ends_with_template_args);
4011 if (t != last && *t != 'E' && *t != '.') {
4022 t2 = parse_type(t, last, db);
4039 if (t != last && *t == 'v') {
4045 t2 = parse_type(t, last, db);
4104 static const char *parse_block_invoke(const char *first, const char *last,
4106 if (last - first >= 13) {
4113 if (t != last) {
4116 if (++t == last || !std::isdigit(*t))
4121 while (t != last && isdigit(*t))
4136 static const char *parse_dot_suffix(const char *first, const char *last,
4138 if (first != last && *first == '.') {
4141 db.names.back().first += " (" + std::string(first, last) + ")";
4142 first = last;
4154 static void demangle(const char *first, const char *last, C &db, int &status) {
4155 if (first >= last) {
4160 if (last - first >= 4) {
4162 const char *t = parse_encoding(first + 2, last, db);
4163 if (t != first + 2 && t != last && *t == '.')
4164 t = parse_dot_suffix(t, last, db);
4165 if (t != last)
4168 const char *t = parse_encoding(first + 4, last, db);
4169 if (t != first + 4 && t != last) {
4170 const char *t1 = parse_block_invoke(t, last, db);
4171 if (t1 != last)
4180 const char *t = parse_type(first, last, db);
4181 if (t != last)