diff --git a/vlib/eventbus/eventbus_test.v b/vlib/eventbus/eventbus_test.v index 0e36e79ddd..de8a307af2 100644 --- a/vlib/eventbus/eventbus_test.v +++ b/vlib/eventbus/eventbus_test.v @@ -28,6 +28,6 @@ fn test_eventbus(){ assert !eb.subscriber.is_subscribed("on_test") } -fn on_test(sender voidptr, ev &EventData) { +fn on_test(sender voidptr, ev &EventData, x voidptr) { assert ev.data == "hello" } diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 39b81ae5af..bba7501dfb 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -658,17 +658,28 @@ pub fn (mut c Checker) call_method(call_expr mut ast.CallExpr) table.Type { // call_expr.args << method.args[0].typ // call_expr.exp_arg_types << method.args[0].typ for i, arg in call_expr.args { - c.expected_type = if method.is_variadic && i >= method.args.len - 1 { + exp_arg_typ := if method.is_variadic && i >= method.args.len - 1 { method.args[method.args.len - 1].typ } else { method.args[i + 1].typ } - arg_typ := c.expr(arg.expr) - call_expr.args[i].typ = arg_typ - if method.is_variadic && arg_typ.flag_is(.variadic) && call_expr.args.len - 1 > + c.expected_type = exp_arg_typ + got_arg_typ := c.expr(arg.expr) + call_expr.args[i].typ = got_arg_typ + if method.is_variadic && got_arg_typ.flag_is(.variadic) && call_expr.args.len - 1 > i { c.error('when forwarding a varg variable, it must be the final argument', call_expr.pos) } + if !c.table.check(got_arg_typ, exp_arg_typ) { + got_arg_sym := c.table.get_type_symbol(got_arg_typ) + exp_arg_sym := c.table.get_type_symbol(exp_arg_typ) + // str method, allow type with str method if fn arg is string + if exp_arg_sym.kind == .string && got_arg_sym.has_method('str') { + continue + } + c.error('cannot use type `$got_arg_sym.str()` as type `$exp_arg_sym.str()` in argument ${i+1} to `${left_type_sym.name}.$method_name`', + call_expr.pos) + } } // TODO: typ optimize.. this node can get processed more than once if call_expr.expected_arg_types.len == 0 { diff --git a/vlib/v/table/table.v b/vlib/v/table/table.v index d629591a96..fd8fe3092f 100644 --- a/vlib/v/table/table.v +++ b/vlib/v/table/table.v @@ -529,8 +529,15 @@ pub fn (t &Table) check(got, expected Type) bool { if got_type_sym.kind == .function && exp_type_sym.kind == .function { got_info := got_type_sym.info as FnType exp_info := exp_type_sym.info as FnType - if got_info.func.signature() == exp_info.func.signature() { - return true + if got_info.func.args.len == exp_info.func.args.len { + mut matching := false + for i, arg in got_info.func.args { + exp_arg := exp_info.func.args[i] + matching = arg.typ.idx() == exp_arg.typ.idx() || exp_arg.typ == table.voidptr_type + } + if matching { + return true + } } } if got_idx != exp_idx {