parent
							
								
									9f9d24d616
								
							
						
					
					
						commit
						5e98ea12c8
					
				|  | @ -204,6 +204,7 @@ pub fn (mut c Checker) if_expr(mut node ast.IfExpr) ast.Type { | |||
| 						} | ||||
| 					} | ||||
| 					if node.is_expr && c.table.sym(former_expected_type).kind == .sum_type { | ||||
| 						node.typ = former_expected_type | ||||
| 						continue | ||||
| 					} | ||||
| 					if is_noreturn_callexpr(last_expr.expr) { | ||||
|  |  | |||
|  | @ -74,7 +74,12 @@ fn (mut g Gen) if_expr(node ast.IfExpr) { | |||
| 				g.expr(branch.cond) | ||||
| 				g.write(' ? ') | ||||
| 			} | ||||
| 			prev_expected_cast_type := g.expected_cast_type | ||||
| 			if node.is_expr && g.table.sym(node.typ).kind == .sum_type { | ||||
| 				g.expected_cast_type = node.typ | ||||
| 			} | ||||
| 			g.stmts(branch.stmts) | ||||
| 			g.expected_cast_type = prev_expected_cast_type | ||||
| 		} | ||||
| 		if node.branches.len == 1 { | ||||
| 			g.write(': 0') | ||||
|  | @ -195,11 +200,12 @@ fn (mut g Gen) if_expr(node ast.IfExpr) { | |||
| 			} | ||||
| 		} | ||||
| 		if needs_tmp_var { | ||||
| 			prev_expected_cast_type := g.expected_cast_type | ||||
| 			if node.is_expr && g.table.sym(node.typ).kind == .sum_type { | ||||
| 				g.expected_cast_type = node.typ | ||||
| 			} | ||||
| 			g.stmts_with_tmp_var(branch.stmts, tmp) | ||||
| 			g.expected_cast_type = 0 | ||||
| 			g.expected_cast_type = prev_expected_cast_type | ||||
| 		} else { | ||||
| 			// restore if_expr stmt header pos
 | ||||
| 			stmt_pos := g.nth_stmt_pos(0) | ||||
|  |  | |||
|  | @ -0,0 +1,17 @@ | |||
| type Opt<T> = None<T> | Some<T> | ||||
| 
 | ||||
| struct None<T> {} | ||||
| 
 | ||||
| struct Some<T> { | ||||
| mut: | ||||
| 	value T | ||||
| } | ||||
| 
 | ||||
| fn operation(r int) Opt<int> { | ||||
| 	return if r > 0 { Some<int>{r} } else { None<int>{} } | ||||
| } | ||||
| 
 | ||||
| fn test_if_expr_with_generic_sumtype() { | ||||
| 	op := operation(1) | ||||
| 	assert Opt<int>(Some<int>{1}) == op | ||||
| } | ||||
		Loading…
	
		Reference in New Issue