From f90fcb51b48ce667c822a3fc8477f6e35d3f8bed Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Sun, 5 Apr 2026 17:27:22 +0300 Subject: [PATCH] all: more deref fixes (p. 2) --- vlib/datatypes/bstree.v | 4 ++-- .../tests/check_err_msg_with_generics.out | 14 -------------- .../v/checker/tests/generic_type_inference.out | 14 -------------- vlib/v/gen/c/assign.v | 2 +- vlib/v/gen/c/dumpexpr.v | 18 ++++++++++++++++-- vlib/v/gen/c/index.v | 2 +- vlib/v/gen/native/blacklist.v | 1 + vlib/v/generics/new_generics_regression_test.v | 3 +-- .../inout/dump_generic_fn_mut_arg.out | 2 +- 9 files changed, 23 insertions(+), 37 deletions(-) diff --git a/vlib/datatypes/bstree.v b/vlib/datatypes/bstree.v index fef4b8ea7..0a526e3f3 100644 --- a/vlib/datatypes/bstree.v +++ b/vlib/datatypes/bstree.v @@ -51,7 +51,7 @@ fn (mut node BSTreeNode[T]) bind(mut to_bind BSTreeNode[T], _left bool) { node.right = to_bind.right node.value = to_bind.value node.is_init = to_bind.is_init - to_bind = new_none_node[T](false) + to_bind = *new_none_node[T](false) } // Pure Binary Seach Tree implementation @@ -140,7 +140,7 @@ fn (mut bst BSTree[T]) remove_helper(mut node BSTreeNode[T], value T, left bool) } else { parent.right = new_none_node[T](false) } - node = new_none_node[T](false) + node = *new_none_node[T](false) } return true } diff --git a/vlib/v/checker/tests/check_err_msg_with_generics.out b/vlib/v/checker/tests/check_err_msg_with_generics.out index 223ff4aed..45c228546 100644 --- a/vlib/v/checker/tests/check_err_msg_with_generics.out +++ b/vlib/v/checker/tests/check_err_msg_with_generics.out @@ -1,17 +1,3 @@ -vlib/datatypes/bstree.v:54:10: warning: cannot assign a reference to a value (this will be an error soon) left=datatypes.BSTreeNode[Result[[]Token, Err[string]]] false right=datatypes.BSTreeNode[Result[[]Token, Err[string]]] true ptr=true - 52 | node.value = to_bind.value - 53 | node.is_init = to_bind.is_init - 54 | to_bind = new_none_node[T](false) - | ^ - 55 | } - 56 | -vlib/datatypes/bstree.v:143:9: warning: cannot assign a reference to a value (this will be an error soon) left=datatypes.BSTreeNode[Result[[]Token, Err[string]]] false right=datatypes.BSTreeNode[Result[[]Token, Err[string]]] true ptr=true - 141 | parent.right = new_none_node[T](false) - 142 | } - 143 | node = new_none_node[T](false) - | ^ - 144 | } - 145 | return true vlib/v/checker/tests/check_err_msg_with_generics.vv:15:10: error: cannot cast struct `datatypes.BSTree[Result[[]Token, Err[string]]]` to `int` 13 | fn test_err_msg() { 14 | typ := datatypes.BSTree[Result[[]Token, Err[string]]]{} diff --git a/vlib/v/checker/tests/generic_type_inference.out b/vlib/v/checker/tests/generic_type_inference.out index 32f9f556b..e69de29bb 100644 --- a/vlib/v/checker/tests/generic_type_inference.out +++ b/vlib/v/checker/tests/generic_type_inference.out @@ -1,14 +0,0 @@ -vlib/datatypes/bstree.v:54:10: warning: cannot assign a reference to a value (this will be an error soon) left=datatypes.BSTreeNode[KeyVal[int]] false right=datatypes.BSTreeNode[KeyVal[int]] true ptr=true - 52 | node.value = to_bind.value - 53 | node.is_init = to_bind.is_init - 54 | to_bind = new_none_node[T](false) - | ^ - 55 | } - 56 | -vlib/datatypes/bstree.v:143:9: warning: cannot assign a reference to a value (this will be an error soon) left=datatypes.BSTreeNode[KeyVal[int]] false right=datatypes.BSTreeNode[KeyVal[int]] true ptr=true - 141 | parent.right = new_none_node[T](false) - 142 | } - 143 | node = new_none_node[T](false) - | ^ - 144 | } - 145 | return true diff --git a/vlib/v/gen/c/assign.v b/vlib/v/gen/c/assign.v index 17955b11b..a68e61f4e 100644 --- a/vlib/v/gen/c/assign.v +++ b/vlib/v/gen/c/assign.v @@ -2037,7 +2037,7 @@ fn (mut g Gen) gen_cross_var_assign(node &ast.AssignStmt) { g.write('${styp} _var_${left.pos.pos} = ${string_clone}*(${styp}*)builtin__array_get(') } - if left.left_type.is_ptr() { + if left.left_type.is_ptr() || left.left.is_auto_deref_var() { g.write('*') } g.expr(left.left) diff --git a/vlib/v/gen/c/dumpexpr.v b/vlib/v/gen/c/dumpexpr.v index ac1a32cc1..8a4ba3bcb 100644 --- a/vlib/v/gen/c/dumpexpr.v +++ b/vlib/v/gen/c/dumpexpr.v @@ -55,7 +55,12 @@ fn (mut g Gen) dump_expr(node ast.DumpExpr) { if node.expr.info is ast.IdentVar { current_fn_ident_type := g.resolve_current_fn_generic_param_type(node.expr.name) if current_fn_ident_type != 0 { - expr_type = current_fn_ident_type + is_auto_deref := node.expr.obj is ast.Var && node.expr.obj.is_auto_deref + expr_type = if is_auto_deref && current_fn_ident_type.is_ptr() { + current_fn_ident_type.deref() + } else { + current_fn_ident_type + } } else { resolved_ident_type := g.unwrap_generic(g.type_resolver.get_type_or_default(ast.Expr(node.expr), expr_type)) @@ -181,7 +186,12 @@ fn (mut g Gen) dump_expr(node ast.DumpExpr) { if !is_comptime_smartcast { current_fn_ident_type := g.resolve_current_fn_generic_param_type(node.expr.name) if current_fn_ident_type != 0 { - expr_type = current_fn_ident_type + is_auto_deref := node.expr.obj is ast.Var && node.expr.obj.is_auto_deref + expr_type = if is_auto_deref && current_fn_ident_type.is_ptr() { + current_fn_ident_type.deref() + } else { + current_fn_ident_type + } name = g.styp(expr_type.clear_flags(.shared_f, .result)).replace('*', '') } @@ -232,6 +242,10 @@ fn (mut g Gen) dump_expr(node ast.DumpExpr) { if expr_type.has_flag(.option_mut_param_t) { g.write('*') } + if node.expr is ast.Ident && node.expr.obj is ast.Var && node.expr.obj.is_auto_deref + && !expr_type.is_ptr() { + g.write('*') + } for { if node.expr is ast.Ident { if node.expr.obj is ast.Var { diff --git a/vlib/v/gen/c/index.v b/vlib/v/gen/c/index.v index 2c40b0eaf..63710a27a 100644 --- a/vlib/v/gen/c/index.v +++ b/vlib/v/gen/c/index.v @@ -222,7 +222,7 @@ fn (mut g Gen) index_of_array(node ast.IndexExpr, sym ast.TypeSymbol) { info.elem_type } elem_sym := g.table.final_sym(elem_type) - left_is_ptr := array_left_type.is_ptr() + left_is_ptr := array_left_type.is_ptr() || node.left.is_auto_deref_var() result_type := match true { gen_or && elem_type.has_flag(.option) { node.typ.clear_flag(.option) diff --git a/vlib/v/gen/native/blacklist.v b/vlib/v/gen/native/blacklist.v index 776a3b902..c6fee3413 100644 --- a/vlib/v/gen/native/blacklist.v +++ b/vlib/v/gen/native/blacklist.v @@ -57,6 +57,7 @@ const blacklist = { 'string.contains_u8': false 'malloc_noscan': false 'malloc': false + 'malloc_uninit': false 'is_nil': false 'memdup': false 'vcalloc': false diff --git a/vlib/v/generics/new_generics_regression_test.v b/vlib/v/generics/new_generics_regression_test.v index c5f4159c8..e5e78f014 100644 --- a/vlib/v/generics/new_generics_regression_test.v +++ b/vlib/v/generics/new_generics_regression_test.v @@ -98,7 +98,7 @@ fn run_new_generic_solver_tests(root_label string, test_cmd string, expected_sum } const expected_summsvc_generics = 'Summary for all V _test.v files: 108 failed, 166 passed, 274 total.' -const expected_summary_generics = 'Summary for all V _test.v files: 107 failed, 167 passed, 274 total.' +const expected_summary_generics = 'Summary for all V _test.v files: 106 failed, 168 passed, 274 total.' const expected_summsvc_vec = 'Summary for all V _test.v files: 3 failed, 3 total.' const expected_summary_vec = 'Summary for all V _test.v files: 3 failed, 3 total.' const expected_summsvc_flag = 'Summary for all V _test.v files: 2 failed, 17 passed, 19 total.' @@ -212,7 +212,6 @@ const failing_tests = [ 'vlib/v/tests/generics/generics_with_nested_generic_method_call_test.v', 'vlib/v/tests/generics/generics_with_nested_generics_fn_infer_call_test.v', 'vlib/v/tests/generics/generics_with_pointer_index_test.v', - 'vlib/v/tests/generics/generics_with_recursive_generics_fn_test.v', ]! const failing_math_vec_tests = [ 'vlib/math/vec/vec2_test.v', diff --git a/vlib/v/slow_tests/inout/dump_generic_fn_mut_arg.out b/vlib/v/slow_tests/inout/dump_generic_fn_mut_arg.out index ca11eb1da..1792e2af2 100644 --- a/vlib/v/slow_tests/inout/dump_generic_fn_mut_arg.out +++ b/vlib/v/slow_tests/inout/dump_generic_fn_mut_arg.out @@ -1 +1 @@ -[vlib/v/slow_tests/inout/dump_generic_fn_mut_arg.vv:11] t: &Reptile{} +[vlib/v/slow_tests/inout/dump_generic_fn_mut_arg.vv:11] t: Reptile{} -- 2.39.5