Skip to content

Compiler error messages leads to wrong usage of const generics #91119

Open
@matheus-consoli

Description

@matheus-consoli

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:

playground

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

Labels

A-const-genericsArea: const generics (parameters and arguments)A-diagnosticsArea: Messages for errors, warnings, and lintsC-bugCategory: This is a bug.D-incorrectDiagnostics: A diagnostic that is giving misleading or incorrect information.D-invalid-suggestionDiagnostics: A structured suggestion resulting in incorrect code.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions