diff --git a/vlib/v/checker/check_types.v b/vlib/v/checker/check_types.v index 248ac1f11e..2eba5206e0 100644 --- a/vlib/v/checker/check_types.v +++ b/vlib/v/checker/check_types.v @@ -232,10 +232,6 @@ pub fn (mut c Checker) check_expected_call_arg(got ast.Type, expected_ ast.Type, return } } - got_typ_sym := c.table.sym(got) - got_typ_str := c.table.type_to_str(got.clear_flag(.variadic)) - expected_typ_sym := c.table.sym(expected_) - expected_typ_str := c.table.type_to_str(expected.clear_flag(.variadic)) if c.check_types(got, expected) { if language != .v || expected.is_ptr() == got.is_ptr() || arg.is_mut @@ -244,6 +240,9 @@ pub fn (mut c Checker) check_expected_call_arg(got ast.Type, expected_ ast.Type, return } } else { + got_typ_sym := c.table.sym(got) + expected_typ_sym := c.table.sym(expected_) + // Check on Generics types, there are some case where we have the following case // `&Type == &Type<>`. This is a common case we are implementing a function // with generic parameters like `compare(bst Bst node) {}` @@ -251,6 +250,7 @@ pub fn (mut c Checker) check_expected_call_arg(got ast.Type, expected_ ast.Type, // Check if we are making a comparison between two different types of // the same type like `Type and &Type<>` if (got.is_ptr() != expected.is_ptr()) || !c.check_same_module(got, expected) { + got_typ_str, expected_typ_str := c.get_string_names_of(got, expected) return error('cannot use `$got_typ_str` as `$expected_typ_str`') } return @@ -258,14 +258,22 @@ pub fn (mut c Checker) check_expected_call_arg(got ast.Type, expected_ ast.Type, if got == ast.void_type { return error('`$arg.expr` (no value) used as value') } + got_typ_str, expected_typ_str := c.get_string_names_of(got, expected) return error('cannot use `$got_typ_str` as `$expected_typ_str`') } if got != ast.void_type { + got_typ_str, expected_typ_str := c.get_string_names_of(got, expected) return error('cannot use `$got_typ_str` as `$expected_typ_str`') } } +fn (c Checker) get_string_names_of(got ast.Type, expected ast.Type) (string, string) { + got_typ_str := c.table.type_to_str(got.clear_flag(.variadic)) + expected_typ_str := c.table.type_to_str(expected.clear_flag(.variadic)) + return got_typ_str, expected_typ_str +} + // helper method to check if the type is of the same module. // FIXME(vincenzopalazzo) This is a work around to the issue // explained in the https://github.com/vlang/v/pull/13718#issuecomment-1074517800 diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index b78c2f69aa..1d9a637920 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -804,7 +804,6 @@ fn (mut c Checker) type_implements(typ ast.Type, interface_type ast.Type, pos to } } } - styp := c.table.type_to_str(utyp) if utyp.idx() == interface_type.idx() { // same type -> already casted to the interface return true @@ -813,6 +812,7 @@ fn (mut c Checker) type_implements(typ ast.Type, interface_type ast.Type, pos to // `none` "implements" the Error interface return true } + styp := c.table.type_to_str(utyp) if typ_sym.kind == .interface_ && inter_sym.kind == .interface_ && !styp.starts_with('JS.') && !inter_sym.name.starts_with('JS.') { c.error('cannot implement interface `$inter_sym.name` with a different interface `$styp`', @@ -986,7 +986,6 @@ fn (mut c Checker) check_or_last_stmt(stmt ast.Stmt, ret_type ast.Type, expr_ret if type_fits || is_noreturn { return } - expected_type_name := c.table.type_to_str(ret_type.clear_flag(.optional)) if stmt.typ == ast.void_type { if stmt.expr is ast.IfExpr { for branch in stmt.expr.branches { @@ -999,10 +998,12 @@ fn (mut c Checker) check_or_last_stmt(stmt ast.Stmt, ret_type ast.Type, expr_ret } return } + expected_type_name := c.table.type_to_str(ret_type.clear_flag(.optional)) c.error('`or` block must provide a default value of type `$expected_type_name`, or return/continue/break or call a [noreturn] function like panic(err) or exit(1)', stmt.expr.pos()) } else { type_name := c.table.type_to_str(last_stmt_typ) + expected_type_name := c.table.type_to_str(ret_type.clear_flag(.optional)) c.error('wrong return type `$type_name` in the `or {}` block, expected `$expected_type_name`', stmt.expr.pos()) }