aboutsummaryrefslogtreecommitdiff
path: root/crates/hir_ty/src/tests/traits.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/hir_ty/src/tests/traits.rs')
-rw-r--r--crates/hir_ty/src/tests/traits.rs31
1 files changed, 23 insertions, 8 deletions
diff --git a/crates/hir_ty/src/tests/traits.rs b/crates/hir_ty/src/tests/traits.rs
index 7c0ff2170..49add4ab9 100644
--- a/crates/hir_ty/src/tests/traits.rs
+++ b/crates/hir_ty/src/tests/traits.rs
@@ -161,7 +161,7 @@ mod result {
161} 161}
162 162
163#[test] 163#[test]
164fn infer_tryv2() { 164fn infer_try_trait_v2() {
165 check_types( 165 check_types(
166 r#" 166 r#"
167//- /main.rs crate:main deps:core 167//- /main.rs crate:main deps:core
@@ -172,26 +172,41 @@ fn test() {
172} //^ i32 172} //^ i32
173 173
174//- /core.rs crate:core 174//- /core.rs crate:core
175#[prelude_import] use ops::*;
176mod ops { 175mod ops {
177 trait Try { 176 mod try_trait {
178 type Output; 177 pub trait Try: FromResidual {
179 type Residual; 178 type Output;
179 type Residual;
180 }
181 pub trait FromResidual<R = <Self as Try>::Residual> {}
180 } 182 }
183
184 pub use self::try_trait::FromResidual;
185 pub use self::try_trait::Try;
186}
187
188mov convert {
189 pub trait From<T> {}
190 impl<T> From<T> for T {}
181} 191}
182 192
183#[prelude_import] use result::*; 193#[prelude_import] use result::*;
184mod result { 194mod result {
185 enum Infallible {} 195 use crate::convert::From;
186 enum Result<O, E> { 196 use crate::ops::{Try, FromResidual};
197
198 pub enum Infallible {}
199 pub enum Result<O, E> {
187 Ok(O), 200 Ok(O),
188 Err(E) 201 Err(E)
189 } 202 }
190 203
191 impl<O, E> crate::ops::Try for Result<O, E> { 204 impl<O, E> Try for Result<O, E> {
192 type Output = O; 205 type Output = O;
193 type Error = Result<Infallible, E>; 206 type Error = Result<Infallible, E>;
194 } 207 }
208
209 impl<T, E, F: From<E>> FromResidual<Result<Infallible, E>> for Result<T, F> {}
195} 210}
196"#, 211"#,
197 ); 212 );