From f37eb6a93210a0247c11802c47f17508ed45ec28 Mon Sep 17 00:00:00 2001 From: yuyi Date: Mon, 22 Nov 2021 22:51:58 +0800 Subject: [PATCH] checker: check invalid fn parameter name (#12540) --- vlib/v/checker/checker.v | 12 ++++++++++-- .../checker/tests/invalid_parameter_name_err.out | 14 ++++++++++++++ .../checker/tests/invalid_parameter_name_err.vv | 14 ++++++++++++++ vlib/v/tests/for_loops_test.v | 16 ++++++++-------- 4 files changed, 46 insertions(+), 10 deletions(-) create mode 100644 vlib/v/checker/tests/invalid_parameter_name_err.out create mode 100644 vlib/v/checker/tests/invalid_parameter_name_err.vv diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 8d4e9b9864..4ff7b9f639 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -31,8 +31,8 @@ const ( valid_comptime_not_user_defined = all_valid_comptime_idents() array_builtin_methods = ['filter', 'clone', 'repeat', 'reverse', 'map', 'slice', 'sort', 'contains', 'index', 'wait', 'any', 'all', 'first', 'last', 'pop'] - reserved_type_names = ['bool', 'i8', 'i16', 'int', 'i64', 'byte', 'u16', 'u32', - 'u64', 'f32', 'f64', 'map', 'string', 'rune'] + reserved_type_names = ['bool', 'char', 'i8', 'i16', 'int', 'i64', 'byte', 'u16', + 'u32', 'u64', 'f32', 'f64', 'map', 'string', 'rune'] vroot_is_deprecated_message = '@VROOT is deprecated, use @VMODROOT or @VEXEROOT instead' ) @@ -566,6 +566,10 @@ pub fn (mut c Checker) interface_decl(mut node ast.InterfaceDecl) { continue // no need to check first param } c.ensure_type_exists(param.typ, param.pos) or { return } + if param.name in checker.reserved_type_names { + c.error('invalid use of reserved type `$param.name` as a parameter name', + param.pos) + } if is_js { ptyp := c.table.get_type_symbol(param.typ) if !ptyp.is_js_compatible() && !(j == method.params.len - 1 @@ -8242,6 +8246,10 @@ fn (mut c Checker) fn_decl(mut node ast.FnDecl) { // Make sure all types are valid for mut param in node.params { c.ensure_type_exists(param.typ, param.type_pos) or { return } + if param.name in checker.reserved_type_names { + c.error('invalid use of reserved type `$param.name` as a parameter name', + param.pos) + } if !param.typ.is_ptr() { // value parameter, i.e. on stack - check for `[heap]` arg_typ_sym := c.table.get_type_symbol(param.typ) if arg_typ_sym.kind == .struct_ { diff --git a/vlib/v/checker/tests/invalid_parameter_name_err.out b/vlib/v/checker/tests/invalid_parameter_name_err.out new file mode 100644 index 0000000000..f567decd46 --- /dev/null +++ b/vlib/v/checker/tests/invalid_parameter_name_err.out @@ -0,0 +1,14 @@ +vlib/v/checker/tests/invalid_parameter_name_err.vv:4:24: error: invalid use of reserved type `char` as a parameter name + 2 | } + 3 | + 4 | fn (mut b Buffer) put8(char u8) ? { + | ~~~~ + 5 | return error('-') + 6 | } +vlib/v/checker/tests/invalid_parameter_name_err.vv:10:6: error: invalid use of reserved type `char` as a parameter name + 8 | interface Writer { + 9 | mut: + 10 | put(char u8) ? + | ~~~~ + 11 | } + 12 | diff --git a/vlib/v/checker/tests/invalid_parameter_name_err.vv b/vlib/v/checker/tests/invalid_parameter_name_err.vv new file mode 100644 index 0000000000..d0132be254 --- /dev/null +++ b/vlib/v/checker/tests/invalid_parameter_name_err.vv @@ -0,0 +1,14 @@ +struct Buffer { +} + +fn (mut b Buffer) put8(char u8) ? { + return error('-') +} + +interface Writer { +mut: + put(char u8) ? +} + +fn main() { +} diff --git a/vlib/v/tests/for_loops_test.v b/vlib/v/tests/for_loops_test.v index 0f347a28f1..6a651a9156 100644 --- a/vlib/v/tests/for_loops_test.v +++ b/vlib/v/tests/for_loops_test.v @@ -4,16 +4,16 @@ const ( fn test_for_char_in() { mut sum := 0 - for char in nums { - sum += char + for ch in nums { + sum += ch } assert sum == 6 } fn test_for_char_in_range() { mut sum := 0 - for char in 0 .. nums.len { - sum += nums[char] + for ch in 0 .. nums.len { + sum += nums[ch] } assert sum == 6 } @@ -28,8 +28,8 @@ fn test_for_blank_in_range() { fn test_for_char_complex() { mut sum := 0 - for char := 0; char < nums.len; char++ { - sum += nums[char] + for ch := 0; ch < nums.len; ch++ { + sum += nums[ch] } assert sum == 6 } @@ -37,8 +37,8 @@ fn test_for_char_complex() { fn test_for_char_in_string() { s := 'abcd' mut sum := 0 - for char in s { - sum += char + for ch in s { + sum += ch } assert sum == 394 // ascii codes of `a` + `b` + `c` + `d` }