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