checker: error on ternary if type mismatch
parent
54d1a29267
commit
f6d74c8a37
|
@ -157,7 +157,7 @@ fn (d mut DenseArray) zeros_to_end() {
|
||||||
}
|
}
|
||||||
d.deletes = 0
|
d.deletes = 0
|
||||||
d.size = count
|
d.size = count
|
||||||
d.cap = if count < 8 { 8 } else { count }
|
d.cap = if count < 8 { u32(8) } else { count }
|
||||||
d.data = &KeyValue(C.realloc(d.data, sizeof(KeyValue) * d.cap))
|
d.data = &KeyValue(C.realloc(d.data, sizeof(KeyValue) * d.cap))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1827,6 +1827,8 @@ pub fn (mut c Checker) if_expr(node mut ast.IfExpr) table.Type {
|
||||||
node.is_expr = true
|
node.is_expr = true
|
||||||
}
|
}
|
||||||
node.typ = table.void_type
|
node.typ = table.void_type
|
||||||
|
mut first_typ := 0
|
||||||
|
is_ternary := node.is_expr && node.branches.len >= 2 && node.has_else
|
||||||
for i, branch in node.branches {
|
for i, branch in node.branches {
|
||||||
if branch.cond is ast.ParExpr {
|
if branch.cond is ast.ParExpr {
|
||||||
c.error('unnecessary `()` in an if condition. use `if expr {` instead of `if (expr) {`.',
|
c.error('unnecessary `()` in an if condition. use `if expr {` instead of `if (expr) {`.',
|
||||||
|
@ -1840,6 +1842,13 @@ pub fn (mut c Checker) if_expr(node mut ast.IfExpr) table.Type {
|
||||||
c.error('non-bool (`$typ_sym.name`) used as if condition', node.pos)
|
c.error('non-bool (`$typ_sym.name`) used as if condition', node.pos)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if is_ternary && i < node.branches.len - 1 && branch.stmts.len > 0 {
|
||||||
|
last_stmt := branch.stmts[branch.stmts.len - 1]
|
||||||
|
if last_stmt is ast.ExprStmt {
|
||||||
|
last_expr := last_stmt as ast.ExprStmt
|
||||||
|
first_typ = c.expr(last_expr.expr)
|
||||||
|
}
|
||||||
|
}
|
||||||
c.stmts(branch.stmts)
|
c.stmts(branch.stmts)
|
||||||
}
|
}
|
||||||
if node.has_else && node.is_expr {
|
if node.has_else && node.is_expr {
|
||||||
|
@ -1850,6 +1859,9 @@ pub fn (mut c Checker) if_expr(node mut ast.IfExpr) table.Type {
|
||||||
// type_sym := p.table.get_type_symbol(it.typ)
|
// type_sym := p.table.get_type_symbol(it.typ)
|
||||||
// p.warn('if expr ret $type_sym.name')
|
// p.warn('if expr ret $type_sym.name')
|
||||||
t := c.expr(it.expr)
|
t := c.expr(it.expr)
|
||||||
|
if is_ternary && t != first_typ {
|
||||||
|
c.error('mismatched types `${c.table.type_to_str(first_typ)}` and `${c.table.type_to_str(t)}`', node.pos)
|
||||||
|
}
|
||||||
node.typ = t
|
node.typ = t
|
||||||
return t
|
return t
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
vlib/v/checker/tests/ternary_mismatch.v:2:7: error: mismatched types `string` and `int`
|
||||||
|
1| fn main() {
|
||||||
|
2| s := if true { '12' } else { 12 }
|
||||||
|
~~
|
||||||
|
3| println(s)
|
||||||
|
4| }
|
|
@ -0,0 +1,4 @@
|
||||||
|
fn main() {
|
||||||
|
s := if true { '12' } else { 12 }
|
||||||
|
println(s)
|
||||||
|
}
|
Loading…
Reference in New Issue