checker: allow noreturn in if expr (#12462)
							parent
							
								
									d8479f107f
								
							
						
					
					
						commit
						5e75c89b71
					
				|  | @ -6870,6 +6870,10 @@ pub fn (mut c Checker) if_expr(mut node ast.IfExpr) ast.Type { | ||||||
| 						&& c.table.get_type_symbol(former_expected_type).kind == .sum_type { | 						&& c.table.get_type_symbol(former_expected_type).kind == .sum_type { | ||||||
| 						continue | 						continue | ||||||
| 					} | 					} | ||||||
|  | 					if is_noreturn_callexpr(last_expr.expr) { | ||||||
|  | 						continue | ||||||
|  | 					} | ||||||
|  | 
 | ||||||
| 					c.error('mismatched types `${c.table.type_to_str(node.typ)}` and `${c.table.type_to_str(last_expr.typ)}`', | 					c.error('mismatched types `${c.table.type_to_str(node.typ)}` and `${c.table.type_to_str(last_expr.typ)}`', | ||||||
| 						node.pos) | 						node.pos) | ||||||
| 				} | 				} | ||||||
|  |  | ||||||
|  | @ -5159,6 +5159,9 @@ fn (mut g Gen) need_tmp_var_in_if(node ast.IfExpr) bool { | ||||||
| 			if branch.stmts.len == 1 { | 			if branch.stmts.len == 1 { | ||||||
| 				if branch.stmts[0] is ast.ExprStmt { | 				if branch.stmts[0] is ast.ExprStmt { | ||||||
| 					stmt := branch.stmts[0] as ast.ExprStmt | 					stmt := branch.stmts[0] as ast.ExprStmt | ||||||
|  | 					if is_noreturn_callexpr(stmt.expr) { | ||||||
|  | 						return true | ||||||
|  | 					} | ||||||
| 					if stmt.expr is ast.CallExpr { | 					if stmt.expr is ast.CallExpr { | ||||||
| 						if stmt.expr.is_method { | 						if stmt.expr.is_method { | ||||||
| 							left_sym := g.table.get_type_symbol(stmt.expr.receiver_type) | 							left_sym := g.table.get_type_symbol(stmt.expr.receiver_type) | ||||||
|  |  | ||||||
|  | @ -234,3 +234,32 @@ fn test_if_expr_with_or_block() { | ||||||
| 	a := if arr.len == 0 || arr[0] == '-' { 123 } else { return_optional() or { -1 } } | 	a := if arr.len == 0 || arr[0] == '-' { 123 } else { return_optional() or { -1 } } | ||||||
| 	assert a == 1 | 	assert a == 1 | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | type Num = f32 | f64 | i64 | int | ||||||
|  | 
 | ||||||
|  | [noreturn] | ||||||
|  | fn assert_false_noreturn() { | ||||||
|  | 	assert false | ||||||
|  | 	exit(1) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn test_noreturn() { | ||||||
|  | 	n := Num(int(0)) | ||||||
|  | 	_ := if n is int { | ||||||
|  | 		n | ||||||
|  | 	} else if n is f32 { | ||||||
|  | 		int(n) | ||||||
|  | 	} else { | ||||||
|  | 		exit(1) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	_ := if 1 == 0 { | ||||||
|  | 		0 | ||||||
|  | 	} else if 1 == 1 { | ||||||
|  | 		1 | ||||||
|  | 	} else if 1 == 2 { | ||||||
|  | 		panic('err') | ||||||
|  | 	} else { | ||||||
|  | 		assert_false_noreturn() | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue