| 527 | } |
| 528 | |
| 529 | struct test_format_string_handler { |
| 530 | constexpr void on_text(const char*, const char*) {} |
| 531 | |
| 532 | constexpr auto on_arg_id() -> int { return 0; } |
| 533 | |
| 534 | template <typename T> constexpr auto on_arg_id(T) -> int { return 0; } |
| 535 | |
| 536 | constexpr void on_replacement_field(int, const char*) {} |
| 537 | |
| 538 | constexpr auto on_format_specs(int, const char* begin, const char*) -> const |
| 539 | char* { |
| 540 | return begin; |
| 541 | } |
| 542 | |
| 543 | constexpr void on_error(const char*) { error = true; } |
| 544 | |
| 545 | bool error = false; |
| 546 | }; |
| 547 | |
| 548 | template <size_t N> constexpr auto parse_string(const char (&s)[N]) -> bool { |
| 549 | auto h = test_format_string_handler(); |