From a0e41a693f48cd2daf71a1b2523a010d8d347f0f Mon Sep 17 00:00:00 2001 From: Thomas M Kehrenberg Date: Mon, 19 Jan 2026 10:55:54 +0100 Subject: [PATCH] Keep secondary errors on the last choice even if it fails --- src/lib.rs | 16 ++++++++++++++++ src/primitive.rs | 11 +++++------ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 16baa6af..6d02e72d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4243,6 +4243,22 @@ mod tests { ); } + #[test] + fn secondary_error_choice() { + let secondary_error = any::<_, extra::Default>() + .validate(|out, _, emitter| { + emitter.emit(EmptyErr::default()); + out + }) + .then(just('c')); + let parser = choice((just('a').then(just('b')), secondary_error)); + + assert_eq!( + parser.parse("aa").into_output_errors(), + (None, vec![EmptyErr::default(), EmptyErr::default()]) + ); + } + /* #[test] fn label_sets() { diff --git a/src/primitive.rs b/src/primitive.rs index 93f55c66..4d854f25 100644 --- a/src/primitive.rs +++ b/src/primitive.rs @@ -952,15 +952,14 @@ macro_rules! impl_choice_for_tuple { let Choice { parsers: ($Head, $($X,)*), .. } = self; - match $Head.go::(inp) { - Ok(out) => return Ok(out), - Err(()) => inp.rewind(before.clone()), + if let Ok(out) = $Head.go::(inp) { + return Ok(out); } $( - match $X.go::(inp) { - Ok(out) => return Ok(out), - Err(()) => inp.rewind(before.clone()), + inp.rewind(before.clone()); + if let Ok(out) = $X.go::(inp) { + return Ok(out); } )*