Skip to content

Bad diagnostics for GATs in trait paths #81801

Closed

Description

@jackh726

The diagnostics introduced by #77524 are wrong in some cases, e.g. in gat-trait-path-missing-lifetime we get the following stderr:

error[E0107]: missing generics for associated type `X::Y`
 --> src/test/ui/generic-associated-types/gat-trait-path-missing-lifetime.rs:5:8
  |
5 |   type Y<'a>;
  |        ^ expected 1 lifetime argument
  |
note: associated type defined here, with 1 lifetime parameter: `'a`
 --> src/test/ui/generic-associated-types/gat-trait-path-missing-lifetime.rs:5:8
  |
5 |   type Y<'a>;
  |        ^ --
help: use angle brackets to add missing lifetime argument
  |
5 |   type Y<'a><'a>;
  |         ^^^^

error: aborting due to previous error; 1 warning emitted

Originally posted by @b-naber in #79554 (comment)

Activity

  1. added
    A-diagnosticsArea: Messages for errors, warnings, and lints
    requires-nightlyThis issue requires a nightly compiler in some way. When possible, use a F-* label instead.
    on Feb 5, 2021
  2. added
    D-incorrectDiagnostics: A diagnostic that is giving misleading or incorrect information.
    T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.
    on Feb 6, 2021
  3. henryboisdequin commented on Feb 10, 2021

    @henryboisdequin
    Contributor

    The fix to this would be pointing to fn foo<'a, T1: X<Y = T1>>(t : T1) -> T1::Y<'a> and emmiting the error there right?

  4. b-naber commented on Feb 11, 2021

    @b-naber
    Contributor

    The fix to this would be pointing to fn foo<'a, T1: X<Y = T1>>(t : T1) -> T1::Y<'a> and emmiting the error there right?

    Yes.

  5. estebank commented on Feb 14, 2021

    @estebank
    Contributor

    Another case:

    Given:

    #![feature(generic_associated_types)]
    
    // The cyclic dependency between trait A and B compiles as expected
    trait A {
        type BType: B<AType = Self>;
    }
    
    trait B {
        type AType: A<BType = Self>;
    }
    
    // rustc crashes on the generic cyclic dependency between traits C and D
    trait C {
        type DType<T>: D<T, CType = Self>;
    }
    trait D<T> {
        type CType: C<DType = Self>;
    }

    we currently emit

    error[E0107]: missing generics for associated type `C::DType`
      --> src/lib.rs:14:10
       |
    14 |     type DType<T>: D<T, CType = Self>;
       |          ^^^^^ expected 1 type argument
       |
    note: associated type defined here, with 1 type parameter: `T`
      --> src/lib.rs:14:10
       |
    14 |     type DType<T>: D<T, CType = Self>;
       |          ^^^^^ -
    help: use angle brackets to add missing type argument
       |
    14 |     type DType<T><T>: D<T, CType = Self>;
       |               ^^^
    

    where the correct suggestion would be

    
    error[E0107]: missing generics for associated type `C::DType`
      --> src/lib.rs:14:10
       |
    17 |     type CType: C<DType = Self>;
       |                   ^^^^^ expected 1 type argument
       |
    note: associated type defined here, with 1 type parameter: `T`
      --> src/lib.rs:14:10
       |
    14 |     type DType<T>: D<T, CType = Self>;
       |          ^^^^^ -
    help: use angle brackets to add missing type argument
       |
    17 |     type CType: C<DType<T> = Self>;
       |                        ^^^
    

    CC #81712

  6. added
    A-suggestion-diagnosticsArea: Suggestions generated by the compiler applied by `cargo fix`
    D-invalid-suggestionDiagnostics: A structured suggestion resulting in incorrect code.
    A-associated-itemsArea: Associated items (types, constants & functions)
    on Feb 14, 2021
  7. added a commit that references this issue on May 11, 2021
  8. added
    A-GATsArea: Generic associated types (GATs)
    on Nov 2, 2024
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-GATsArea: Generic associated types (GATs)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`D-incorrectDiagnostics: A diagnostic that is giving misleading or incorrect information.D-invalid-suggestionDiagnostics: A structured suggestion resulting in incorrect code.F-generic_associated_types`#![feature(generic_associated_types)]` a.k.a. GATsT-compilerRelevant to the compiler team, which will review and decide on the PR/issue.requires-nightlyThis issue requires a nightly compiler in some way. When possible, use a F-* label instead.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions