Rollup merge of #79639 - sasurau4:feature/add-long-explanation-E0212, r=GuillaumeGomez
Add long explanation for E0212 Helps with #61137
This commit is contained in:
commit
f3a3fc900c
@ -111,6 +111,7 @@ E0206: include_str!("./error_codes/E0206.md"),
|
|||||||
E0207: include_str!("./error_codes/E0207.md"),
|
E0207: include_str!("./error_codes/E0207.md"),
|
||||||
E0210: include_str!("./error_codes/E0210.md"),
|
E0210: include_str!("./error_codes/E0210.md"),
|
||||||
E0211: include_str!("./error_codes/E0211.md"),
|
E0211: include_str!("./error_codes/E0211.md"),
|
||||||
|
E0212: include_str!("./error_codes/E0212.md"),
|
||||||
E0214: include_str!("./error_codes/E0214.md"),
|
E0214: include_str!("./error_codes/E0214.md"),
|
||||||
E0220: include_str!("./error_codes/E0220.md"),
|
E0220: include_str!("./error_codes/E0220.md"),
|
||||||
E0221: include_str!("./error_codes/E0221.md"),
|
E0221: include_str!("./error_codes/E0221.md"),
|
||||||
@ -503,7 +504,6 @@ E0779: include_str!("./error_codes/E0779.md"),
|
|||||||
// E0196, // cannot determine a type for this closure
|
// E0196, // cannot determine a type for this closure
|
||||||
E0208,
|
E0208,
|
||||||
// E0209, // builtin traits can only be implemented on structs or enums
|
// E0209, // builtin traits can only be implemented on structs or enums
|
||||||
E0212, // cannot extract an associated type from a higher-ranked trait bound
|
|
||||||
// E0213, // associated types are not accepted in this context
|
// E0213, // associated types are not accepted in this context
|
||||||
// E0215, // angle-bracket notation is not stable with `Fn`
|
// E0215, // angle-bracket notation is not stable with `Fn`
|
||||||
// E0216, // parenthetical notation is only stable with `Fn`
|
// E0216, // parenthetical notation is only stable with `Fn`
|
||||||
|
35
compiler/rustc_error_codes/src/error_codes/E0212.md
Normal file
35
compiler/rustc_error_codes/src/error_codes/E0212.md
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
Cannot use the associated type of
|
||||||
|
a trait with uninferred generic parameters.
|
||||||
|
|
||||||
|
Erroneous code example:
|
||||||
|
|
||||||
|
```compile_fail,E0212
|
||||||
|
pub trait Foo<T> {
|
||||||
|
type A;
|
||||||
|
|
||||||
|
fn get(&self, t: T) -> Self::A;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn foo2<I : for<'x> Foo<&'x isize>>(
|
||||||
|
field: I::A) {} // error!
|
||||||
|
```
|
||||||
|
|
||||||
|
In this example, we have to instantiate `'x`, and
|
||||||
|
we don't know what lifetime to instantiate it with.
|
||||||
|
To fix this, spell out the precise lifetimes involved.
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```
|
||||||
|
pub trait Foo<T> {
|
||||||
|
type A;
|
||||||
|
|
||||||
|
fn get(&self, t: T) -> Self::A;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn foo3<I : for<'x> Foo<&'x isize>>(
|
||||||
|
x: <I as Foo<&isize>>::A) {} // ok!
|
||||||
|
|
||||||
|
|
||||||
|
fn foo4<'a, I : for<'x> Foo<&'x isize>>(
|
||||||
|
x: <I as Foo<&'a isize>>::A) {} // ok!
|
||||||
|
```
|
@ -359,8 +359,8 @@ impl AstConv<'tcx> for ItemCtxt<'tcx> {
|
|||||||
self.tcx().sess,
|
self.tcx().sess,
|
||||||
span,
|
span,
|
||||||
E0212,
|
E0212,
|
||||||
"cannot extract an associated type from a higher-ranked trait bound \
|
"cannot use the associated type of a trait \
|
||||||
in this context"
|
with uninferred generic parameters"
|
||||||
);
|
);
|
||||||
|
|
||||||
match self.node() {
|
match self.node() {
|
||||||
|
@ -11,7 +11,7 @@ pub trait Foo<T> {
|
|||||||
|
|
||||||
fn foo2<I : for<'x> Foo<&'x isize>>(
|
fn foo2<I : for<'x> Foo<&'x isize>>(
|
||||||
x: <I as Foo<&isize>>::A)
|
x: <I as Foo<&isize>>::A)
|
||||||
//~^ ERROR cannot extract an associated type from a higher-ranked trait bound in this context
|
//~^ ERROR cannot use the associated type of a trait with uninferred generic parameters
|
||||||
{
|
{
|
||||||
// This case is illegal because we have to instantiate `'x`, and
|
// This case is illegal because we have to instantiate `'x`, and
|
||||||
// we don't know what region to instantiate it with.
|
// we don't know what region to instantiate it with.
|
||||||
|
@ -11,7 +11,7 @@ pub trait Foo<T> {
|
|||||||
|
|
||||||
fn foo2<I : for<'x> Foo<&'x isize>>(
|
fn foo2<I : for<'x> Foo<&'x isize>>(
|
||||||
x: I::A)
|
x: I::A)
|
||||||
//~^ ERROR cannot extract an associated type from a higher-ranked trait bound in this context
|
//~^ ERROR cannot use the associated type of a trait with uninferred generic parameters
|
||||||
{
|
{
|
||||||
// This case is illegal because we have to instantiate `'x`, and
|
// This case is illegal because we have to instantiate `'x`, and
|
||||||
// we don't know what region to instantiate it with.
|
// we don't know what region to instantiate it with.
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
error[E0212]: cannot extract an associated type from a higher-ranked trait bound in this context
|
error[E0212]: cannot use the associated type of a trait with uninferred generic parameters
|
||||||
--> $DIR/associated-types-project-from-hrtb-in-fn.rs:13:8
|
--> $DIR/associated-types-project-from-hrtb-in-fn.rs:13:8
|
||||||
|
|
|
|
||||||
LL | x: I::A)
|
LL | x: I::A)
|
||||||
@ -6,3 +6,4 @@ LL | x: I::A)
|
|||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0212`.
|
||||||
|
@ -9,14 +9,14 @@ pub trait Foo<T> {
|
|||||||
|
|
||||||
struct SomeStruct<I: for<'x> Foo<&'x isize>> {
|
struct SomeStruct<I: for<'x> Foo<&'x isize>> {
|
||||||
field: I::A
|
field: I::A
|
||||||
//~^ ERROR cannot extract an associated type from a higher-ranked trait bound in this context
|
//~^ ERROR cannot use the associated type of a trait with uninferred generic parameters
|
||||||
}
|
}
|
||||||
|
|
||||||
enum SomeEnum<'b, I: for<'a> Foo<&'a isize>> {
|
enum SomeEnum<'b, I: for<'a> Foo<&'a isize>> {
|
||||||
TupleVariant(I::A),
|
TupleVariant(I::A),
|
||||||
//~^ ERROR cannot extract an associated type from a higher-ranked trait bound in this context
|
//~^ ERROR cannot use the associated type of a trait with uninferred generic parameters
|
||||||
StructVariant { field: I::A },
|
StructVariant { field: I::A },
|
||||||
//~^ ERROR cannot extract an associated type from a higher-ranked trait bound in this context
|
//~^ ERROR cannot use the associated type of a trait with uninferred generic parameters
|
||||||
OkVariant(&'b usize),
|
OkVariant(&'b usize),
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -33,7 +33,7 @@ struct YetAnotherStruct<'a, I: for<'x> Foo<&'x isize>> {
|
|||||||
struct Why<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, 'i, 'j, 'k, 'n, 'o, 'p, 'q, 'r, 's, 't, 'u, 'v, 'w, 'x,
|
struct Why<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, 'i, 'j, 'k, 'n, 'o, 'p, 'q, 'r, 's, 't, 'u, 'v, 'w, 'x,
|
||||||
'y, 'z, 'aa, I: for<'l, 'm> Foo<&'l &'m isize>> {
|
'y, 'z, 'aa, I: for<'l, 'm> Foo<&'l &'m isize>> {
|
||||||
field: I::A,
|
field: I::A,
|
||||||
//~^ ERROR cannot extract an associated type from a higher-ranked trait bound in this context
|
//~^ ERROR cannot use the associated type of a trait with uninferred generic parameters
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn main() {}
|
pub fn main() {}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
error[E0212]: cannot extract an associated type from a higher-ranked trait bound in this context
|
error[E0212]: cannot use the associated type of a trait with uninferred generic parameters
|
||||||
--> $DIR/associated-types-project-from-hrtb-in-struct.rs:11:12
|
--> $DIR/associated-types-project-from-hrtb-in-struct.rs:11:12
|
||||||
|
|
|
|
||||||
LL | field: I::A
|
LL | field: I::A
|
||||||
@ -10,7 +10,7 @@ LL | struct SomeStruct<'a, I: for<'x> Foo<&'x isize>> {
|
|||||||
LL | field: <I as Foo<&'a isize>>::A
|
LL | field: <I as Foo<&'a isize>>::A
|
||||||
|
|
|
|
||||||
|
|
||||||
error[E0212]: cannot extract an associated type from a higher-ranked trait bound in this context
|
error[E0212]: cannot use the associated type of a trait with uninferred generic parameters
|
||||||
--> $DIR/associated-types-project-from-hrtb-in-struct.rs:16:18
|
--> $DIR/associated-types-project-from-hrtb-in-struct.rs:16:18
|
||||||
|
|
|
|
||||||
LL | TupleVariant(I::A),
|
LL | TupleVariant(I::A),
|
||||||
@ -22,7 +22,7 @@ LL | enum SomeEnum<'c, 'b, I: for<'a> Foo<&'a isize>> {
|
|||||||
LL | TupleVariant(<I as Foo<&'c isize>>::A),
|
LL | TupleVariant(<I as Foo<&'c isize>>::A),
|
||||||
|
|
|
|
||||||
|
|
||||||
error[E0212]: cannot extract an associated type from a higher-ranked trait bound in this context
|
error[E0212]: cannot use the associated type of a trait with uninferred generic parameters
|
||||||
--> $DIR/associated-types-project-from-hrtb-in-struct.rs:18:28
|
--> $DIR/associated-types-project-from-hrtb-in-struct.rs:18:28
|
||||||
|
|
|
|
||||||
LL | StructVariant { field: I::A },
|
LL | StructVariant { field: I::A },
|
||||||
@ -36,7 +36,7 @@ LL |
|
|||||||
LL | StructVariant { field: <I as Foo<&'c isize>>::A },
|
LL | StructVariant { field: <I as Foo<&'c isize>>::A },
|
||||||
|
|
|
|
||||||
|
|
||||||
error[E0212]: cannot extract an associated type from a higher-ranked trait bound in this context
|
error[E0212]: cannot use the associated type of a trait with uninferred generic parameters
|
||||||
--> $DIR/associated-types-project-from-hrtb-in-struct.rs:35:12
|
--> $DIR/associated-types-project-from-hrtb-in-struct.rs:35:12
|
||||||
|
|
|
|
||||||
LL | field: I::A,
|
LL | field: I::A,
|
||||||
@ -51,3 +51,4 @@ LL | field: <I as Foo<&'bb &'bb isize>>::A,
|
|||||||
|
|
||||||
error: aborting due to 4 previous errors
|
error: aborting due to 4 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0212`.
|
||||||
|
@ -11,7 +11,7 @@ pub trait Foo<T> {
|
|||||||
|
|
||||||
trait SomeTrait<I : for<'x> Foo<&'x isize>> {
|
trait SomeTrait<I : for<'x> Foo<&'x isize>> {
|
||||||
fn some_method(&self, arg: <I as Foo<&isize>>::A);
|
fn some_method(&self, arg: <I as Foo<&isize>>::A);
|
||||||
//~^ ERROR cannot extract an associated type from a higher-ranked trait bound in this context
|
//~^ ERROR cannot use the associated type of a trait with uninferred generic parameters
|
||||||
}
|
}
|
||||||
|
|
||||||
trait AnotherTrait<I : for<'x> Foo<&'x isize>> {
|
trait AnotherTrait<I : for<'x> Foo<&'x isize>> {
|
||||||
@ -30,7 +30,7 @@ struct Peach<X>(std::marker::PhantomData<X>);
|
|||||||
|
|
||||||
impl<X: for<'a> Banana<'a>> Peach<X> {
|
impl<X: for<'a> Banana<'a>> Peach<X> {
|
||||||
fn mango(&self) -> <X as Banana<'_>>::Assoc {
|
fn mango(&self) -> <X as Banana<'_>>::Assoc {
|
||||||
//~^ ERROR cannot extract an associated type from a higher-ranked trait bound in this context
|
//~^ ERROR cannot use the associated type of a trait with uninferred generic parameters
|
||||||
Default::default()
|
Default::default()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,7 @@ pub trait Foo<T> {
|
|||||||
|
|
||||||
trait SomeTrait<I : for<'x> Foo<&'x isize>> {
|
trait SomeTrait<I : for<'x> Foo<&'x isize>> {
|
||||||
fn some_method(&self, arg: I::A);
|
fn some_method(&self, arg: I::A);
|
||||||
//~^ ERROR cannot extract an associated type from a higher-ranked trait bound in this context
|
//~^ ERROR cannot use the associated type of a trait with uninferred generic parameters
|
||||||
}
|
}
|
||||||
|
|
||||||
trait AnotherTrait<I : for<'x> Foo<&'x isize>> {
|
trait AnotherTrait<I : for<'x> Foo<&'x isize>> {
|
||||||
@ -30,7 +30,7 @@ struct Peach<X>(std::marker::PhantomData<X>);
|
|||||||
|
|
||||||
impl<X: for<'a> Banana<'a>> Peach<X> {
|
impl<X: for<'a> Banana<'a>> Peach<X> {
|
||||||
fn mango(&self) -> X::Assoc {
|
fn mango(&self) -> X::Assoc {
|
||||||
//~^ ERROR cannot extract an associated type from a higher-ranked trait bound in this context
|
//~^ ERROR cannot use the associated type of a trait with uninferred generic parameters
|
||||||
Default::default()
|
Default::default()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
error[E0212]: cannot extract an associated type from a higher-ranked trait bound in this context
|
error[E0212]: cannot use the associated type of a trait with uninferred generic parameters
|
||||||
--> $DIR/associated-types-project-from-hrtb-in-trait-method.rs:13:32
|
--> $DIR/associated-types-project-from-hrtb-in-trait-method.rs:13:32
|
||||||
|
|
|
|
||||||
LL | fn some_method(&self, arg: I::A);
|
LL | fn some_method(&self, arg: I::A);
|
||||||
| ^^^^ help: use a fully qualified path with inferred lifetimes: `<I as Foo<&isize>>::A`
|
| ^^^^ help: use a fully qualified path with inferred lifetimes: `<I as Foo<&isize>>::A`
|
||||||
|
|
||||||
error[E0212]: cannot extract an associated type from a higher-ranked trait bound in this context
|
error[E0212]: cannot use the associated type of a trait with uninferred generic parameters
|
||||||
--> $DIR/associated-types-project-from-hrtb-in-trait-method.rs:32:24
|
--> $DIR/associated-types-project-from-hrtb-in-trait-method.rs:32:24
|
||||||
|
|
|
|
||||||
LL | fn mango(&self) -> X::Assoc {
|
LL | fn mango(&self) -> X::Assoc {
|
||||||
@ -12,3 +12,4 @@ LL | fn mango(&self) -> X::Assoc {
|
|||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0212`.
|
||||||
|
Loading…
Reference in New Issue
Block a user