@@ -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.
@@ -3002,8 +2994,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
30022994 & self . cause ( return_expr. span ,
30032995 ObligationCauseCode :: ReturnType ( return_expr. id ) ) ,
30042996 return_expr,
3005- return_expr_ty,
3006- self . diverges . get ( ) ) ;
2997+ return_expr_ty) ;
30072998 }
30082999
30093000
@@ -3034,13 +3025,13 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
30343025 let mut coerce: DynamicCoerceMany = CoerceMany :: new ( coerce_to_ty) ;
30353026
30363027 let if_cause = self . cause ( sp, ObligationCauseCode :: IfExpression ) ;
3037- coerce. coerce ( self , & if_cause, then_expr, then_ty, then_diverges ) ;
3028+ coerce. coerce ( self , & if_cause, then_expr, then_ty) ;
30383029
30393030 if let Some ( else_expr) = opt_else_expr {
30403031 let else_ty = self . check_expr_with_expectation ( else_expr, expected) ;
30413032 let else_diverges = self . diverges . get ( ) ;
30423033
3043- coerce. coerce ( self , & if_cause, else_expr, else_ty, else_diverges ) ;
3034+ coerce. coerce ( self , & if_cause, else_expr, else_ty) ;
30443035
30453036 // We won't diverge unless both branches do (or the condition does).
30463037 self . diverges . set ( cond_diverges | then_diverges & else_diverges) ;
@@ -3733,7 +3724,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
37333724 }
37343725 hir:: ExprBreak ( destination, ref expr_opt) => {
37353726 if let Some ( target_id) = destination. target_id . opt_id ( ) {
3736- let ( e_ty, e_diverges , cause) ;
3727+ let ( e_ty, cause) ;
37373728 if let Some ( ref e) = * expr_opt {
37383729 // If this is a break with a value, we need to type-check
37393730 // the expression. Get an expected type from the loop context.
@@ -3752,13 +3743,11 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
37523743
37533744 // Recurse without `enclosing_breakables` borrowed.
37543745 e_ty = self . check_expr_with_hint ( e, coerce_to) ;
3755- e_diverges = self . diverges . get ( ) ;
37563746 cause = self . misc ( e. span ) ;
37573747 } else {
37583748 // Otherwise, this is a break *without* a value. That's
37593749 // always legal, and is equivalent to `break ()`.
37603750 e_ty = tcx. mk_nil ( ) ;
3761- e_diverges = Diverges :: Maybe ;
37623751 cause = self . misc ( expr. span ) ;
37633752 }
37643753
@@ -3769,7 +3758,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
37693758 let ctxt = enclosing_breakables. find_breakable ( target_id) ;
37703759 if let Some ( ref mut coerce) = ctxt. coerce {
37713760 if let Some ( ref e) = * expr_opt {
3772- coerce. coerce ( self , & cause, e, e_ty, e_diverges ) ;
3761+ coerce. coerce ( self , & cause, e, e_ty) ;
37733762 } else {
37743763 assert ! ( e_ty. is_nil( ) ) ;
37753764 coerce. coerce_forced_unit ( self , & cause, & mut |_| ( ) , true ) ;
@@ -3975,7 +3964,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
39753964 for e in args {
39763965 let e_ty = self . check_expr_with_hint ( e, coerce_to) ;
39773966 let cause = self . misc ( e. span ) ;
3978- coerce. coerce ( self , & cause, e, e_ty, self . diverges . get ( ) ) ;
3967+ coerce. coerce ( self , & cause, e, e_ty) ;
39793968 }
39803969 coerce. complete ( self )
39813970 } else {
@@ -4386,8 +4375,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
43864375 coerce. coerce ( self ,
43874376 & cause,
43884377 tail_expr,
4389- tail_expr_ty,
4390- self . diverges . get ( ) ) ;
4378+ tail_expr_ty) ;
43914379 } else {
43924380 // Subtle: if there is no explicit tail expression,
43934381 // that is typically equivalent to a tail expression
0 commit comments