diff --git a/vlib/v/gen/c/array.v b/vlib/v/gen/c/array.v index b4b4de4055..5bfe78a49c 100644 --- a/vlib/v/gen/c/array.v +++ b/vlib/v/gen/c/array.v @@ -153,7 +153,8 @@ fn (mut g Gen) gen_array_map(node ast.CallExpr) { verror('map() requires an array') } g.empty_line = true - g.writeln('$ret_typ $tmp;') + noscan := g.check_noscan(ret_info.elem_type) + g.writeln('$ret_typ $tmp = __new_array${noscan}(0, 0, sizeof($ret_elem_type));') if g.infix_left_var_name.len > 0 { g.writeln('if ($g.infix_left_var_name) {') g.indent++ @@ -162,7 +163,6 @@ fn (mut g Gen) gen_array_map(node ast.CallExpr) { g.expr(node.left) g.writeln(';') g.writeln('int ${tmp}_len = ${tmp}_orig.len;') - noscan := g.check_noscan(ret_info.elem_type) g.writeln('$tmp = __new_array${noscan}(0, ${tmp}_len, sizeof($ret_elem_type));\n') i := g.new_tmp_var() g.writeln('for (int $i = 0; $i < ${tmp}_len; ++$i) {') @@ -336,7 +336,8 @@ fn (mut g Gen) gen_array_filter(node ast.CallExpr) { styp := g.typ(node.return_type) elem_type_str := g.typ(info.elem_type) g.empty_line = true - g.writeln('$styp $tmp;') + noscan := g.check_noscan(info.elem_type) + g.writeln('$styp $tmp = __new_array${noscan}(0, 0, sizeof($elem_type_str));') if g.infix_left_var_name.len > 0 { g.writeln('if ($g.infix_left_var_name) {') g.indent++ @@ -345,7 +346,6 @@ fn (mut g Gen) gen_array_filter(node ast.CallExpr) { g.expr(node.left) g.writeln(';') g.writeln('int ${tmp}_len = ${tmp}_orig.len;') - noscan := g.check_noscan(info.elem_type) g.writeln('$tmp = __new_array${noscan}(0, ${tmp}_len, sizeof($elem_type_str));\n') i := g.new_tmp_var() g.writeln('for (int $i = 0; $i < ${tmp}_len; ++$i) {') diff --git a/vlib/v/tests/if_expr_with_array_call_test.v b/vlib/v/tests/if_expr_with_array_call_test.v index 65f368288e..f301c6b049 100644 --- a/vlib/v/tests/if_expr_with_array_call_test.v +++ b/vlib/v/tests/if_expr_with_array_call_test.v @@ -1,4 +1,4 @@ -fn test_if_expr_with_array_call() { +fn test_if_expr_with_array_call_all() { arr := [''] for i in arr { @@ -14,6 +14,10 @@ fn test_if_expr_with_array_call() { assert true } } +} + +fn test_if_expr_with_array_call_any() { + arr := [''] for i in arr { if i.len == 0 || i[1..].bytes().any(it.is_letter()) { @@ -28,25 +32,31 @@ fn test_if_expr_with_array_call() { assert true } } +} - arr2 := ['abc'] +fn test_if_expr_with_array_call_map() { + arr := ['abc'] - if arr2.len == 1 || arr2[1].bytes().map(it.is_letter())[0] { + if arr.len == 1 || arr[1].bytes().map(it.is_letter())[0] { println('yes') assert true } - if arr2.len == 1 || (arr2[1].bytes().map(it.is_letter())[0]) { - println('yes') - assert true - } - - if arr2.len == 1 || arr2[1].bytes().filter(it.is_letter()).len == 0 { - println('yes') - assert true - } - - if arr2.len == 1 || (arr2[1].bytes().filter(it.is_letter()).len == 0) { + if arr.len == 1 || (arr[1].bytes().map(it.is_letter())[0]) { + println('yes') + assert true + } +} + +fn test_if_expr_with_array_call_filter() { + arr := ['abc'] + + if arr.len == 1 || arr[1].bytes().filter(it.is_letter()).len == 0 { + println('yes') + assert true + } + + if arr.len == 1 || (arr[1].bytes().filter(it.is_letter()).len == 0) { println('yes') assert true }