report ambiguous type parameters when their parents are impl or fn
fix ci error emit err for `impl_item`
This commit is contained in:
parent
910979a6d4
commit
3d0f9fb544
@ -941,15 +941,16 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
|
||||
let mut inner = self.inner.borrow_mut();
|
||||
let ty_vars = &inner.type_variables();
|
||||
let var_origin = ty_vars.var_origin(ty_vid);
|
||||
if let TypeVariableOriginKind::TypeParameterDefinition(name, Some(def_id)) =
|
||||
if let TypeVariableOriginKind::TypeParameterDefinition(_, Some(def_id)) =
|
||||
var_origin.kind
|
||||
&& let Some(parent_def_id) = self.tcx.parent(def_id).as_local()
|
||||
&& let Some(hir::Node::Item(item)) = self.tcx.hir().find_by_def_id(parent_def_id)
|
||||
&& let hir::ItemKind::Impl(impl_item) = item.kind
|
||||
&& let Some(trait_ref) = &impl_item.of_trait
|
||||
&& let Some(did) = trait_ref.trait_def_id()
|
||||
&& self.tcx.generics_of(did).params.iter().any(|param| param.name == name)
|
||||
&& let Some(node) = self.tcx.hir().find_by_def_id(parent_def_id)
|
||||
{
|
||||
match node {
|
||||
hir::Node::Item(item) if matches!(item.kind, hir::ItemKind::Impl(_) | hir::ItemKind::Fn(..)) => (),
|
||||
hir::Node::ImplItem(impl_item) if matches!(impl_item.kind, hir::ImplItemKind::Fn(..)) => (),
|
||||
_ => return,
|
||||
}
|
||||
err.span_help(self.tcx.def_span(def_id), "type parameter declared here");
|
||||
}
|
||||
}
|
||||
|
@ -5,6 +5,12 @@ LL | let _ = foo([0; 1]);
|
||||
| - ^^^ cannot infer type for type parameter `T` declared on the function `foo`
|
||||
| |
|
||||
| consider giving this pattern a type
|
||||
|
|
||||
help: type parameter declared here
|
||||
--> $DIR/issue-83249.rs:12:8
|
||||
|
|
||||
LL | fn foo<T: Foo>(_: [u8; T::N]) -> T {
|
||||
| ^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -3,12 +3,24 @@ error[E0282]: type annotations needed
|
||||
|
|
||||
LL | A = foo(),
|
||||
| ^^^ cannot infer type for type parameter `T` declared on the function `foo`
|
||||
|
|
||||
help: type parameter declared here
|
||||
--> $DIR/issue-64662.rs:6:14
|
||||
|
|
||||
LL | const fn foo<T>() -> isize {
|
||||
| ^
|
||||
|
||||
error[E0282]: type annotations needed
|
||||
--> $DIR/issue-64662.rs:3:9
|
||||
|
|
||||
LL | B = foo(),
|
||||
| ^^^ cannot infer type for type parameter `T` declared on the function `foo`
|
||||
|
|
||||
help: type parameter declared here
|
||||
--> $DIR/issue-64662.rs:6:14
|
||||
|
|
||||
LL | const fn foo<T>() -> isize {
|
||||
| ^
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
|
@ -37,6 +37,12 @@ error[E0282]: type annotations needed
|
||||
|
|
||||
LL | bfnr(x);
|
||||
| ^^^^ cannot infer type for type parameter `U` declared on the function `bfnr`
|
||||
|
|
||||
help: type parameter declared here
|
||||
--> $DIR/E0401.rs:4:13
|
||||
|
|
||||
LL | fn bfnr<U, V: Baz<U>, W: Fn()>(y: T) {
|
||||
| ^
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
|
||||
|
@ -6,6 +6,11 @@ LL | let foo = foo(1, "");
|
||||
| |
|
||||
| consider giving `foo` the explicit type `Foo<_, _, W, Z>`, where the type parameter `W` is specified
|
||||
|
|
||||
help: type parameter declared here
|
||||
--> $DIR/erase-type-params-in-label.rs:25:14
|
||||
|
|
||||
LL | fn foo<T, K, W: Default, Z: Default>(t: T, k: K) -> Foo<T, K, W, Z> {
|
||||
| ^
|
||||
= note: cannot satisfy `_: Default`
|
||||
note: required by a bound in `foo`
|
||||
--> $DIR/erase-type-params-in-label.rs:25:17
|
||||
@ -25,6 +30,11 @@ LL | let bar = bar(1, "");
|
||||
| |
|
||||
| consider giving `bar` the explicit type `Bar<_, _, Z>`, where the type parameter `Z` is specified
|
||||
|
|
||||
help: type parameter declared here
|
||||
--> $DIR/erase-type-params-in-label.rs:14:14
|
||||
|
|
||||
LL | fn bar<T, K, Z: Default>(t: T, k: K) -> Bar<T, K, Z> {
|
||||
| ^
|
||||
= note: cannot satisfy `_: Default`
|
||||
note: required by a bound in `bar`
|
||||
--> $DIR/erase-type-params-in-label.rs:14:17
|
||||
|
@ -4,6 +4,11 @@ error[E0283]: type annotations needed
|
||||
LL | foo(gen()); //<- Do not suggest `foo::<impl Clone>()`!
|
||||
| ^^^ cannot infer type for type parameter `impl Clone` declared on the function `foo`
|
||||
|
|
||||
help: type parameter declared here
|
||||
--> $DIR/issue-86162-1.rs:3:11
|
||||
|
|
||||
LL | fn foo(x: impl Clone) {}
|
||||
| ^^^^^^^^^^
|
||||
= note: cannot satisfy `_: Clone`
|
||||
note: required by a bound in `foo`
|
||||
--> $DIR/issue-86162-1.rs:3:16
|
||||
|
@ -4,6 +4,11 @@ error[E0283]: type annotations needed
|
||||
LL | Foo::bar(gen()); //<- Do not suggest `Foo::bar::<impl Clone>()`!
|
||||
| ^^^^^^^^ cannot infer type for type parameter `impl Clone` declared on the associated function `bar`
|
||||
|
|
||||
help: type parameter declared here
|
||||
--> $DIR/issue-86162-2.rs:8:15
|
||||
|
|
||||
LL | fn bar(x: impl Clone) {}
|
||||
| ^^^^^^^^^^
|
||||
= note: cannot satisfy `_: Clone`
|
||||
note: required by a bound in `Foo::bar`
|
||||
--> $DIR/issue-86162-2.rs:8:20
|
||||
|
@ -3,6 +3,12 @@ error[E0282]: type annotations needed
|
||||
|
|
||||
LL | foo(TypeWithState(marker::PhantomData));
|
||||
| ^^^ cannot infer type for type parameter `State` declared on the function `foo`
|
||||
|
|
||||
help: type parameter declared here
|
||||
--> $DIR/issue-6458.rs:6:12
|
||||
|
|
||||
LL | pub fn foo<State>(_: TypeWithState<State>) {}
|
||||
| ^^^^^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -3,6 +3,12 @@ error[E0282]: type annotations needed
|
||||
|
|
||||
LL | foo();
|
||||
| ^^^ cannot infer type for type parameter `X` declared on the function `foo`
|
||||
|
|
||||
help: type parameter declared here
|
||||
--> $DIR/missing-type-parameter.rs:1:8
|
||||
|
|
||||
LL | fn foo<X>() { }
|
||||
| ^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -5,6 +5,12 @@ LL | let _ = f;
|
||||
| - ^ cannot infer type for type parameter `A` declared on the function `f`
|
||||
| |
|
||||
| consider giving this pattern the explicit type `fn() -> A`, where the type parameter `A` is specified
|
||||
|
|
||||
help: type parameter declared here
|
||||
--> $DIR/fn-needing-specified-return-type-param.rs:1:6
|
||||
|
|
||||
LL | fn f<A>() -> A { unimplemented!() }
|
||||
| ^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -3,6 +3,12 @@ error[E0282]: type annotations needed
|
||||
|
|
||||
LL | test(22, std::default::Default::default());
|
||||
| ^^^^ cannot infer type for type parameter `U` declared on the function `test`
|
||||
|
|
||||
help: type parameter declared here
|
||||
--> $DIR/multidispatch-convert-ambig-dest.rs:20:11
|
||||
|
|
||||
LL | fn test<T,U>(_: T, _: U)
|
||||
| ^
|
||||
|
||||
error[E0283]: type annotations needed
|
||||
--> $DIR/multidispatch-convert-ambig-dest.rs:26:5
|
||||
@ -10,6 +16,11 @@ error[E0283]: type annotations needed
|
||||
LL | test(22, std::default::Default::default());
|
||||
| ^^^^ cannot infer type for type parameter `U` declared on the function `test`
|
||||
|
|
||||
help: type parameter declared here
|
||||
--> $DIR/multidispatch-convert-ambig-dest.rs:20:11
|
||||
|
|
||||
LL | fn test<T,U>(_: T, _: U)
|
||||
| ^
|
||||
note: multiple `impl`s satisfying `i32: Convert<_>` found
|
||||
--> $DIR/multidispatch-convert-ambig-dest.rs:8:1
|
||||
|
|
||||
|
@ -3,6 +3,12 @@ error[E0282]: type annotations needed
|
||||
|
|
||||
LL | foo();
|
||||
| ^^^ cannot infer type for type parameter `T` declared on the function `foo`
|
||||
|
|
||||
help: type parameter declared here
|
||||
--> $DIR/unbounded-type-param-in-fn-with-assoc-type.rs:3:8
|
||||
|
|
||||
LL | fn foo<T, U = u64>() -> (T, U) {
|
||||
| ^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -3,6 +3,12 @@ error[E0282]: type annotations needed
|
||||
|
|
||||
LL | foo();
|
||||
| ^^^ cannot infer type for type parameter `T` declared on the function `foo`
|
||||
|
|
||||
help: type parameter declared here
|
||||
--> $DIR/unbounded-type-param-in-fn.rs:1:8
|
||||
|
|
||||
LL | fn foo<T>() -> T {
|
||||
| ^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -4,6 +4,11 @@ error[E0283]: type annotations needed
|
||||
LL | foo(42);
|
||||
| ^^^ cannot infer type for type parameter `T` declared on the function `foo`
|
||||
|
|
||||
help: type parameter declared here
|
||||
--> $DIR/type-annotation-needed.rs:1:8
|
||||
|
|
||||
LL | fn foo<T: Into<String>>(x: i32) {}
|
||||
| ^
|
||||
= note: cannot satisfy `_: Into<String>`
|
||||
note: required by a bound in `foo`
|
||||
--> $DIR/type-annotation-needed.rs:1:11
|
||||
|
Loading…
x
Reference in New Issue
Block a user