Fix type inference not working for new Try trait

This commit is contained in:
Lukas Wirth 2021-05-25 14:59:54 +02:00
parent 835cf55887
commit 3ee4e6c54c
2 changed files with 41 additions and 1 deletions

View File

@ -580,7 +580,10 @@ impl<'a> InferenceContext<'a> {
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> {

View File

@ -160,6 +160,43 @@ mod result {
);
}
#[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(