@@ -542,7 +542,7 @@ pub struct FnCtxt<'a, 'gcx: 'a+'tcx, 'tcx: 'a> {
542542 /// you get indicates whether any subexpression that was
543543 /// evaluating up to and including `X` diverged.
544544 ///
545- /// We use this flag for two purposes:
545+ /// We currently use this flag only for diagnostic purposes:
546546 ///
547547 /// - To warn about unreachable code: if, after processing a
548548 /// sub-expression but before we have applied the effects of the
@@ -556,16 +556,8 @@ pub struct FnCtxt<'a, 'gcx: 'a+'tcx, 'tcx: 'a> {
556556 /// foo();}` or `{return; 22}`, where we would warn on the
557557 /// `foo()` or `22`.
558558 ///
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`.
569561 diverges : Cell < Diverges > ,
570562
571563 /// Whether any child nodes have any type errors.
@@ -2999,8 +2991,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
29992991 & self . cause ( return_expr. span ,
30002992 ObligationCauseCode :: ReturnType ( return_expr. id ) ) ,
30012993 return_expr,
3002- return_expr_ty,
3003- self . diverges . get ( ) ) ;
2994+ return_expr_ty) ;
30042995 }
30052996
30062997
@@ -3031,13 +3022,13 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
30313022 let mut coerce: DynamicCoerceMany = CoerceMany :: new ( coerce_to_ty) ;
30323023
30333024 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) ;
30353026
30363027 if let Some ( else_expr) = opt_else_expr {
30373028 let else_ty = self . check_expr_with_expectation ( else_expr, expected) ;
30383029 let else_diverges = self . diverges . get ( ) ;
30393030
3040- coerce. coerce ( self , & if_cause, else_expr, else_ty, else_diverges ) ;
3031+ coerce. coerce ( self , & if_cause, else_expr, else_ty) ;
30413032
30423033 // We won't diverge unless both branches do (or the condition does).
30433034 self . diverges . set ( cond_diverges | then_diverges & else_diverges) ;
@@ -3722,7 +3713,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
37223713 }
37233714 hir:: ExprBreak ( destination, ref expr_opt) => {
37243715 if let Some ( target_id) = destination. target_id . opt_id ( ) {
3725- let ( e_ty, e_diverges , cause) ;
3716+ let ( e_ty, cause) ;
37263717 if let Some ( ref e) = * expr_opt {
37273718 // If this is a break with a value, we need to type-check
37283719 // the expression. Get an expected type from the loop context.
@@ -3741,13 +3732,11 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
37413732
37423733 // Recurse without `enclosing_breakables` borrowed.
37433734 e_ty = self . check_expr_with_hint ( e, coerce_to) ;
3744- e_diverges = self . diverges . get ( ) ;
37453735 cause = self . misc ( e. span ) ;
37463736 } else {
37473737 // Otherwise, this is a break *without* a value. That's
37483738 // always legal, and is equivalent to `break ()`.
37493739 e_ty = tcx. mk_nil ( ) ;
3750- e_diverges = Diverges :: Maybe ;
37513740 cause = self . misc ( expr. span ) ;
37523741 }
37533742
@@ -3758,7 +3747,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
37583747 let ctxt = enclosing_breakables. find_breakable ( target_id) ;
37593748 if let Some ( ref mut coerce) = ctxt. coerce {
37603749 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) ;
37623751 } else {
37633752 assert ! ( e_ty. is_nil( ) ) ;
37643753 coerce. coerce_forced_unit ( self , & cause, & mut |_| ( ) , true ) ;
@@ -3964,7 +3953,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
39643953 for e in args {
39653954 let e_ty = self . check_expr_with_hint ( e, coerce_to) ;
39663955 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) ;
39683957 }
39693958 coerce. complete ( self )
39703959 } else {
@@ -4375,8 +4364,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
43754364 coerce. coerce ( self ,
43764365 & cause,
43774366 tail_expr,
4378- tail_expr_ty,
4379- self . diverges . get ( ) ) ;
4367+ tail_expr_ty) ;
43804368 } else {
43814369 // Subtle: if there is no explicit tail expression,
43824370 // that is typically equivalent to a tail expression
0 commit comments