1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

cgen: if smartcast part 3 (#5755)

This commit is contained in:
Daniel Däschle 2020-07-08 19:14:47 +02:00 committed by GitHub
parent 03b76d19f1
commit c0fa31e75a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 33 additions and 4 deletions

View File

@ -2635,6 +2635,13 @@ pub fn (mut c Checker) if_expr(mut node ast.IfExpr) table.Type {
is_used: true is_used: true
is_mut: left_expr.is_mut is_mut: left_expr.is_mut
}) })
scope.register(left_expr.name, ast.Var{
name: left_expr.name
typ: right_expr.typ.to_ptr()
pos: left_expr.pos
is_used: true
is_mut: left_expr.is_mut
})
node.branches[i].smartcast = true node.branches[i].smartcast = true
} }
} }

View File

@ -963,9 +963,17 @@ fn (mut g Gen) expr_with_cast(expr ast.Expr, got_type, expected_type table.Type)
got_styp := g.typ(got_type) got_styp := g.typ(got_type)
exp_styp := g.typ(expected_type) exp_styp := g.typ(expected_type)
got_idx := got_type.idx() got_idx := got_type.idx()
g.write('/* sum type cast */ ($exp_styp) {.obj = memdup(&($got_styp[]) {') if got_type.is_ptr() {
g.expr(expr) g.write('/* sum type cast */ ($exp_styp) {.obj = ')
g.write('}, sizeof($got_styp)), .typ = $got_idx /* $got_sym.name */}') g.expr(expr)
g.write(', .typ = $got_idx /* $got_sym.name */}')
}
else {
g.write('/* sum type cast */ ($exp_styp) {.obj = memdup(&($got_styp[]) {')
g.expr(expr)
g.write('}, sizeof($got_styp)), .typ = $got_idx /* $got_sym.name */}')
}
return return
} }
} }
@ -2314,6 +2322,7 @@ fn (mut g Gen) if_expr(node ast.IfExpr) {
infix := branch.cond as ast.InfixExpr infix := branch.cond as ast.InfixExpr
right_type := infix.right as ast.Type right_type := infix.right as ast.Type
left_type := infix.left_type left_type := infix.left_type
left_expr := infix.left as ast.Ident
it_type := g.typ(right_type.typ) it_type := g.typ(right_type.typ)
g.write('\t$it_type* it = ($it_type*)') g.write('\t$it_type* it = ($it_type*)')
g.expr(infix.left) g.expr(infix.left)
@ -2323,6 +2332,7 @@ fn (mut g Gen) if_expr(node ast.IfExpr) {
g.write('.') g.write('.')
} }
g.writeln('obj;') g.writeln('obj;')
g.writeln('\t$it_type* $left_expr.name = it;')
} }
g.stmts(branch.stmts) g.stmts(branch.stmts)
} }

View File

@ -110,7 +110,7 @@ fn test_nested_sumtype() {
mut a := Node{} mut a := Node{}
mut b := Node{} mut b := Node{}
a = StructDecl{pos: 1} a = StructDecl{pos: 1}
b = IfExpr {pos: 1} b = IfExpr{pos: 1}
match a { match a {
StructDecl { StructDecl {
assert true assert true
@ -127,6 +127,18 @@ fn test_nested_sumtype() {
else { else {
assert false assert false
} }
c := Node(Expr(IfExpr{pos:1}))
if c is Expr {
if c is IfExpr {
assert true
}
else {
assert false
}
}
else {
assert false
}
} }
type Abc = int | string type Abc = int | string