diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 8809805442..3c0f706fc3 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -2754,13 +2754,20 @@ pub fn (mut c Checker) expr(node ast.Expr) table.Type { } if node.right is ast.IndexExpr as index { typ_sym := c.table.get_type_symbol(index.left_type) - if !c.inside_unsafe { + mut is_mut := false + if index.left is ast.Ident as ident { + if ident.obj is ast.Var { + v := ident.obj as ast.Var + is_mut = v.is_mut + } + } + if !c.inside_unsafe && is_mut { if typ_sym.kind == .map { - c.error('cannot get address of map values outside unsafe blocks', + c.error('cannot take the address of mutable map values outside unsafe blocks', index.pos) } if typ_sym.kind == .array { - c.error('cannot get address of array elements outside unsafe blocks', + c.error('cannot take the address of mutable array elements outside unsafe blocks', index.pos) } } diff --git a/vlib/v/checker/tests/array_get_element_address_err.out b/vlib/v/checker/tests/array_get_element_address_err.out deleted file mode 100644 index dfb520089b..0000000000 --- a/vlib/v/checker/tests/array_get_element_address_err.out +++ /dev/null @@ -1,7 +0,0 @@ -vlib/v/checker/tests/array_get_element_address_err.vv:3:20: error: cannot get address of array elements outside unsafe blocks - 1 | fn main() { - 2 | arr_int := [int(23), 45, 7, 8] - 3 | ele := &arr_int[1] - | ~~~ - 4 | println(ele) - 5 | } diff --git a/vlib/v/checker/tests/map_get_value_address_err.out b/vlib/v/checker/tests/map_get_value_address_err.out deleted file mode 100644 index 08e11dfc1f..0000000000 --- a/vlib/v/checker/tests/map_get_value_address_err.out +++ /dev/null @@ -1,14 +0,0 @@ -vlib/v/checker/tests/map_get_value_address_err.vv:3:12: error: cannot get address of map values outside unsafe blocks - 1 | fn main() { - 2 | m := {'key' : 3} - 3 | a := &m['key'] - | ~~~~~~~ - 4 | b := &{'foo': 4}['foo'] - 5 | println(a) -vlib/v/checker/tests/map_get_value_address_err.vv:4:21: error: cannot get address of map values outside unsafe blocks - 2 | m := {'key' : 3} - 3 | a := &m['key'] - 4 | b := &{'foo': 4}['foo'] - | ~~~~~~~ - 5 | println(a) - 6 | println(b) diff --git a/vlib/v/checker/tests/map_get_value_address_err.vv b/vlib/v/checker/tests/map_get_value_address_err.vv deleted file mode 100644 index 7f984e1541..0000000000 --- a/vlib/v/checker/tests/map_get_value_address_err.vv +++ /dev/null @@ -1,7 +0,0 @@ -fn main() { - m := {'key' : 3} - a := &m['key'] - b := &{'foo': 4}['foo'] - println(a) - println(b) -} diff --git a/vlib/v/checker/tests/mut_array_get_element_address_err.out b/vlib/v/checker/tests/mut_array_get_element_address_err.out new file mode 100644 index 0000000000..a3a5f4821b --- /dev/null +++ b/vlib/v/checker/tests/mut_array_get_element_address_err.out @@ -0,0 +1,7 @@ +vlib/v/checker/tests/mut_array_get_element_address_err.vv:3:20: error: cannot take the address of mutable array elements outside unsafe blocks + 1 | fn main() { + 2 | mut arr_int := [int(23), 45, 7, 8] + 3 | ele := &arr_int[1] + | ~~~ + 4 | println(ele) + 5 | } diff --git a/vlib/v/checker/tests/array_get_element_address_err.vv b/vlib/v/checker/tests/mut_array_get_element_address_err.vv similarity index 58% rename from vlib/v/checker/tests/array_get_element_address_err.vv rename to vlib/v/checker/tests/mut_array_get_element_address_err.vv index 78a3ce5b7e..1afbcb3d24 100644 --- a/vlib/v/checker/tests/array_get_element_address_err.vv +++ b/vlib/v/checker/tests/mut_array_get_element_address_err.vv @@ -1,5 +1,5 @@ fn main() { - arr_int := [int(23), 45, 7, 8] + mut arr_int := [int(23), 45, 7, 8] ele := &arr_int[1] println(ele) } diff --git a/vlib/v/checker/tests/mut_map_get_value_address_err.out b/vlib/v/checker/tests/mut_map_get_value_address_err.out new file mode 100644 index 0000000000..d33844e164 --- /dev/null +++ b/vlib/v/checker/tests/mut_map_get_value_address_err.out @@ -0,0 +1,7 @@ +vlib/v/checker/tests/mut_map_get_value_address_err.vv:3:12: error: cannot take the address of mutable map values outside unsafe blocks + 1 | fn main() { + 2 | mut m := {'key' : 3} + 3 | a := &m['key'] + | ~~~~~~~ + 4 | println(a) + 5 | } diff --git a/vlib/v/checker/tests/mut_map_get_value_address_err.vv b/vlib/v/checker/tests/mut_map_get_value_address_err.vv new file mode 100644 index 0000000000..1f3cc58a9d --- /dev/null +++ b/vlib/v/checker/tests/mut_map_get_value_address_err.vv @@ -0,0 +1,5 @@ +fn main() { + mut m := {'key' : 3} + a := &m['key'] + println(a) +} diff --git a/vlib/v/tests/unsafe_test.v b/vlib/v/tests/unsafe_test.v index 4e72ccbb26..0df136baeb 100644 --- a/vlib/v/tests/unsafe_test.v +++ b/vlib/v/tests/unsafe_test.v @@ -51,12 +51,10 @@ fn test_unsafe_if_stmt() int { } fn test_map_address_index() { - m := { + mut m := { 'one': 1 } - unsafe { - mut one := &m['one'] - one++ - println(*one) - } + mut one := unsafe {&m['one']} + (*one)++ + println(*one) }