@@ -3291,10 +3291,35 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
3291
3291
lvalue_pref : LvaluePreference ) -> Ty < ' tcx > {
3292
3292
debug ! ( ">> typechecking: expr={:?} expected={:?}" ,
3293
3293
expr, expected) ;
3294
+ let ty = self . check_expr_kind ( expr, expected, lvalue_pref) ;
3294
3295
3296
+ self . write_ty ( expr. id , ty) ;
3297
+
3298
+ debug ! ( "type of expr({}) {} is..." , expr. id,
3299
+ pprust:: expr_to_string( expr) ) ;
3300
+ debug ! ( "... {:?}, expected is {:?}" ,
3301
+ ty,
3302
+ expected) ;
3303
+
3304
+ // Add adjustments to !-expressions
3305
+ if ty. is_never ( ) {
3306
+ if let Some ( hir:: map:: NodeExpr ( _) ) = self . tcx . map . find ( expr. id ) {
3307
+ let adj_ty = self . next_diverging_ty_var ( ) ;
3308
+ let adj = adjustment:: AdjustNeverToAny ( adj_ty) ;
3309
+ self . write_adjustment ( expr. id , adj) ;
3310
+ return adj_ty;
3311
+ }
3312
+ }
3313
+ ty
3314
+ }
3315
+
3316
+ fn check_expr_kind ( & self ,
3317
+ expr : & ' gcx hir:: Expr ,
3318
+ expected : Expectation < ' tcx > ,
3319
+ lvalue_pref : LvaluePreference ) -> Ty < ' tcx > {
3295
3320
let tcx = self . tcx ;
3296
3321
let id = expr. id ;
3297
- let ty = match expr. node {
3322
+ match expr. node {
3298
3323
hir:: ExprBox ( ref subexpr) => {
3299
3324
let expected_inner = expected. to_option ( self ) . map_or ( NoExpectation , |ty| {
3300
3325
match ty. sty {
@@ -3723,25 +3748,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
3723
3748
}
3724
3749
}
3725
3750
}
3726
- } ;
3727
- self . write_ty ( id, ty) ;
3728
-
3729
- debug ! ( "type of expr({}) {} is..." , expr. id,
3730
- pprust:: expr_to_string( expr) ) ;
3731
- debug ! ( "... {:?}, expected is {:?}" ,
3732
- ty,
3733
- expected) ;
3734
-
3735
- // Add adjustments to !-expressions
3736
- if ty. is_never ( ) {
3737
- if let Some ( hir:: map:: NodeExpr ( _) ) = self . tcx . map . find ( id) {
3738
- let adj_ty = self . next_diverging_ty_var ( ) ;
3739
- let adj = adjustment:: AdjustNeverToAny ( adj_ty) ;
3740
- self . write_adjustment ( id, adj) ;
3741
- return adj_ty;
3742
- }
3743
3751
}
3744
- ty
3745
3752
}
3746
3753
3747
3754
// Finish resolving a path in a struct expression or pattern `S::A { .. }` if necessary.
0 commit comments