@@ -84,14 +84,38 @@ impl<'a> InferenceContext<'a> {
84
84
}
85
85
}
86
86
87
+ pub ( super ) fn infer_expr_coerce_never ( & mut self , expr : ExprId , expected : & Expectation ) -> Ty {
88
+ let ty = self . infer_expr_inner ( expr, expected) ;
89
+ // While we don't allow *arbitrary* coercions here, we *do* allow
90
+ // coercions from ! to `expected`.
91
+ if ty. is_never ( ) {
92
+ if let Some ( adjustments) = self . result . expr_adjustments . get ( & expr) {
93
+ return if let [ Adjustment { kind : Adjust :: NeverToAny , target } ] = & * * adjustments {
94
+ target. clone ( )
95
+ } else {
96
+ self . err_ty ( )
97
+ } ;
98
+ }
99
+
100
+ let adj_ty = self . table . new_type_var ( ) ;
101
+ self . write_expr_adj (
102
+ expr,
103
+ vec ! [ Adjustment { kind: Adjust :: NeverToAny , target: adj_ty. clone( ) } ] ,
104
+ ) ;
105
+ adj_ty
106
+ } else {
107
+ ty
108
+ }
109
+ }
110
+
87
111
fn infer_expr_inner ( & mut self , tgt_expr : ExprId , expected : & Expectation ) -> Ty {
88
112
self . db . unwind_if_cancelled ( ) ;
89
113
90
114
let ty = match & self . body [ tgt_expr] {
91
115
Expr :: Missing => self . err_ty ( ) ,
92
116
& Expr :: If { condition, then_branch, else_branch } => {
93
117
let expected = & expected. adjust_for_branches ( & mut self . table ) ;
94
- self . infer_expr (
118
+ self . infer_expr_coerce_never (
95
119
condition,
96
120
& Expectation :: HasType ( self . result . standard_types . bool_ . clone ( ) ) ,
97
121
) ;
@@ -415,7 +439,7 @@ impl<'a> InferenceContext<'a> {
415
439
for arm in arms. iter ( ) {
416
440
if let Some ( guard_expr) = arm. guard {
417
441
self . diverges = Diverges :: Maybe ;
418
- self . infer_expr (
442
+ self . infer_expr_coerce_never (
419
443
guard_expr,
420
444
& Expectation :: HasType ( self . result . standard_types . bool_ . clone ( ) ) ,
421
445
) ;
@@ -1146,7 +1170,6 @@ impl<'a> InferenceContext<'a> {
1146
1170
let coerce_ty = expected. coercion_target_type ( & mut self . table ) ;
1147
1171
let old_resolver =
1148
1172
mem:: replace ( & mut self . resolver , resolver_for_expr ( self . db . upcast ( ) , self . owner , expr) ) ;
1149
-
1150
1173
let ( break_ty, ty) =
1151
1174
self . with_breakable_ctx ( BreakableKind :: Block , Some ( coerce_ty. clone ( ) ) , label, |this| {
1152
1175
for stmt in statements {
@@ -1188,14 +1211,14 @@ impl<'a> InferenceContext<'a> {
1188
1211
}
1189
1212
}
1190
1213
& Statement :: Expr { expr, has_semi } => {
1191
- this . infer_expr (
1192
- expr,
1193
- & if has_semi {
1194
- Expectation :: none ( )
1195
- } else {
1196
- Expectation :: HasType ( this. result . standard_types . unit . clone ( ) )
1197
- } ,
1198
- ) ;
1214
+ if has_semi {
1215
+ this . infer_expr ( expr, & Expectation :: none ( ) ) ;
1216
+ } else {
1217
+ this . infer_expr_coerce (
1218
+ expr ,
1219
+ & Expectation :: HasType ( this. result . standard_types . unit . clone ( ) ) ,
1220
+ ) ;
1221
+ }
1199
1222
}
1200
1223
}
1201
1224
}
0 commit comments