@@ -1140,8 +1140,23 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
11401140 self . insert_type_vars ( ty)
11411141 }
11421142 Expr :: Try { expr } => {
1143- let _inner_ty = self . infer_expr ( * expr, & Expectation :: none ( ) ) ;
1144- Ty :: Unknown
1143+ let inner_ty = self . infer_expr ( * expr, & Expectation :: none ( ) ) ;
1144+ let ty = match self . resolve_ops_try_ok ( ) {
1145+ Some ( ops_try_ok_alias) => {
1146+ let ty = self . new_type_var ( ) ;
1147+ let projection = ProjectionPredicate {
1148+ ty : ty. clone ( ) ,
1149+ projection_ty : ProjectionTy {
1150+ associated_ty : ops_try_ok_alias,
1151+ parameters : vec ! [ inner_ty] . into ( ) ,
1152+ } ,
1153+ } ;
1154+ self . obligations . push ( Obligation :: Projection ( projection) ) ;
1155+ self . resolve_ty_as_possible ( & mut vec ! [ ] , ty)
1156+ }
1157+ None => Ty :: Unknown ,
1158+ } ;
1159+ ty
11451160 }
11461161 Expr :: Cast { expr, type_ref } => {
11471162 let _inner_ty = self . infer_expr ( * expr, & Expectation :: none ( ) ) ;
@@ -1360,6 +1375,26 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
13601375 _ => None ,
13611376 }
13621377 }
1378+
1379+ fn resolve_ops_try_ok ( & self ) -> Option < TypeAlias > {
1380+ use crate :: name:: { OK , OPS , TRY } ;
1381+
1382+ let ops_try_path = Path {
1383+ kind : PathKind :: Abs ,
1384+ segments : vec ! [
1385+ PathSegment { name: STD , args_and_bindings: None } ,
1386+ PathSegment { name: OPS , args_and_bindings: None } ,
1387+ PathSegment { name: TRY , args_and_bindings: None } ,
1388+ ] ,
1389+ } ;
1390+
1391+ match self . resolver . resolve_path_segments ( self . db , & ops_try_path) . into_fully_resolved ( ) {
1392+ PerNs { types : Some ( Def ( Trait ( trait_) ) ) , .. } => {
1393+ Some ( trait_. associated_type_by_name ( self . db , OK ) ?)
1394+ }
1395+ _ => None ,
1396+ }
1397+ }
13631398}
13641399
13651400/// The ID of a type variable.
0 commit comments