@@ -145,16 +145,15 @@ class TypeCheckExpr : public TypeCheckBase
145
145
146
146
void visit (HIR::ReturnExpr &expr) override
147
147
{
148
- if (!expr.has_return_expr ())
149
- {
150
- infered = new TyTy::TupleType (expr.get_mappings ().get_hirid ());
151
- return ;
152
- }
153
-
154
148
auto fn_return_tyty = context->peek_return_type ();
155
149
rust_assert (fn_return_tyty != nullptr );
156
150
157
- auto expr_ty = TypeCheckExpr::Resolve (expr.get_expr (), false );
151
+ TyTy::BaseType *expr_ty;
152
+ if (expr.has_return_expr ())
153
+ expr_ty = TypeCheckExpr::Resolve (expr.get_expr (), false );
154
+ else
155
+ expr_ty = new TyTy::TupleType (expr.get_mappings ().get_hirid ());
156
+
158
157
if (expr_ty == nullptr )
159
158
{
160
159
rust_error_at (expr.get_locus (),
@@ -166,6 +165,8 @@ class TypeCheckExpr : public TypeCheckBase
166
165
fn_return_tyty->append_reference (expr_ty->get_ref ());
167
166
for (auto &ref : infered->get_combined_refs ())
168
167
fn_return_tyty->append_reference (ref);
168
+
169
+ infered = new TyTy::NeverType (expr.get_mappings ().get_hirid ());
169
170
}
170
171
171
172
void visit (HIR::CallExpr &expr) override
@@ -622,17 +623,28 @@ class TypeCheckExpr : public TypeCheckBase
622
623
auto else_blk_resolved
623
624
= TypeCheckExpr::Resolve (expr.get_else_block (), inside_loop);
624
625
625
- infered = if_blk_resolved->unify (else_blk_resolved);
626
+ if (if_blk_resolved->get_kind () == TyTy::NEVER)
627
+ infered = else_blk_resolved;
628
+ else if (else_blk_resolved->get_kind () == TyTy::NEVER)
629
+ infered = if_blk_resolved;
630
+ else
631
+ infered = if_blk_resolved->unify (else_blk_resolved);
626
632
}
627
633
628
634
void visit (HIR::IfExprConseqIf &expr) override
629
635
{
630
636
TypeCheckExpr::Resolve (expr.get_if_condition (), false );
631
- auto if_blk = TypeCheckExpr::Resolve (expr.get_if_block (), inside_loop);
632
- auto else_blk
637
+ auto if_blk_resolved
638
+ = TypeCheckExpr::Resolve (expr.get_if_block (), inside_loop);
639
+ auto else_blk_resolved
633
640
= TypeCheckExpr::Resolve (expr.get_conseq_if_expr (), inside_loop);
634
641
635
- infered = if_blk->unify (else_blk);
642
+ if (if_blk_resolved->get_kind () == TyTy::NEVER)
643
+ infered = else_blk_resolved;
644
+ else if (else_blk_resolved->get_kind () == TyTy::NEVER)
645
+ infered = if_blk_resolved;
646
+ else
647
+ infered = if_blk_resolved->unify (else_blk_resolved);
636
648
}
637
649
638
650
void visit (HIR::BlockExpr &expr) override ;
@@ -929,7 +941,7 @@ class TypeCheckExpr : public TypeCheckBase
929
941
context->swap_head_loop_context (unified_ty);
930
942
}
931
943
932
- infered = new TyTy::TupleType (expr.get_mappings ().get_hirid ());
944
+ infered = new TyTy::NeverType (expr.get_mappings ().get_hirid ());
933
945
}
934
946
935
947
void visit (HIR::ContinueExpr &expr) override
@@ -941,7 +953,7 @@ class TypeCheckExpr : public TypeCheckBase
941
953
return ;
942
954
}
943
955
944
- infered = new TyTy::TupleType (expr.get_mappings ().get_hirid ());
956
+ infered = new TyTy::NeverType (expr.get_mappings ().get_hirid ());
945
957
}
946
958
947
959
void visit (HIR::BorrowExpr &expr) override
0 commit comments