checker: allow int <=> enum usage in c2v'ed code
parent
6c40781d84
commit
2abbbcc02d
|
@ -2456,7 +2456,7 @@ pub fn (mut c Checker) fn_call(mut call_expr ast.CallExpr) ast.Type {
|
||||||
typ := c.check_expr_opt_call(call_arg.expr, c.expr(call_arg.expr))
|
typ := c.check_expr_opt_call(call_arg.expr, c.expr(call_arg.expr))
|
||||||
call_expr.args[i].typ = typ
|
call_expr.args[i].typ = typ
|
||||||
typ_sym := c.table.get_type_symbol(typ)
|
typ_sym := c.table.get_type_symbol(typ)
|
||||||
arg_typ_sym := c.table.get_type_symbol(param.typ)
|
param_typ_sym := c.table.get_type_symbol(param.typ)
|
||||||
if func.is_variadic && typ.has_flag(.variadic) && call_expr.args.len - 1 > i {
|
if func.is_variadic && typ.has_flag(.variadic) && call_expr.args.len - 1 > i {
|
||||||
c.error('when forwarding a variadic variable, it must be the final argument',
|
c.error('when forwarding a variadic variable, it must be the final argument',
|
||||||
call_arg.pos)
|
call_arg.pos)
|
||||||
|
@ -2490,12 +2490,12 @@ pub fn (mut c Checker) fn_call(mut call_expr ast.CallExpr) ast.Type {
|
||||||
c.fail_if_unreadable(call_arg.expr, typ, 'argument')
|
c.fail_if_unreadable(call_arg.expr, typ, 'argument')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mut final_arg_sym := arg_typ_sym
|
mut final_param_sym := param_typ_sym
|
||||||
if func.is_variadic && arg_typ_sym.info is ast.Array {
|
if func.is_variadic && param_typ_sym.info is ast.Array {
|
||||||
final_arg_sym = c.table.get_type_symbol(arg_typ_sym.array_info().elem_type)
|
final_param_sym = c.table.get_type_symbol(param_typ_sym.array_info().elem_type)
|
||||||
}
|
}
|
||||||
// Handle expected interface
|
// Handle expected interface
|
||||||
if final_arg_sym.kind == .interface_ {
|
if final_param_sym.kind == .interface_ {
|
||||||
c.type_implements(typ, param.typ, call_arg.expr.position())
|
c.type_implements(typ, param.typ, call_arg.expr.position())
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
@ -2506,12 +2506,21 @@ pub fn (mut c Checker) fn_call(mut call_expr ast.CallExpr) ast.Type {
|
||||||
// if arg_typ_sym.kind == .string && typ_sym.has_method('str') {
|
// if arg_typ_sym.kind == .string && typ_sym.has_method('str') {
|
||||||
// continue
|
// continue
|
||||||
// }
|
// }
|
||||||
if typ_sym.kind == .void && arg_typ_sym.kind == .string {
|
if typ_sym.kind == .void && param_typ_sym.kind == .string {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if func.generic_names.len > 0 {
|
if func.generic_names.len > 0 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
if c.pref.translated {
|
||||||
|
// Allow enums to be used as ints and vice versa in translated code
|
||||||
|
if param.typ == ast.int_type && typ_sym.kind == .enum_ {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if typ == ast.int_type && param_typ_sym.kind == .enum_ {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
c.error('$err.msg in argument ${i + 1} to `$fn_name`', call_arg.pos)
|
c.error('$err.msg in argument ${i + 1} to `$fn_name`', call_arg.pos)
|
||||||
}
|
}
|
||||||
// Warn about automatic (de)referencing, which will be removed soon.
|
// Warn about automatic (de)referencing, which will be removed soon.
|
||||||
|
|
Loading…
Reference in New Issue