account for self type when looking for source of unsolved ty var
This commit is contained in:
parent
480068c235
commit
b904ce94a2
@ -1191,11 +1191,14 @@ impl<'a, 'tcx> Visitor<'tcx> for FindInferSourceVisitor<'a, 'tcx> {
|
|||||||
have_turbofish,
|
have_turbofish,
|
||||||
} = args;
|
} = args;
|
||||||
let generics = tcx.generics_of(generics_def_id);
|
let generics = tcx.generics_of(generics_def_id);
|
||||||
if let Some(argument_index) = generics
|
if let Some(mut argument_index) = generics
|
||||||
.own_substs(substs)
|
.own_substs(substs)
|
||||||
.iter()
|
.iter()
|
||||||
.position(|&arg| self.generic_arg_contains_target(arg))
|
.position(|&arg| self.generic_arg_contains_target(arg))
|
||||||
{
|
{
|
||||||
|
if generics.parent.is_none() && generics.has_self {
|
||||||
|
argument_index += 1;
|
||||||
|
}
|
||||||
let substs = self.infcx.resolve_vars_if_possible(substs);
|
let substs = self.infcx.resolve_vars_if_possible(substs);
|
||||||
let generic_args = &generics.own_substs_no_defaults(tcx, substs)
|
let generic_args = &generics.own_substs_no_defaults(tcx, substs)
|
||||||
[generics.own_counts().lifetimes..];
|
[generics.own_counts().lifetimes..];
|
||||||
|
@ -7,10 +7,13 @@ struct Two;
|
|||||||
struct Struct;
|
struct Struct;
|
||||||
|
|
||||||
impl Ambiguous<One> for Struct {}
|
impl Ambiguous<One> for Struct {}
|
||||||
|
//~^ NOTE multiple `impl`s satisfying `Struct: Ambiguous<_>` found
|
||||||
impl Ambiguous<Two> for Struct {}
|
impl Ambiguous<Two> for Struct {}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
<Struct as Ambiguous<_>>::method();
|
<Struct as Ambiguous<_>>::method();
|
||||||
//~^ ERROR type annotations needed
|
//~^ ERROR type annotations needed
|
||||||
|
//~| NOTE cannot infer type of the type parameter `A`
|
||||||
//~| ERROR type annotations needed
|
//~| ERROR type annotations needed
|
||||||
|
//~| NOTE infer type of the type parameter `A`
|
||||||
}
|
}
|
||||||
|
@ -1,20 +1,21 @@
|
|||||||
error[E0282]: type annotations needed
|
error[E0282]: type annotations needed
|
||||||
--> $DIR/concrete-impl.rs:13:5
|
--> $DIR/concrete-impl.rs:14:5
|
||||||
|
|
|
|
||||||
LL | <Struct as Ambiguous<_>>::method();
|
LL | <Struct as Ambiguous<_>>::method();
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot infer type of the type parameter `Self` declared on the trait `Ambiguous`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot infer type of the type parameter `A` declared on the trait `Ambiguous`
|
||||||
|
|
||||||
error[E0283]: type annotations needed
|
error[E0283]: type annotations needed
|
||||||
--> $DIR/concrete-impl.rs:13:5
|
--> $DIR/concrete-impl.rs:14:5
|
||||||
|
|
|
|
||||||
LL | <Struct as Ambiguous<_>>::method();
|
LL | <Struct as Ambiguous<_>>::method();
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot infer type of the type parameter `Self` declared on the trait `Ambiguous`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot infer type of the type parameter `A` declared on the trait `Ambiguous`
|
||||||
|
|
|
|
||||||
note: multiple `impl`s satisfying `Struct: Ambiguous<_>` found
|
note: multiple `impl`s satisfying `Struct: Ambiguous<_>` found
|
||||||
--> $DIR/concrete-impl.rs:9:1
|
--> $DIR/concrete-impl.rs:9:1
|
||||||
|
|
|
|
||||||
LL | impl Ambiguous<One> for Struct {}
|
LL | impl Ambiguous<One> for Struct {}
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
LL |
|
||||||
LL | impl Ambiguous<Two> for Struct {}
|
LL | impl Ambiguous<Two> for Struct {}
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
25
tests/ui/inference/need_type_info/issue-109905.rs
Normal file
25
tests/ui/inference/need_type_info/issue-109905.rs
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
// Test that we show the correct type parameter that couldn't be inferred and that we don't
|
||||||
|
// end up stating nonsense like "type parameter `'a`" which we used to do.
|
||||||
|
|
||||||
|
trait Trait<'a, T> {
|
||||||
|
fn m(self);
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a, A> Trait<'a, A> for () {
|
||||||
|
fn m(self) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn qualified() {
|
||||||
|
<() as Trait<'static, _>>::m(());
|
||||||
|
//~^ ERROR type annotations needed
|
||||||
|
//~| NOTE cannot infer type of the type parameter `T`
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
fn unqualified() {
|
||||||
|
Trait::<'static, _>::m(());
|
||||||
|
//~^ ERROR type annotations needed
|
||||||
|
//~| NOTE cannot infer type of the type parameter `T`
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
15
tests/ui/inference/need_type_info/issue-109905.stderr
Normal file
15
tests/ui/inference/need_type_info/issue-109905.stderr
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
error[E0282]: type annotations needed
|
||||||
|
--> $DIR/issue-109905.rs:13:5
|
||||||
|
|
|
||||||
|
LL | <() as Trait<'static, _>>::m(());
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot infer type of the type parameter `T` declared on the trait `Trait`
|
||||||
|
|
||||||
|
error[E0282]: type annotations needed
|
||||||
|
--> $DIR/issue-109905.rs:20:5
|
||||||
|
|
|
||||||
|
LL | Trait::<'static, _>::m(());
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^ cannot infer type of the type parameter `T` declared on the trait `Trait`
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0282`.
|
Loading…
x
Reference in New Issue
Block a user