Skip to content

Confusing error message for missing associated type #66380

Closed
@amunra

Description

@amunra

I have encountered associated types for the first time through a build error.

Associated types are used infrequently and other programmers will probably encounter the feature for the first time in a similar manner.

The error was particularly confusing because I thought that I was asked to provide a generic type to a type that was not generic. I was left rather puzzled.

It would be particularly helpful if in this instance the compiler could use information passed in from the single call point (i.e., from main) to suggest a fix (Feather<Error=String>).

The error message:

error[E0191]: the value of the associated type `Error` (from the trait `Feather`) must be specified
  --> src/main.rs:22:83
   |
3  |     type Error;
   |     ----------- `Error` defined here
...
22 | fn pick_feather<'a>(first: bool, f1: &'a dyn Feather, f2: &'a dyn Feather) -> &'a dyn Feather {
   |                                                                                   ^^^^^^^^^^^ associated type `Error` must be specified

A short program to replicate the error message:

trait Feather {
    type Error;

    fn float(&self, x: i32, y: Self::Error) -> Result<i32, Self::Error> {
        if x > 0 {
            Ok(x)
        }
        else {
            Err(y)
        }
    }
}

struct RedFeather {}
impl Feather for RedFeather {
    type Error = String;
}

struct BlueFeather {}
impl Feather for BlueFeather {
    type Error = String;
}

fn pick_feather<'a>(first: bool, f1: &'a dyn Feather, f2: &'a dyn Feather) -> &'a dyn Feather {
    if first {
        f1
    }
    else {
        f2
    }
}

fn main() {
    let red = RedFeather {};
    let blue = BlueFeather {};
    let feather = pick_feather(false, &red, &red);
    feather.float(3, "oh no".to_owned()).unwrap();
}

Ideally, the final suggestion would read:

fn pick_feather<'a>(
    first: bool,
    f1: &'a dyn Feather<Error=String>,
    f2: &'a dyn Feather<Error=String>) -> &'a dyn Feather<Error=String> {

Activity

added
A-associated-itemsArea: Associated items (types, constants & functions)
A-diagnosticsArea: Messages for errors, warnings, and lints
C-enhancementCategory: An issue proposing an enhancement or a PR with one.
T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.
on Nov 13, 2019
added
A-suggestion-diagnosticsArea: Suggestions generated by the compiler applied by `cargo fix`
D-newcomer-roadblockDiagnostics: Confusing error or lint; hard to understand for new users.
on Nov 13, 2019
estebank

estebank commented on Dec 12, 2019

@estebank
Contributor

Would the following output (as given by #67268) have been enough to help you figure things out?

error[E0191]: the value of the associated type `Error` (from trait `Feather`) must be specified
  --> file12.rs:24:87
   |
2  |     type Error;
   |     ----------- `Error` defined here
...
24 | fn pick_feather<'a>(first: bool, f1: &'a dyn Feather, f2: &'a dyn Feather) -> &'a dyn Feather {
   |                                                                                       ^^^^^^^ help: specify the associated type: `Feather<Error = Type>`

error[E0191]: the value of the associated type `Error` (from trait `Feather`) must be specified
  --> file12.rs:24:46
   |
2  |     type Error;
   |     ----------- `Error` defined here
...
24 | fn pick_feather<'a>(first: bool, f1: &'a dyn Feather, f2: &'a dyn Feather) -> &'a dyn Feather {
   |                                              ^^^^^^^ help: specify the associated type: `Feather<Error = Type>`

error[E0191]: the value of the associated type `Error` (from trait `Feather`) must be specified
  --> file12.rs:24:67
   |
2  |     type Error;
   |     ----------- `Error` defined here
...
24 | fn pick_feather<'a>(first: bool, f1: &'a dyn Feather, f2: &'a dyn Feather) -> &'a dyn Feather {
   |                                                                   ^^^^^^^ help: specify the associated type: `Feather<Error = Type>`

error: aborting due to 3 previous errors

added a commit that references this issue on Dec 20, 2019

Rollup merge of rust-lang#67268 - estebank:assoc-types, r=oli-obk

28a724e

5 remaining items

Loading
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-associated-itemsArea: Associated items (types, constants & functions)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-newcomer-roadblockDiagnostics: Confusing error or lint; hard to understand for new users.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

      Participants

      @amunra@estebank@jonas-schievink

      Issue actions

        Confusing error message for missing associated type · Issue #66380 · rust-lang/rust