Open
Description
Hi, folks!
Misusing const generics generates errors messages that lead the user to a wrong usage of the feature, let's follow an example:
Given this very simple (and wrong) definition:
struct Foo<const AHA: usize>{}
impl Foo {}
The compiler generates this error message:
error[E0107]: missing generics for struct `Foo`
--> src/lib.rs:3:6
|
3 | impl Foo {}
| ^^^ expected 1 generic argument
|
note: struct defined here, with 1 generic parameter: `AHA`
--> src/lib.rs:1:8
|
1 | struct Foo<const AHA: usize>{}
| ^^^ ---
help: add missing generic argument
|
3 | impl Foo<AHA> {}
| ~~~~~~~~
Following the compiler suggestion:
struct Foo<const AHA: usize>{}
impl Foo<AHA> {}
We have a new error:
error[E0412]: cannot find type `AHA` in this scope
--> src/lib.rs:3:10
|
3 | impl Foo<AHA> {}
| - ^^^ not found in this scope
| |
| help: you might be missing a type parameter: `<AHA>`
error[E0747]: unresolved item provided when a constant was expected
--> src/lib.rs:3:10
|
3 | impl Foo<AHA> {}
| ^^^
|
help: if this generic argument was intended as a const parameter, surround it with braces
|
3 | impl Foo<{ AHA }> {}
| + +
Applying the suggestion:
struct Foo<const AHA: usize>{}
impl Foo<{ AHA }> {}
Leads to a new error:
error[E0425]: cannot find value `AHA` in this scope
--> src/lib.rs:3:12
|
3 | impl Foo<{ AHA }> {}
| - ^^^ not found in this scope
| |
| help: you might be missing a type parameter: `<AHA>`
And applying again:
struct Foo<const AHA: usize>{}
impl<AHA> Foo<{ AHA }> {}
Leads the user to a not intuitive point:
error[E0423]: expected value, found type parameter `AHA`
--> src/lib.rs:3:17
|
3 | impl<AHA> Foo<{ AHA }> {}
| ^^^ not a value
error[E0207]: the type parameter `AHA` is not constrained by the impl trait, self type, or predicates
--> src/lib.rs:3:6
|
3 | impl<AHA> Foo<{ AHA }> {}
| ^^^ unconstrained type parameter
Ideally, we should not guide the user to such a long and erroneous path, and give them the correct answer that may look like this:
error[E???]: missing const generics for struct `Foo`
--> src/lib.rs:3:6
|
3 | impl Foo {}
| ^^^ expected 1 const generic argument
|
note: struct defined here, with 1 const generic parameter: `AHA`
--> src/lib.rs:1:8
|
1 | struct Foo<const AHA: usize>{}
| ^^^ ---
help: add missing generic argument
|
3 | impl<const AHA: usize> Foo<AHA> {}
| ~~~~~~~~
Metadata
Metadata
Assignees
Labels
Area: const generics (parameters and arguments)Area: Messages for errors, warnings, and lintsCategory: This is a bug.Diagnostics: A diagnostic that is giving misleading or incorrect information.Diagnostics: A structured suggestion resulting in incorrect code.Relevant to the compiler team, which will review and decide on the PR/issue.