std::optional<resultType> result{parser_.Parse(state)};
if (result.has_value()) {
messages.Annex(state.messages());
- state.messages() = std::move(messages);
} else {
state = std::move(backtrack);
- state.messages() = std::move(messages);
}
+ state.messages() = std::move(messages);
return result;
}
auto lastEnd = state.GetLocation();
if (prevEnd == lastEnd) {
prevState.messages().Incorporate(state.messages());
+ if (state.anyDeferredMessages()) {
+ prevState.set_anyDeferredMessages();
+ }
}
if (prevEnd >= lastEnd) {
state = std::move(prevState);
return ax;
}
messages.Annex(state.messages());
+ bool hadDeferredMessages{state.anyDeferredMessages()};
state = std::move(backtrack);
state.set_deferMessages(true);
std::optional<resultType> bx{pb_.Parse(state)};
state.messages() = std::move(messages);
state.set_deferMessages(originallyDeferred);
+ if (hadDeferredMessages) {
+ state.set_anyDeferredMessages();
+ }
if (bx.has_value()) {
state.set_anyErrorRecovery();
}
warnOnDeprecatedUsage_{that.warnOnDeprecatedUsage_},
anyErrorRecovery_{that.anyErrorRecovery_},
anyConformanceViolation_{that.anyConformanceViolation_},
- deferMessages_{that.deferMessages_} {}
+ deferMessages_{that.deferMessages_}, anyDeferredMessages_{
+ that.anyDeferredMessages_} {}
ParseState(ParseState &&that)
: p_{that.p_}, limit_{that.limit_}, messages_{std::move(that.messages_)},
context_{std::move(that.context_)}, userState_{that.userState_},
}
bool anyDeferredMessages() const { return anyDeferredMessages_; }
- void set_anyDeferredMessages(bool yes) { anyDeferredMessages_ = yes; }
+ void set_anyDeferredMessages() { anyDeferredMessages_ = true; }
const char *GetLocation() const { return p_; }