Skip to content

Diagnostics hint for const generics #80506

@yoshuawuyts

Description

@yoshuawuyts
Member

Current Behavior

Given the following code:

let mut combinations = (1..2).combinations();
assert_eq!(combinations.next(), None);

where Iterator::combinations is defined as:

fn combinations<const N: usize>(self) -> Combinations<Self, N>;

The following diagnostic is provided:

error[E0282]: type annotations needed
   --> src\lib.rs:144:32
    |
144 |         let mut combinations = (1..2).combinations();
    |                                ^^^^^^^^^^^^^^^^^^^^^
    |
    = note: unable to infer the value of a const parameter

Attempting a fix, and failing:

Naively I thought I could fix this by adding a turbofish, but that doesn't seem to help:

let mut combinations = (1..2).combinations::<[usize; 2]>();
assert_eq!(combinations.next(), None);
error[E0107]: wrong number of const arguments: expected 1, found 0
   --> src\lib.rs:144:39
    |
144 |         let mut combinations = (1..2).combinations::<[usize; 2]>();
    |                                       ^^^^^^^^^^^^ expected 1 const argument

error[E0107]: wrong number of type arguments: expected 0, found 1
   --> src\lib.rs:144:54
    |
144 |         let mut combinations = (1..2).combinations::<[usize; 2]>();
    |                                                      ^^^^^^^^^^ unexpected type argument

Expected behavior

Providing a hint on how to correctly define const generics would be immensely helpful. I'm sure I'll be able to figure out the syntax for this eventually (currently going through #78460 among others), but given we're set for a 1.51 stabilization of min_const_generics I suspect more people will be running into this soon.

Further Considerations

I was looking at how hints work for e.g. missing type params in collect, and noticed no hints are provided there either. It only explains what to do, not showing how to do it. For something that's notoriously tricky to learn that seems like it could benefit from hints as well.

let x = (1..5).collect();
error[E0282]: type annotations needed
 --> src/main.rs:2:9
  |
2 |     let x = (1..5).collect();
  |         ^ consider giving `x` a type

Activity

changed the title [-]Diagnostics hint for const generics missing[/-] [+]Diagnostics hint for const generics[/+] on Dec 30, 2020
yoshuawuyts

yoshuawuyts commented on Dec 30, 2020

@yoshuawuyts
MemberAuthor

Found the solution to my bug by the way. This did the trick:

let mut combinations = (1..2).combinations::<2>();
assert_eq!(combinations.next(), None);

I think it's fair to say that the diagnostics were not a great help here. And in particular providing the wrong param ([usize; 2]) yielded confusing diagnostics.

lcnr

lcnr commented on Dec 30, 2020

@lcnr
Contributor

error[E0282]: type annotations needed
--> src\lib.rs:144:32
|
144 | let mut combinations = (1..2).combinations();
| ^^^^^^^^^^^^^^^^^^^^^
|
= note: unable to infer the value of a const parameter

can you provide a full example for this? we should emit a suggestion to use a const arg here.
For example in https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=dd05e205a3af777ec388a4dba98e66e8

added
A-const-genericsArea: const generics (parameters and arguments)
A-diagnosticsArea: Messages for errors, warnings, and lints
A-suggestion-diagnosticsArea: Suggestions generated by the compiler applied by `cargo fix`
D-terseDiagnostics: An error or lint that doesn't give enough information about the problem at hand.
T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.
on Dec 30, 2020
added
C-enhancementCategory: An issue proposing an enhancement or a PR with one.
on Dec 30, 2020
yoshuawuyts

yoshuawuyts commented on Dec 30, 2020

@yoshuawuyts
MemberAuthor

Oh wow, the diagnostics for array_windows is heaps better! A full implementation of const Iterator::combinations can be found here: https://github.com/yoshuawuyts/const-combinations/blob/main/src/lib.rs

added a commit that references this issue on Jan 5, 2021
be2a3f8
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-const-genericsArea: const generics (parameters and arguments)A-diagnosticsArea: Messages for errors, warnings, and lintsA-suggestion-diagnosticsArea: Suggestions generated by the compiler applied by `cargo fix`C-enhancementCategory: An issue proposing an enhancement or a PR with one.D-terseDiagnostics: An error or lint that doesn't give enough information about the problem at hand.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

        Participants

        @yoshuawuyts@varkor@JohnTitor@lcnr

        Issue actions

          Diagnostics hint for const generics · Issue #80506 · rust-lang/rust