@@ -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
@@ -624,17 +625,28 @@ class TypeCheckExpr : public TypeCheckBase
624
625
auto else_blk_resolved
625
626
= TypeCheckExpr::Resolve (expr.get_else_block (), inside_loop);
626
627
627
- infered = if_blk_resolved->unify (else_blk_resolved);
628
+ if (if_blk_resolved->get_kind () == TyTy::NEVER)
629
+ infered = else_blk_resolved;
630
+ else if (else_blk_resolved->get_kind () == TyTy::NEVER)
631
+ infered = if_blk_resolved;
632
+ else
633
+ infered = if_blk_resolved->unify (else_blk_resolved);
628
634
}
629
635
630
636
void visit (HIR::IfExprConseqIf &expr) override
631
637
{
632
638
TypeCheckExpr::Resolve (expr.get_if_condition (), false );
633
- auto if_blk = TypeCheckExpr::Resolve (expr.get_if_block (), inside_loop);
634
- auto else_blk
639
+ auto if_blk_resolved
640
+ = TypeCheckExpr::Resolve (expr.get_if_block (), inside_loop);
641
+ auto else_blk_resolved
635
642
= TypeCheckExpr::Resolve (expr.get_conseq_if_expr (), inside_loop);
636
643
637
- infered = if_blk->unify (else_blk);
644
+ if (if_blk_resolved->get_kind () == TyTy::NEVER)
645
+ infered = else_blk_resolved;
646
+ else if (else_blk_resolved->get_kind () == TyTy::NEVER)
647
+ infered = if_blk_resolved;
648
+ else
649
+ infered = if_blk_resolved->unify (else_blk_resolved);
638
650
}
639
651
640
652
void visit (HIR::BlockExpr &expr) override ;
@@ -919,7 +931,7 @@ class TypeCheckExpr : public TypeCheckBase
919
931
context->swap_head_loop_context (unified_ty);
920
932
}
921
933
922
- infered = new TyTy::TupleType (expr.get_mappings ().get_hirid ());
934
+ infered = new TyTy::NeverType (expr.get_mappings ().get_hirid ());
923
935
}
924
936
925
937
void visit (HIR::ContinueExpr &expr) override
@@ -931,7 +943,7 @@ class TypeCheckExpr : public TypeCheckBase
931
943
return ;
932
944
}
933
945
934
- infered = new TyTy::TupleType (expr.get_mappings ().get_hirid ());
946
+ infered = new TyTy::NeverType (expr.get_mappings ().get_hirid ());
935
947
}
936
948
937
949
void visit (HIR::BorrowExpr &expr) override
0 commit comments