| 5475 | typename Context, |
| 5476 | typename SkipParser> |
| 5477 | std::conditional_t< |
| 5478 | detail::in_recursion<Context, tag_type>, |
| 5479 | detail::nope, |
| 5480 | attr_type> |
| 5481 | call( |
| 5482 | Iter & first, |
| 5483 | Sentinel last, |
| 5484 | Context const & context, |
| 5485 | SkipParser const & skip, |
| 5486 | detail::flags flags, |
| 5487 | bool & success) const |
| 5488 | { |
| 5489 | constexpr bool in_recursion = |
| 5490 | detail::in_recursion<Context, tag_type>; |
| 5491 | |
| 5492 | if constexpr (in_recursion) |
| 5493 | flags = detail::disable_attrs(flags); |
| 5494 | |
| 5495 | attr_type retval{}; |
| 5496 | locals_type locals = detail::make_locals<locals_type>(context); |
| 5497 | auto params = detail::resolve_rule_params(context, params_); |
| 5498 | tag_type * const tag_ptr = nullptr; |
| 5499 | auto const rule_context = detail::make_rule_context( |
| 5500 | context, tag_ptr, retval, locals, params); |
| 5501 | #if BOOST_PARSER_DO_TRACE |
| 5502 | [[maybe_unused]] auto _ = detail::scoped_trace( |
| 5503 | *this, first, last, rule_context, flags, retval); |
| 5504 | #endif |
| 5505 | |
| 5506 | bool dont_assign = false; |
| 5507 | if constexpr (in_recursion) { |
| 5508 | // We have to use this out-arg overload for iterations >= 1 in |
| 5509 | // recursive rules, since every iteration past the first is |
| 5510 | // defined to return nope. |
| 5511 | parse_rule( |
| 5512 | tag_ptr, |
| 5513 | first, |
| 5514 | last, |
| 5515 | rule_context, |
| 5516 | skip, |
| 5517 | flags, |
| 5518 | success, |
| 5519 | dont_assign, |
| 5520 | retval); |
| 5521 | } else { |
| 5522 | auto attr = parse_rule( |
| 5523 | tag_ptr, |
| 5524 | first, |
| 5525 | last, |
| 5526 | rule_context, |
| 5527 | skip, |
| 5528 | flags, |
| 5529 | success, |
| 5530 | dont_assign); |
| 5531 | if (success && !dont_assign) { |
| 5532 | if constexpr (!detail::is_nope_v<decltype(attr)>) |
| 5533 | detail::assign(retval, std::move(attr)); |
| 5534 | } |
nothing calls this directly
no test coverage detected