@@ -542,7 +542,7 @@ pub struct FnCtxt<'a, 'gcx: 'a+'tcx, 'tcx: 'a> {
542
542
/// you get indicates whether any subexpression that was
543
543
/// evaluating up to and including `X` diverged.
544
544
///
545
- /// We use this flag for two purposes:
545
+ /// We currently use this flag only for diagnostic purposes:
546
546
///
547
547
/// - To warn about unreachable code: if, after processing a
548
548
/// sub-expression but before we have applied the effects of the
@@ -556,16 +556,8 @@ pub struct FnCtxt<'a, 'gcx: 'a+'tcx, 'tcx: 'a> {
556
556
/// foo();}` or `{return; 22}`, where we would warn on the
557
557
/// `foo()` or `22`.
558
558
///
559
- /// - To permit assignment into a local variable or other place
560
- /// (including the "return slot") of type `!`. This is allowed
561
- /// if **either** the type of value being assigned is `!`, which
562
- /// means the current code is dead, **or** the expression's
563
- /// diverging flag is true, which means that a diverging value was
564
- /// wrapped (e.g., `let x: ! = foo(return)`).
565
- ///
566
- /// To repeat the last point: an expression represents dead-code
567
- /// if, after checking it, **either** its type is `!` OR the
568
- /// diverges flag is set to something other than `Maybe`.
559
+ /// An expression represents dead-code if, after checking it,
560
+ /// the diverges flag is set to something other than `Maybe`.
569
561
diverges : Cell < Diverges > ,
570
562
571
563
/// Whether any child nodes have any type errors.
@@ -2999,8 +2991,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
2999
2991
& self . cause ( return_expr. span ,
3000
2992
ObligationCauseCode :: ReturnType ( return_expr. id ) ) ,
3001
2993
return_expr,
3002
- return_expr_ty,
3003
- self . diverges . get ( ) ) ;
2994
+ return_expr_ty) ;
3004
2995
}
3005
2996
3006
2997
@@ -3031,13 +3022,13 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
3031
3022
let mut coerce: DynamicCoerceMany = CoerceMany :: new ( coerce_to_ty) ;
3032
3023
3033
3024
let if_cause = self . cause ( sp, ObligationCauseCode :: IfExpression ) ;
3034
- coerce. coerce ( self , & if_cause, then_expr, then_ty, then_diverges ) ;
3025
+ coerce. coerce ( self , & if_cause, then_expr, then_ty) ;
3035
3026
3036
3027
if let Some ( else_expr) = opt_else_expr {
3037
3028
let else_ty = self . check_expr_with_expectation ( else_expr, expected) ;
3038
3029
let else_diverges = self . diverges . get ( ) ;
3039
3030
3040
- coerce. coerce ( self , & if_cause, else_expr, else_ty, else_diverges ) ;
3031
+ coerce. coerce ( self , & if_cause, else_expr, else_ty) ;
3041
3032
3042
3033
// We won't diverge unless both branches do (or the condition does).
3043
3034
self . diverges . set ( cond_diverges | then_diverges & else_diverges) ;
@@ -3722,7 +3713,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
3722
3713
}
3723
3714
hir:: ExprBreak ( destination, ref expr_opt) => {
3724
3715
if let Some ( target_id) = destination. target_id . opt_id ( ) {
3725
- let ( e_ty, e_diverges , cause) ;
3716
+ let ( e_ty, cause) ;
3726
3717
if let Some ( ref e) = * expr_opt {
3727
3718
// If this is a break with a value, we need to type-check
3728
3719
// the expression. Get an expected type from the loop context.
@@ -3741,13 +3732,11 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
3741
3732
3742
3733
// Recurse without `enclosing_breakables` borrowed.
3743
3734
e_ty = self . check_expr_with_hint ( e, coerce_to) ;
3744
- e_diverges = self . diverges . get ( ) ;
3745
3735
cause = self . misc ( e. span ) ;
3746
3736
} else {
3747
3737
// Otherwise, this is a break *without* a value. That's
3748
3738
// always legal, and is equivalent to `break ()`.
3749
3739
e_ty = tcx. mk_nil ( ) ;
3750
- e_diverges = Diverges :: Maybe ;
3751
3740
cause = self . misc ( expr. span ) ;
3752
3741
}
3753
3742
@@ -3758,7 +3747,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
3758
3747
let ctxt = enclosing_breakables. find_breakable ( target_id) ;
3759
3748
if let Some ( ref mut coerce) = ctxt. coerce {
3760
3749
if let Some ( ref e) = * expr_opt {
3761
- coerce. coerce ( self , & cause, e, e_ty, e_diverges ) ;
3750
+ coerce. coerce ( self , & cause, e, e_ty) ;
3762
3751
} else {
3763
3752
assert ! ( e_ty. is_nil( ) ) ;
3764
3753
coerce. coerce_forced_unit ( self , & cause, & mut |_| ( ) , true ) ;
@@ -3964,7 +3953,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
3964
3953
for e in args {
3965
3954
let e_ty = self . check_expr_with_hint ( e, coerce_to) ;
3966
3955
let cause = self . misc ( e. span ) ;
3967
- coerce. coerce ( self , & cause, e, e_ty, self . diverges . get ( ) ) ;
3956
+ coerce. coerce ( self , & cause, e, e_ty) ;
3968
3957
}
3969
3958
coerce. complete ( self )
3970
3959
} else {
@@ -4375,8 +4364,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
4375
4364
coerce. coerce ( self ,
4376
4365
& cause,
4377
4366
tail_expr,
4378
- tail_expr_ty,
4379
- self . diverges . get ( ) ) ;
4367
+ tail_expr_ty) ;
4380
4368
} else {
4381
4369
// Subtle: if there is no explicit tail expression,
4382
4370
// that is typically equivalent to a tail expression
0 commit comments