From 89c0e325fa54e73287fec47334b548d7de11658c Mon Sep 17 00:00:00 2001 From: Solomon Date: Wed, 30 Jul 2025 21:38:59 +0000 Subject: [PATCH] fix panic when `..=` syntax is used in stepped ranges (#16231) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #16185 # Description Stepped range literals where `..=` precedes the second value no longer cause a parser panic: ```diff random int 1..=3..5 -Error: x Main thread panicked. - |-> at crates/nu-protocol/src/engine/state_working_set.rs:400:48 - `-> slice index starts at 8 but ends at 7 +Error: nu::parser::parse_mismatch + + × Parse mismatch during operation. + ╭─[entry #1:1:15] + 1 │ random int 1..=3..5 + · ─┬ + · ╰── expected number ``` --- crates/nu-parser/src/parser.rs | 7 ++++++- tests/repl/test_ranges.rs | 15 ++++++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/crates/nu-parser/src/parser.rs b/crates/nu-parser/src/parser.rs index b1ca82106e..1cf764e23d 100644 --- a/crates/nu-parser/src/parser.rs +++ b/crates/nu-parser/src/parser.rs @@ -1834,7 +1834,12 @@ pub fn parse_range(working_set: &mut StateWorkingSet, span: Span) -> Option TestResult { @@ -47,7 +48,8 @@ fn zip_ranges() -> TestResult { #[test] fn int_in_stepped_range() -> TestResult { - run_test(r#"7 in 1..3..15"#, "true") + run_test(r#"7 in 1..3..15"#, "true")?; + run_test(r#"7 in 1..3..=15"#, "true") } #[test] @@ -74,3 +76,14 @@ fn float_in_unbounded_stepped_range() -> TestResult { fn float_not_in_unbounded_stepped_range() -> TestResult { run_test(r#"2.1 in 1.2..3.."#, "false") } + +#[rstest] +#[case("1..=3..", "expected number")] +#[case("..=3..=15", "expected number")] +#[case("..=(..", "expected closing )")] +#[case("..=()..", "expected at least one range bound")] +#[case("..=..", "expected at least one range bound")] +#[test] +fn bad_range_syntax(#[case] input: &str, #[case] expect: &str) -> TestResult { + fail_test(&format!("def foo [r: range] {{}}; foo {input}"), expect) +}