33use std:: {
44 iter:: { repeat, repeat_with} ,
55 mem,
6+ sync:: Arc ,
67} ;
78
89use chalk_ir:: {
@@ -15,7 +16,7 @@ use hir_def::{
1516 generics:: TypeOrConstParamData ,
1617 lang_item:: LangItem ,
1718 path:: { GenericArg , GenericArgs } ,
18- ConstParamId , FieldId , ItemContainerId , Lookup ,
19+ BlockId , ConstParamId , FieldId , ItemContainerId , Lookup ,
1920} ;
2021use hir_expand:: name:: { name, Name } ;
2122use stdx:: always;
@@ -147,19 +148,19 @@ impl<'a> InferenceContext<'a> {
147148 self . infer_top_pat ( pat, & input_ty) ;
148149 self . result . standard_types . bool_ . clone ( )
149150 }
150- Expr :: Block { statements, tail, label, id : _ } => {
151- self . infer_block ( tgt_expr, statements, * tail, * label, expected)
151+ Expr :: Block { statements, tail, label, id } => {
152+ self . infer_block ( tgt_expr, * id , statements, * tail, * label, expected)
152153 }
153- Expr :: Unsafe { id : _ , statements, tail } => {
154- self . infer_block ( tgt_expr, statements, * tail, None , expected)
154+ Expr :: Unsafe { id, statements, tail } => {
155+ self . infer_block ( tgt_expr, * id , statements, * tail, None , expected)
155156 }
156- Expr :: Const { id : _ , statements, tail } => {
157+ Expr :: Const { id, statements, tail } => {
157158 self . with_breakable_ctx ( BreakableKind :: Border , None , None , |this| {
158- this. infer_block ( tgt_expr, statements, * tail, None , expected)
159+ this. infer_block ( tgt_expr, * id , statements, * tail, None , expected)
159160 } )
160161 . 1
161162 }
162- Expr :: Async { id : _ , statements, tail } => {
163+ Expr :: Async { id, statements, tail } => {
163164 let ret_ty = self . table . new_type_var ( ) ;
164165 let prev_diverges = mem:: replace ( & mut self . diverges , Diverges :: Maybe ) ;
165166 let prev_ret_ty = mem:: replace ( & mut self . return_ty , ret_ty. clone ( ) ) ;
@@ -170,6 +171,7 @@ impl<'a> InferenceContext<'a> {
170171 self . with_breakable_ctx ( BreakableKind :: Border , None , None , |this| {
171172 this. infer_block (
172173 tgt_expr,
174+ * id,
173175 statements,
174176 * tail,
175177 None ,
@@ -394,7 +396,7 @@ impl<'a> InferenceContext<'a> {
394396 }
395397 }
396398 let trait_ = fn_x
397- . get_id ( self . db , self . trait_env . krate )
399+ . get_id ( self . db , self . table . trait_env . krate )
398400 . expect ( "We just used it" ) ;
399401 let trait_data = self . db . trait_data ( trait_) ;
400402 if let Some ( func) = trait_data. method_by_name ( & fn_x. method_name ( ) ) {
@@ -787,7 +789,7 @@ impl<'a> InferenceContext<'a> {
787789 let canonicalized = self . canonicalize ( base_ty. clone ( ) ) ;
788790 let receiver_adjustments = method_resolution:: resolve_indexing_op (
789791 self . db ,
790- self . trait_env . clone ( ) ,
792+ self . table . trait_env . clone ( ) ,
791793 canonicalized. value ,
792794 index_trait,
793795 ) ;
@@ -1205,13 +1207,19 @@ impl<'a> InferenceContext<'a> {
12051207 fn infer_block (
12061208 & mut self ,
12071209 expr : ExprId ,
1210+ block_id : Option < BlockId > ,
12081211 statements : & [ Statement ] ,
12091212 tail : Option < ExprId > ,
12101213 label : Option < LabelId > ,
12111214 expected : & Expectation ,
12121215 ) -> Ty {
12131216 let coerce_ty = expected. coercion_target_type ( & mut self . table ) ;
12141217 let g = self . resolver . update_to_inner_scope ( self . db . upcast ( ) , self . owner , expr) ;
1218+ let prev_env = block_id. map ( |block_id| {
1219+ let prev_env = self . table . trait_env . clone ( ) ;
1220+ Arc :: make_mut ( & mut self . table . trait_env ) . block = Some ( block_id) ;
1221+ prev_env
1222+ } ) ;
12151223
12161224 let ( break_ty, ty) =
12171225 self . with_breakable_ctx ( BreakableKind :: Block , Some ( coerce_ty. clone ( ) ) , label, |this| {
@@ -1300,6 +1308,9 @@ impl<'a> InferenceContext<'a> {
13001308 }
13011309 } ) ;
13021310 self . resolver . reset_to_guard ( g) ;
1311+ if let Some ( prev_env) = prev_env {
1312+ self . table . trait_env = prev_env;
1313+ }
13031314
13041315 break_ty. unwrap_or ( ty)
13051316 }
@@ -1398,7 +1409,7 @@ impl<'a> InferenceContext<'a> {
13981409 method_resolution:: lookup_method (
13991410 self . db ,
14001411 & canonicalized_receiver. value ,
1401- self . trait_env . clone ( ) ,
1412+ self . table . trait_env . clone ( ) ,
14021413 self . get_traits_in_scope ( ) . as_ref ( ) . left_or_else ( |& it| it) ,
14031414 VisibleFromModule :: Filter ( self . resolver . module ( ) ) ,
14041415 name,
@@ -1431,7 +1442,7 @@ impl<'a> InferenceContext<'a> {
14311442 let resolved = method_resolution:: lookup_method (
14321443 self . db ,
14331444 & canonicalized_receiver. value ,
1434- self . trait_env . clone ( ) ,
1445+ self . table . trait_env . clone ( ) ,
14351446 self . get_traits_in_scope ( ) . as_ref ( ) . left_or_else ( |& it| it) ,
14361447 VisibleFromModule :: Filter ( self . resolver . module ( ) ) ,
14371448 method_name,
0 commit comments