From e96039fb1bee747dc2529cf053e7ee00e704c79e Mon Sep 17 00:00:00 2001 From: Artemiy Date: Sun, 24 Sep 2023 12:30:58 +0300 Subject: [PATCH] Fix default argument value type checking (#10460) # Description Fix type checking in arguments default values not adhering to subtyping rules Currently following examples produce a parse error: ```nu def test [ --qwe: record = {a: 1 b: 1} ] { } def test [ --qwe: list = [ 1 2 3 ] ] { } ``` despite types matching. Type equality check is replaced with subtyping check and everything parses fine: # User-Facing Changes Default values of flag arguments type checking behavior is in line with `let` statements --- crates/nu-parser/src/parser.rs | 2 +- tests/parsing/mod.rs | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/crates/nu-parser/src/parser.rs b/crates/nu-parser/src/parser.rs index 90aeb44ab3..567bc7ad3f 100644 --- a/crates/nu-parser/src/parser.rs +++ b/crates/nu-parser/src/parser.rs @@ -3838,7 +3838,7 @@ pub fn parse_signature_helper(working_set: &mut StateWorkingSet, span: Span) -> } } t => { - if t != &expression_ty { + if !type_compatible(t, &expression_ty) { working_set.error( ParseError::AssignmentMismatch( "Default value is the wrong type" diff --git a/tests/parsing/mod.rs b/tests/parsing/mod.rs index 105173c109..49aaedebda 100644 --- a/tests/parsing/mod.rs +++ b/tests/parsing/mod.rs @@ -247,6 +247,12 @@ fn parse_long_duration() { } #[rstest] +#[case("def test [ --a: any = 32 ] {}")] +#[case("def test [ --a: number = 32 ] {}")] +#[case("def test [ --a: number = 32.0 ] {}")] +#[case("def test [ --a: list = [ 1 2 3 ] ] {}")] +#[case("def test [ --a: record = { a: 32 b: 'qwe' c: 'wqe' } ] {}")] +#[case("def test [ --a: record = { a: 32 b: 'qwe'} ] {}")] #[case("def test []: int -> int { 1 }")] #[case("def test []: string -> string { 'qwe' }")] #[case("def test []: nothing -> nothing { null }")]