cgen: automatic dereference and match fix
parent
d81d804cb6
commit
c514f0b672
|
@ -347,16 +347,16 @@ mut:
|
|||
|
||||
pub struct MatchExpr {
|
||||
pub:
|
||||
tok_kind token.Kind
|
||||
cond Expr
|
||||
branches []MatchBranch
|
||||
pos token.Position
|
||||
tok_kind token.Kind
|
||||
cond Expr
|
||||
branches []MatchBranch
|
||||
pos token.Position
|
||||
mut:
|
||||
is_expr bool // returns a value
|
||||
return_type table.Type
|
||||
cond_type table.Type // type of `x` in `match x {`
|
||||
// expected_type table.Type // for debugging only
|
||||
is_sum_type bool
|
||||
is_expr bool // returns a value
|
||||
return_type table.Type
|
||||
cond_type table.Type // type of `x` in `match x {`
|
||||
expected_type table.Type // for debugging only
|
||||
is_sum_type bool
|
||||
}
|
||||
|
||||
pub struct MatchBranch {
|
||||
|
|
|
@ -456,6 +456,7 @@ pub fn (c mut Checker) assign_stmt(assign_stmt mut ast.AssignStmt) {
|
|||
})
|
||||
}
|
||||
}
|
||||
c.expected_type = table.void_type
|
||||
}
|
||||
|
||||
pub fn (c mut Checker) array_init(array_init mut ast.ArrayInit) table.Type {
|
||||
|
@ -839,7 +840,7 @@ pub fn (c mut Checker) ident(ident mut ast.Ident) table.Type {
|
|||
|
||||
pub fn (c mut Checker) match_expr(node mut ast.MatchExpr) table.Type {
|
||||
node.is_expr = c.expected_type != table.void_type
|
||||
// node.expected_type = c.expected_type
|
||||
node.expected_type = c.expected_type
|
||||
cond_type := c.expr(node.cond)
|
||||
if cond_type == 0 {
|
||||
c.error('match 0 cond type', node.pos)
|
||||
|
|
|
@ -286,7 +286,7 @@ fn (g mut Gen) stmt(node ast.Stmt) {
|
|||
g.stmts(it.stmts)
|
||||
g.writeln('}')
|
||||
}
|
||||
//TODO:
|
||||
// TODO:
|
||||
else {}
|
||||
}
|
||||
ast.ForStmt {
|
||||
|
@ -1054,11 +1054,12 @@ fn (g mut Gen) match_expr(node ast.MatchExpr) {
|
|||
g.writeln(') {')
|
||||
}
|
||||
}
|
||||
if node.is_sum_type && branch.exprs.len > 0 {
|
||||
// g.writeln('/* M sum_type=$node.is_sum_type is_expr=$node.is_expr exp_type=${g.typ(node.expected_type)}*/')
|
||||
if node.is_sum_type && branch.exprs.len > 0 && !node.is_expr {
|
||||
// The first node in expr is an ast.Type
|
||||
// Use it to generate `it` variable.
|
||||
fe := branch.exprs[0]
|
||||
match fe {
|
||||
first_expr := branch.exprs[0]
|
||||
match first_expr {
|
||||
ast.Type {
|
||||
it_type := g.typ(it.typ)
|
||||
// g.writeln('$it_type* it = ($it_type*)${tmp}.obj; // ST it')
|
||||
|
@ -1302,6 +1303,10 @@ fn (g mut Gen) return_statement(it ast.Return) {
|
|||
}
|
||||
// g.write('/*OPTIONAL*/')
|
||||
}
|
||||
if !table.type_is_ptr(g.fn_decl.return_type) && table.type_is_ptr(it.types[0]) {
|
||||
// Automatic Dereference
|
||||
g.write('*')
|
||||
}
|
||||
g.expr_with_cast(it.types[0], g.fn_decl.return_type, it.exprs[0])
|
||||
}
|
||||
g.writeln(';')
|
||||
|
|
Loading…
Reference in New Issue