diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index c80c9ee9bc..d80235b670 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -22,7 +22,6 @@ mut: errors []string expected_type table.Type fn_return_type table.Type // current function's return type - is_amp bool } pub fn new_checker(table &table.Table) Checker { @@ -87,9 +86,6 @@ pub fn (c mut Checker) struct_init(struct_init mut ast.StructInit) table.Type { info := typ_sym.info as table.Struct if struct_init.fields.len == 0 { // Short syntax TODO check - if c.is_amp { - return table.type_to_ptr(struct_init.typ) - } return struct_init.typ } if struct_init.exprs.len > info.fields.len { @@ -123,9 +119,6 @@ pub fn (c mut Checker) struct_init(struct_init mut ast.StructInit) table.Type { } else {} } - if c.is_amp { - return table.type_to_ptr(struct_init.typ) - } return struct_init.typ } @@ -719,16 +712,15 @@ pub fn (c mut Checker) expr(node ast.Expr) table.Type { return c.postfix_expr(it) } ast.PrefixExpr { - if it.op == .amp { - c.is_amp = true + right_type := c.expr(it.right) + // TODO: testing ref/deref strategy + if it.op == .amp && !table.type_is_ptr(right_type) { + return table.type_to_ptr(right_type) } - res := c.expr(it.right) - c.is_amp = false - // TODO: impl solid ref/deref strategy - if it.op == .mul && table.type_is_ptr(res) { - return table.type_deref(res) + if it.op == .mul && table.type_is_ptr(right_type) { + return table.type_deref(right_type) } - return res + return right_type } ast.None { return table.none_type @@ -1001,16 +993,9 @@ pub fn (c mut Checker) index_expr(node mut ast.IndexExpr) table.Type { } value_type := c.table.value_type(typ) if value_type != table.void_type { - if c.is_amp { - return table.type_to_ptr(value_type) - } return value_type } } - // TODO: handle these globally, not individually - if c.is_amp { - return table.type_to_ptr(typ) - } return typ }