mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
checker: ref & deref in prefix expr
This commit is contained in:
parent
421f5b6fdf
commit
efbf114a2f
@ -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
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user