From 4d0f835548a64da1a365222392331cd531492222 Mon Sep 17 00:00:00 2001 From: Alexander Ivanov Date: Thu, 23 Sep 2021 11:59:43 +0300 Subject: [PATCH] checker: fix detection of invalid insertions, fixes #3600 (#11945) --- vlib/v/checker/checker.v | 9 +++++++-- .../tests/invalid_insert_references_test.out | 7 +++++++ .../tests/invalid_insert_references_test.vv | 14 ++++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 vlib/v/checker/tests/invalid_insert_references_test.out create mode 100644 vlib/v/checker/tests/invalid_insert_references_test.vv diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 3b081a6b33..e622dbe168 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -1586,8 +1586,13 @@ pub fn (mut c Checker) infix_expr(mut node ast.InfixExpr) ast.Type { } // []T << T or []T << []T unwrapped_right_type := c.unwrap_generic(right_type) - if c.check_types(unwrapped_right_type, left_value_type) - || c.check_types(unwrapped_right_type, c.unwrap_generic(left_type)) { + if c.check_types(unwrapped_right_type, left_value_type) { + // []&T << T is wrong: we check for that, !(T.is_ptr()) && ?(&T).is_ptr() + if !(!unwrapped_right_type.is_ptr() && left_value_type.is_ptr() + && left_value_type.share() == .mut_t) { + return ast.void_type + } + } else if c.check_types(unwrapped_right_type, c.unwrap_generic(left_type)) { return ast.void_type } c.error('cannot append `$right_sym.name` to `$left_sym.name`', right_pos) diff --git a/vlib/v/checker/tests/invalid_insert_references_test.out b/vlib/v/checker/tests/invalid_insert_references_test.out new file mode 100644 index 0000000000..a0f28a019d --- /dev/null +++ b/vlib/v/checker/tests/invalid_insert_references_test.out @@ -0,0 +1,7 @@ +vlib/v/checker/tests/invalid_insert_references_test.vv:8:7: error: cannot append `int literal` to `[]&int` + 6 | a << &c + 7 | c = 2 + 8 | a << 1 + | ^ + 9 | println(a) + 10 | } diff --git a/vlib/v/checker/tests/invalid_insert_references_test.vv b/vlib/v/checker/tests/invalid_insert_references_test.vv new file mode 100644 index 0000000000..2b1b373876 --- /dev/null +++ b/vlib/v/checker/tests/invalid_insert_references_test.vv @@ -0,0 +1,14 @@ +// fixes https://github.com/vlang/v/issues/3600, test based on a simplified version of example by https://github.com/radare +fn test_invalid_insert_references() { + b := 0 + mut a := [&b] + mut c := 1 + a << &c + c = 2 + a << 1 + println(a) +} + +fn main() { + test_invalid_insert_references() +}