@@ -558,7 +558,7 @@ impl<'a> InferenceContext<'a> {
558
558
}
559
559
. intern ( Interner )
560
560
}
561
- & Expr :: Box { expr } => self . infer_expr_box ( expr) ,
561
+ & Expr :: Box { expr } => self . infer_expr_box ( expr, expected ) ,
562
562
Expr :: UnaryOp { expr, op } => {
563
563
let inner_ty = self . infer_expr_inner ( * expr, & Expectation :: none ( ) ) ;
564
564
let inner_ty = self . resolve_ty_shallow ( & inner_ty) ;
@@ -786,10 +786,23 @@ impl<'a> InferenceContext<'a> {
786
786
ty
787
787
}
788
788
789
- fn infer_expr_box ( & mut self , inner_expr : ExprId ) -> chalk_ir:: Ty < Interner > {
790
- let inner_ty = self . infer_expr_inner ( inner_expr, & Expectation :: none ( ) ) ;
791
- if let Some ( box_) = self . resolve_boxed_box ( ) {
792
- TyBuilder :: adt ( self . db , box_)
789
+ fn infer_expr_box ( & mut self , inner_expr : ExprId , expected : & Expectation ) -> Ty {
790
+ if let Some ( box_id) = self . resolve_boxed_box ( ) {
791
+ let table = & mut self . table ;
792
+ let inner_exp = expected
793
+ . to_option ( table)
794
+ . as_ref ( )
795
+ . map ( |e| e. as_adt ( ) )
796
+ . flatten ( )
797
+ . filter ( |( e_adt, _) | e_adt == & box_id)
798
+ . map ( |( _, subts) | {
799
+ let g = subts. at ( Interner , 0 ) ;
800
+ Expectation :: rvalue_hint ( table, Ty :: clone ( g. assert_ty_ref ( Interner ) ) )
801
+ } )
802
+ . unwrap_or_else ( Expectation :: none) ;
803
+
804
+ let inner_ty = self . infer_expr_inner ( inner_expr, & inner_exp) ;
805
+ TyBuilder :: adt ( self . db , box_id)
793
806
. push ( inner_ty)
794
807
. fill_with_defaults ( self . db , || self . table . new_type_var ( ) )
795
808
. build ( )
0 commit comments