checker: fail if else isn't the last branch of match
							parent
							
								
									0c63f5c80d
								
							
						
					
					
						commit
						86402204a7
					
				|  | @ -1355,7 +1355,17 @@ pub fn (c mut Checker) match_expr(node mut ast.MatchExpr) table.Type { | |||
| 		} | ||||
| 		else {} | ||||
| 	} | ||||
| 	if !node.branches[node.branches.len - 1].is_else { | ||||
| 	mut has_else := node.branches[node.branches.len - 1].is_else | ||||
| 	if !has_else { | ||||
| 		for i, branch in node.branches { | ||||
| 			if branch.is_else && i != node.branches.len - 1 { | ||||
| 				c.error('`else` must be the last branch of `match`', branch.pos) | ||||
| 				has_else = true | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		if !has_else { | ||||
| 			mut used_values_count := 0 | ||||
| 			for bi, branch in node.branches { | ||||
| 				used_values_count += branch.exprs.len | ||||
|  | @ -1419,6 +1429,7 @@ pub fn (c mut Checker) match_expr(node mut ast.MatchExpr) table.Type { | |||
| 				c.error(err_details, node.pos) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	c.expected_type = cond_type | ||||
| 	mut ret_type := table.void_type | ||||
| 	for branch in node.branches { | ||||
|  |  | |||
|  | @ -0,0 +1,7 @@ | |||
| vlib/v/checker/tests/inout/match_else_last_expr.v:4:3: error: `else` must be the last branch of `match` | ||||
|     2|     match 1 { | ||||
|     3|         1 { println('1') } | ||||
|     4|         else { println('else') } | ||||
|                ~~~~~~ | ||||
|     5|         4 { println('4') } | ||||
|     6|     } | ||||
|  | @ -0,0 +1,7 @@ | |||
| fn main() { | ||||
| 	match 1 { | ||||
| 		1 { println('1') } | ||||
| 		else { println('else') } | ||||
| 		4 { println('4') } | ||||
| 	} | ||||
| } | ||||
|  | @ -1919,8 +1919,8 @@ fn (p mut Parser) match_expr() ast.MatchExpr { | |||
| 		// p.warn('match block')
 | ||||
| 		stmts := p.parse_block() | ||||
| 		pos := token.Position{ | ||||
| 			line_nr: match_first_pos.line_nr | ||||
| 			pos: match_first_pos.pos | ||||
| 			line_nr: branch_first_pos.line_nr | ||||
| 			pos: branch_first_pos.pos | ||||
| 			len: branch_last_pos.pos - branch_first_pos.pos + branch_last_pos.len | ||||
| 		} | ||||
| 		branches << ast.MatchBranch{ | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue