Rollup merge of #103757 - ffmancera:ff/clarify_E0207, r=jackh726
Mention const and lifetime parameters in error E0207 Error Index for E0207 must mention const and lifetime parameters. In addition, add code examples for these situations. Fixes #80862
This commit is contained in:
commit
408b8cf7c4
1 changed files with 71 additions and 4 deletions
|
@ -1,4 +1,5 @@
|
|||
A type parameter that is specified for `impl` is not constrained.
|
||||
A type, const or lifetime parameter that is specified for `impl` is not
|
||||
constrained.
|
||||
|
||||
Erroneous code example:
|
||||
|
||||
|
@ -14,8 +15,8 @@ impl<T: Default> Foo {
|
|||
}
|
||||
```
|
||||
|
||||
Any type parameter of an `impl` must meet at least one of
|
||||
the following criteria:
|
||||
Any type or const parameter of an `impl` must meet at least one of the
|
||||
following criteria:
|
||||
|
||||
- it appears in the _implementing type_ of the impl, e.g. `impl<T> Foo<T>`
|
||||
- for a trait impl, it appears in the _implemented trait_, e.g.
|
||||
|
@ -23,6 +24,9 @@ the following criteria:
|
|||
- it is bound as an associated type, e.g. `impl<T, U> SomeTrait for T
|
||||
where T: AnotherTrait<AssocType=U>`
|
||||
|
||||
Any unconstrained lifetime parameter of an `impl` is not supported if the
|
||||
lifetime parameter is used by an associated type.
|
||||
|
||||
### Error example 1
|
||||
|
||||
Suppose we have a struct `Foo` and we would like to define some methods for it.
|
||||
|
@ -32,7 +36,6 @@ The problem is that the parameter `T` does not appear in the implementing type
|
|||
(`Foo`) of the impl. In this case, we can fix the error by moving the type
|
||||
parameter from the `impl` to the method `get`:
|
||||
|
||||
|
||||
```
|
||||
struct Foo;
|
||||
|
||||
|
@ -128,6 +131,70 @@ impl<T: Default> Maker<Foo<T>> for FooMaker {
|
|||
}
|
||||
```
|
||||
|
||||
### Error example 3
|
||||
|
||||
Suppose we have a struct `Foo` and we would like to define some methods for it.
|
||||
The following code example has a definition which leads to a compiler error:
|
||||
|
||||
```compile_fail,E0207
|
||||
struct Foo;
|
||||
|
||||
impl<const T: i32> Foo {
|
||||
// error: the const parameter `T` is not constrained by the impl trait, self
|
||||
// type, or predicates [E0207]
|
||||
fn get(&self) -> i32 {
|
||||
i32::default()
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
The problem is that the const parameter `T` does not appear in the implementing
|
||||
type (`Foo`) of the impl. In this case, we can fix the error by moving the type
|
||||
parameter from the `impl` to the method `get`:
|
||||
|
||||
|
||||
```
|
||||
struct Foo;
|
||||
|
||||
// Move the const parameter from the impl to the method
|
||||
impl Foo {
|
||||
fn get<const T: i32>(&self) -> i32 {
|
||||
i32::default()
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Error example 4
|
||||
|
||||
Suppose we have a struct `Foo` and a struct `Bar` that uses lifetime `'a`. We
|
||||
would like to implement trait `Contains` for `Foo`. The trait `Contains` have
|
||||
the associated type `B`. The following code example has a definition which
|
||||
leads to a compiler error:
|
||||
|
||||
```compile_fail,E0207
|
||||
struct Foo;
|
||||
struct Bar<'a>;
|
||||
|
||||
trait Contains {
|
||||
type B;
|
||||
|
||||
fn get(&self) -> i32;
|
||||
}
|
||||
|
||||
impl<'a> Contains for Foo {
|
||||
type B = Bar<'a>;
|
||||
|
||||
// error: the lifetime parameter `'a` is not constrained by the impl trait,
|
||||
// self type, or predicates [E0207]
|
||||
fn get(&self) -> i32 {
|
||||
i32::default()
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Please note that unconstrained lifetime parameters are not supported if they are
|
||||
being used by an associated type.
|
||||
|
||||
### Additional information
|
||||
|
||||
For more information, please see [RFC 447].
|
||||
|
|
Loading…
Add table
Reference in a new issue