selection failure: recompute applicable impls

This commit is contained in:
lcnr 2022-10-19 17:17:19 +02:00
parent ddfe1e87f7
commit f1551bfc02
21 changed files with 166 additions and 73 deletions

View file

@ -1,3 +1,4 @@
fn main() {
let x = "hello".chars().rev().collect(); //~ ERROR E0282
let x = "hello".chars().rev().collect();
//~^ ERROR E0282
}

View file

@ -8,7 +8,9 @@ fn foo<T>(x: T) {
W: Fn()>
(y: T) { //~ ERROR E0401
}
bfnr(x); //~ ERROR type annotations needed
bfnr(x);
//~^ ERROR type annotations needed
//~| ERROR type annotations needed
}

View file

@ -21,7 +21,7 @@ LL | (y: T) {
| ^ use of generic parameter from outer function
error[E0401]: can't use generic parameters from outer function
--> $DIR/E0401.rs:22:25
--> $DIR/E0401.rs:24:25
|
LL | impl<T> Iterator for A<T> {
| ---- `Self` type implicitly declared here, by this `impl`
@ -43,7 +43,28 @@ help: consider specifying the generic arguments
LL | bfnr::<U, V, W>(x);
| +++++++++++
error: aborting due to 4 previous errors
error[E0283]: type annotations needed
--> $DIR/E0401.rs:11:5
|
LL | bfnr(x);
| ^^^^ cannot infer type of the type parameter `W` declared on the function `bfnr`
|
= note: multiple `impl`s satisfying `_: Fn<()>` found in the following crates: `alloc`, `core`:
- impl<A, F> Fn<A> for &F
where A: Tuple, F: Fn<A>, F: ?Sized;
- impl<Args, F, A> Fn<Args> for Box<F, A>
where Args: Tuple, F: Fn<Args>, A: Allocator, F: ?Sized;
note: required by a bound in `bfnr`
--> $DIR/E0401.rs:4:30
|
LL | fn bfnr<U, V: Baz<U>, W: Fn()>(y: T) {
| ^^^^ required by this bound in `bfnr`
help: consider specifying the type arguments in the function call
|
LL | bfnr::<U, V, W>(x);
| +++++++++++
Some errors have detailed explanations: E0282, E0401.
error: aborting due to 5 previous errors
Some errors have detailed explanations: E0282, E0283, E0401.
For more information about an error, try `rustc --explain E0282`.

View file

@ -30,16 +30,19 @@ fn baa(b: bool) -> impl std::fmt::Debug {
fn muh() -> Result<(), impl std::fmt::Debug> {
Err("whoops")?;
Ok(()) //~ ERROR type annotations needed
Ok(())
//~^ ERROR type annotations needed
}
fn muh2() -> Result<(), impl std::fmt::Debug> {
return Err(From::from("foo")); //~ ERROR type annotations needed
return Err(From::from("foo"));
//~^ ERROR type annotations needed
Ok(())
}
fn muh3() -> Result<(), impl std::fmt::Debug> {
Err(From::from("foo")) //~ ERROR type annotations needed
Err(From::from("foo"))
//~^ ERROR type annotations needed
}
fn main() {}

View file

@ -10,7 +10,7 @@ LL | Ok::<(), E>(())
| +++++++++
error[E0282]: type annotations needed
--> $DIR/cross-return-site-inference.rs:37:12
--> $DIR/cross-return-site-inference.rs:38:12
|
LL | return Err(From::from("foo"));
| ^^^ cannot infer type of the type parameter `E` declared on the enum `Result`
@ -21,7 +21,7 @@ LL | return Err::<(), E>(From::from("foo"));
| +++++++++
error[E0282]: type annotations needed
--> $DIR/cross-return-site-inference.rs:42:5
--> $DIR/cross-return-site-inference.rs:44:5
|
LL | Err(From::from("foo"))
| ^^^ cannot infer type of the type parameter `E` declared on the enum `Result`

View file

@ -10,6 +10,7 @@ fn main() {
let fut = async {
make_unit()?;
Ok(()) //~ ERROR type annotations needed
Ok(())
//~^ ERROR type annotations needed
};
}

View file

@ -1,6 +1,7 @@
fn main() {
let x = |a: (), b: ()| {
Err(a)?;
Ok(b) //~ ERROR type annotations needed
Ok(b)
//~^ ERROR type annotations needed
};
}

View file

@ -15,7 +15,8 @@ use std::collections::hash_map::HashMap;
fn foo(parameters: &HashMap<String, String>) -> bool {
parameters
.get(&"key".into()) //~ ERROR: type annotations needed
.get(&"key".into())
//~^ ERROR type annotations needed
.and_then(|found: &String| Some(false))
.unwrap_or(false)
}

View file

@ -18,7 +18,8 @@ pub fn main() {
}
{
if String::from("a") == "a".try_into().unwrap() {}
//~^ ERROR: type annotations needed
//~^ ERROR type annotations needed
//~| ERROR type annotations needed
}
{
let _: String = match "_".try_into() {

View file

@ -16,6 +16,22 @@ help: try using a fully qualified path to specify the expected types
LL | if String::from("a") == <&str as TryInto<T>>::try_into("a").unwrap() {}
| +++++++++++++++++++++++++++++++ ~
error: aborting due to previous error
error[E0283]: type annotations needed
--> $DIR/issue-72616.rs:20:37
|
LL | if String::from("a") == "a".try_into().unwrap() {}
| ^^^^^^^^
|
= note: multiple `impl`s satisfying `_: TryFrom<&str>` found in the following crates: `core`, `std`:
- impl<> TryFrom<&str> for std::sys_common::net::LookupHost;
- impl<T, U> TryFrom<U> for T
where U: Into<T>;
= note: required for `&str` to implement `TryInto<_>`
help: try using a fully qualified path to specify the expected types
|
LL | if String::from("a") == <&str as TryInto<T>>::try_into("a").unwrap() {}
| +++++++++++++++++++++++++++++++ ~
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0283`.

View file

@ -7,7 +7,8 @@ fn f(x: &i32) -> Result<i32, ()> {
fn g() -> Result<Vec<i32>, ()> {
let l = [1, 2, 3, 4];
l.iter().map(f).collect()? //~ ERROR type annotations needed
l.iter().map(f).collect()?
//~^ ERROR type annotations needed
}
fn main() {

View file

@ -1,5 +1,6 @@
fn main() {
let n: u32 = 1;
let mut d: u64 = 2;
d = d % n.into(); //~ ERROR type annotations needed
d = d % n.into();
//~^ ERROR type annotations needed
}

View file

@ -46,12 +46,7 @@ LL | let ips: Vec<_> = (0..100_000).map(|_| u32::from(0u32.into())).collect(
| |
| required by a bound introduced by this call
|
= note: multiple `impl`s satisfying `u32: From<_>` found in the following crates: `core`, `std`:
- impl From<Ipv4Addr> for u32;
- impl From<NonZeroU32> for u32;
- impl From<bool> for u32;
- impl From<char> for u32;
and 3 more
= note: cannot satisfy `u32: From<_>`
help: try using a fully qualified path to specify the expected types
|
LL | let ips: Vec<_> = (0..100_000).map(|_| u32::from(<u32 as Into<T>>::into(0u32))).collect();