diff --git a/vlib/v/checker/check_types.v b/vlib/v/checker/check_types.v index 5e9da090e9..0ee6d63656 100644 --- a/vlib/v/checker/check_types.v +++ b/vlib/v/checker/check_types.v @@ -87,8 +87,8 @@ pub fn (mut c Checker) check_types(got ast.Type, expected ast.Type) bool { } if expected.has_flag(.optional) { sym := c.table.sym(got) - if (sym.kind == .interface_ && sym.name == 'IError') - || got in [ast.none_type, ast.error_type] { + if sym.idx == ast.error_type_idx || got in [ast.none_type, ast.error_type] { + // IErorr return true } else if !c.check_basic(got, expected.clear_flag(.optional)) { return false diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 4a1716f917..75f99cf3cb 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -1375,7 +1375,8 @@ fn (mut c Checker) type_implements(typ ast.Type, interface_type ast.Type, pos to method := c.table.find_method_with_embeds(typ_sym, imethod.name) or { // >> Hack to allow old style custom error implementations // TODO: remove once deprecation period for `IError` methods has ended - if inter_sym.name == 'IError' && (imethod.name == 'msg' || imethod.name == 'code') { + if inter_sym.idx == ast.error_type_idx + && (imethod.name == 'msg' || imethod.name == 'code') { c.note("`$styp` doesn't implement method `$imethod.name` of interface `$inter_sym.name`. The usage of fields is being deprecated in favor of methods.", pos) continue @@ -1421,7 +1422,8 @@ fn (mut c Checker) type_implements(typ ast.Type, interface_type ast.Type, pos to if utyp != ast.voidptr_type { // >> Hack to allow old style custom error implementations // TODO: remove once deprecation period for `IError` methods has ended - if inter_sym.name == 'IError' && (ifield.name == 'msg' || ifield.name == 'code') { + if inter_sym.idx == ast.error_type_idx + && (ifield.name == 'msg' || ifield.name == 'code') { // do nothing, necessary warnings are already printed } else { // << diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index 25319f2dbb..21930b9784 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -2046,7 +2046,7 @@ fn (mut g Gen) expr_with_cast(expr ast.Expr, got_type_raw ast.Type, expected_typ g.write('.msg))') return } - if got_sym.kind == .none_ && exp_sym.name == 'IError' { + if got_sym.kind == .none_ && exp_sym.idx == ast.error_type_idx { g.expr(expr) return } @@ -5488,7 +5488,7 @@ static inline __shared__$interface_name ${shared_fn_name}(__shared__$cctype* x) // >> Hack to allow old style custom error implementations // TODO: remove once deprecation period for `IError` methods has ended // fix MSVC not handling empty struct inits - if methods.len == 0 && interface_name == 'IError' { + if methods.len == 0 && isym.idx == ast.error_type_idx { methods_struct.writeln('\t\t._method_msg = NULL,') methods_struct.writeln('\t\t._method_code = NULL,') } diff --git a/vlib/v/gen/c/match.v b/vlib/v/gen/c/match.v index bb07b2ce4e..37e4613f21 100644 --- a/vlib/v/gen/c/match.v +++ b/vlib/v/gen/c/match.v @@ -153,7 +153,8 @@ fn (mut g Gen) match_expr_sumtype(node ast.MatchExpr, is_expr bool, cond_var str typ := branch.exprs[sumtype_index] as ast.TypeNode branch_sym := g.table.sym(g.unwrap_generic(typ.typ)) g.write('${dot_or_ptr}_typ == _${sym.cname}_${branch_sym.cname}_index') - } else if branch.exprs[sumtype_index] is ast.None && sym.name == 'IError' { + } else if branch.exprs[sumtype_index] is ast.None + && sym.idx == ast.error_type_idx { g.write('${dot_or_ptr}_typ == _IError_None___index') } }