From 7143b8ab37031e9fab47c2e9b0fffc77b57b9cb2 Mon Sep 17 00:00:00 2001 From: Delyan Angelov Date: Fri, 10 Sep 2021 11:43:51 +0300 Subject: [PATCH] v.checker: allow assigning pointers to fn variables (fix vinix compilation) --- vlib/v/checker/checker.v | 11 +++++++---- vlib/v/tests/fn_assignment_test.v | 9 +++++++++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 4d58a459eb..59347456dd 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -4023,10 +4023,13 @@ pub fn (mut c Checker) assign_stmt(mut node ast.AssignStmt) { // Do not allow `a := 0; b := 0; a = &b` if !is_decl && left is ast.Ident && !is_blank_ident && !left_type.is_real_pointer() && right_type.is_real_pointer() { - c.warn( - 'cannot assign a reference to a value (this will be an error soon) left=${c.table.type_str(left_type)} $left_type.is_ptr() ' + - 'right=${c.table.type_str(right_type)} $right_type.is_real_pointer() ptr=$right_type.is_ptr()', - node.pos) + left_sym := c.table.get_type_symbol(left_type) + if left_sym.kind != .function { + c.warn( + 'cannot assign a reference to a value (this will be an error soon) left=${c.table.type_str(left_type)} $left_type.is_ptr() ' + + 'right=${c.table.type_str(right_type)} $right_type.is_real_pointer() ptr=$right_type.is_ptr()', + node.pos) + } } node.left_types << left_type match mut left { diff --git a/vlib/v/tests/fn_assignment_test.v b/vlib/v/tests/fn_assignment_test.v index d61c4e5ca2..b6e1c345c3 100644 --- a/vlib/v/tests/fn_assignment_test.v +++ b/vlib/v/tests/fn_assignment_test.v @@ -51,3 +51,12 @@ fn test_fn_assignment_array() { assert a[0] == 12 assert a[1] == 10 } + +fn test_fn_variables_can_be_assigned_pointers() { + mut fn_ptr := fn (_ voidptr, _ u64) {} + // println(voidptr(fn_ptr)) + assert fn_ptr != voidptr(0) + fn_ptr = voidptr(0) + // aprintln(voidptr(fn_ptr)) + assert fn_ptr == voidptr(0) +}