]> git.lizzy.rs Git - rust.git/commitdiff
Fix type inference not working for new Try trait
authorLukas Wirth <lukastw97@gmail.com>
Tue, 25 May 2021 12:59:54 +0000 (14:59 +0200)
committerLukas Wirth <lukastw97@gmail.com>
Tue, 25 May 2021 12:59:54 +0000 (14:59 +0200)
crates/hir_ty/src/infer.rs
crates/hir_ty/src/tests/traits.rs

index db3c937ff5e780f576a6d59d119b7e73397cc82a..edb65622f19c55d92aadf66c73902845a666f85c 100644 (file)
@@ -580,7 +580,10 @@ fn resolve_into_iter_item(&self) -> Option<TypeAliasId> {
     fn resolve_ops_try_ok(&self) -> Option<TypeAliasId> {
         let path = path![core::ops::Try];
         let trait_ = self.resolver.resolve_known_trait(self.db.upcast(), &path)?;
-        self.db.trait_data(trait_).associated_type_by_name(&name![Ok])
+        let trait_data = self.db.trait_data(trait_);
+        trait_data
+            .associated_type_by_name(&name![Ok])
+            .or_else(|| trait_data.associated_type_by_name(&name![Output]))
     }
 
     fn resolve_ops_neg_output(&self) -> Option<TypeAliasId> {
index a5a2df54cb69a92d881e2e692be58a86647a703f..71905baeb11fecec363cb94605669c768200a169 100644 (file)
@@ -160,6 +160,43 @@ impl<O, E> crate::ops::Try for Result<O, E> {
     );
 }
 
+#[test]
+fn infer_tryv2() {
+    check_types(
+        r#"
+//- /main.rs crate:main deps:core
+fn test() {
+    let r: Result<i32, u64> = Result::Ok(1);
+    let v = r?;
+    v;
+} //^ i32
+
+//- /core.rs crate:core
+#[prelude_import] use ops::*;
+mod ops {
+    trait Try {
+        type Output;
+        type Residual;
+    }
+}
+
+#[prelude_import] use result::*;
+mod result {
+    enum Infallible {}
+    enum Result<O, E> {
+        Ok(O),
+        Err(E)
+    }
+
+    impl<O, E> crate::ops::Try for Result<O, E> {
+        type Output = O;
+        type Error = Result<Infallible, E>;
+    }
+}
+"#,
+    );
+}
+
 #[test]
 fn infer_for_loop() {
     check_types(