mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
parent
27f5c35bde
commit
4d0f835548
@ -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)
|
||||
|
7
vlib/v/checker/tests/invalid_insert_references_test.out
Normal file
7
vlib/v/checker/tests/invalid_insert_references_test.out
Normal file
@ -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 | }
|
14
vlib/v/checker/tests/invalid_insert_references_test.vv
Normal file
14
vlib/v/checker/tests/invalid_insert_references_test.vv
Normal file
@ -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()
|
||||
}
|
Loading…
Reference in New Issue
Block a user