From 44c78ed761c0d295db470b3e3552c5049294c829 Mon Sep 17 00:00:00 2001 From: Swastik Baranwal Date: Wed, 20 Mar 2024 01:12:37 +0530 Subject: [PATCH] parser: add better error for mut variadic fn argument (#21063) --- vlib/v/parser/fn.v | 8 ++++++++ vlib/v/parser/tests/fn_alias_arg_variadic_mut_err.out | 3 +++ vlib/v/parser/tests/fn_alias_arg_variadic_mut_err.vv | 1 + vlib/v/parser/tests/fn_arg_variadic_mut_err.out | 5 +++++ vlib/v/parser/tests/fn_arg_variadic_mut_err.vv | 3 +++ 5 files changed, 20 insertions(+) create mode 100644 vlib/v/parser/tests/fn_alias_arg_variadic_mut_err.out create mode 100644 vlib/v/parser/tests/fn_alias_arg_variadic_mut_err.vv create mode 100644 vlib/v/parser/tests/fn_arg_variadic_mut_err.out create mode 100644 vlib/v/parser/tests/fn_arg_variadic_mut_err.vv diff --git a/vlib/v/parser/fn.v b/vlib/v/parser/fn.v index eb7e3da52..2e2689964 100644 --- a/vlib/v/parser/fn.v +++ b/vlib/v/parser/fn.v @@ -912,6 +912,10 @@ fn (mut p Parser) fn_params() ([]ast.Param, bool, bool) { } if is_mut { if !param_type.has_flag(.generic) { + if is_variadic { + p.error_with_pos('variadic arguments cannot be `mut`, `shared` or `atomic`', + pos) + } if is_shared { p.check_fn_shared_arguments(param_type, pos) } else if is_atomic { @@ -1027,6 +1031,10 @@ fn (mut p Parser) fn_params() ([]ast.Param, bool, bool) { } if is_mut { if !typ.has_flag(.generic) { + if is_variadic { + p.error_with_pos('variadic arguments cannot be `mut`, `shared` or `atomic`', + pos) + } if is_shared { p.check_fn_shared_arguments(typ, pos) } else if is_atomic { diff --git a/vlib/v/parser/tests/fn_alias_arg_variadic_mut_err.out b/vlib/v/parser/tests/fn_alias_arg_variadic_mut_err.out new file mode 100644 index 000000000..2711016b3 --- /dev/null +++ b/vlib/v/parser/tests/fn_alias_arg_variadic_mut_err.out @@ -0,0 +1,3 @@ +vlib/v/parser/tests/fn_alias_arg_variadic_mut_err.vv:1:22: error: variadic arguments cannot be `mut`, `shared` or `atomic` + 1 | type Foo = fn(mut ...string) + | ~~~~~~ diff --git a/vlib/v/parser/tests/fn_alias_arg_variadic_mut_err.vv b/vlib/v/parser/tests/fn_alias_arg_variadic_mut_err.vv new file mode 100644 index 000000000..602647041 --- /dev/null +++ b/vlib/v/parser/tests/fn_alias_arg_variadic_mut_err.vv @@ -0,0 +1 @@ +type Foo = fn(mut ...string) diff --git a/vlib/v/parser/tests/fn_arg_variadic_mut_err.out b/vlib/v/parser/tests/fn_arg_variadic_mut_err.out new file mode 100644 index 000000000..3a8a4ad05 --- /dev/null +++ b/vlib/v/parser/tests/fn_arg_variadic_mut_err.out @@ -0,0 +1,5 @@ +vlib/v/parser/tests/fn_arg_variadic_mut_err.vv:1:26: error: variadic arguments cannot be `mut`, `shared` or `atomic` + 1 | fn load(mut filepaths ...string) { + | ~~~~~~ + 2 | println(filepaths[0]) + 3 | } diff --git a/vlib/v/parser/tests/fn_arg_variadic_mut_err.vv b/vlib/v/parser/tests/fn_arg_variadic_mut_err.vv new file mode 100644 index 000000000..bef98a0db --- /dev/null +++ b/vlib/v/parser/tests/fn_arg_variadic_mut_err.vv @@ -0,0 +1,3 @@ +fn load(mut filepaths ...string) { + println(filepaths[0]) +} -- 2.39.5