Skip to content

error: internal compiler error: /checkout/src/librustc_typeck/check/mod.rs:4419: impossible case reached #43431

Closed

Description

@mwchase

Encountered doing ill-advised type manipulations in the playground. By (mis)using some combination of universal function call syntax, the Fn trait, and other language features, I got an internal compiler error. I then simplified it to the point where it wouldn't make sense even if it didn't hit the error.

Code to reproduce the error:

trait CallSingle<A, B> {
    fn call(&self, a: A) -> B where Self: Fn(A) -> B;
}

impl<A, B, F: Fn(A) -> B> CallSingle<A, B> for F {
    fn call(&self, a: A) -> B {
        <Self as Fn(A) -> B>::call
    }
}

I'm not sure there should be any error it emits beyond what it already does, but this does panic the compiler: error: internal compiler error: /checkout/src/librustc_typeck/check/mod.rs:4419: impossible case reached

Activity

  1. added
    C-bugCategory: This is a bug.
    I-ICEIssue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️
    on Jul 23, 2017
  2. estebank commented on Jul 26, 2017

    @estebank
    Contributor
  3. self-assigned this
    on Jul 26, 2017
  4. petrochenkov commented on Jul 26, 2017

    @petrochenkov
    Contributor

    I have a fix in progress (accidentally), will submit this weekend.

  5. petrochenkov commented on Jul 28, 2017

    @petrochenkov
    Contributor

    #43532 fixes the ICE, but the code still doesn't compile.
    For some reason associated type bindings are prohibited in traits in UFCS-style paths

    <Type as Trait<T = u8 /* <-- can't do this */>>::AssocItem

    and B in Fn(A) -> B is exactly an associated type binding

    <Self as Fn(A) -> B>::call
    // Desugars to
    <Self as Fn<(A,), Output = B>>::call
  6. added a commit that references this issue on Aug 24, 2017
  7. petrochenkov commented on Oct 2, 2017

    @petrochenkov
    Contributor

    Current output:

    #![feature(fn_traits)]
    
    trait CallSingle<A, B> {
        fn call(&self, a: A) -> B where Self: Fn(A) -> B;
    }
    
    impl<A, B, F: Fn(A) -> B> CallSingle<A, B> for F {
        fn call(&self, a: A) -> B {
            <Self as Fn(A) -> B>::call(self, (a,))
        }
    }
    
    fn main() {}
    
    ---
    
       Compiling playground v0.0.1 (file:///playground)
    error[E0229]: associated type bindings are not allowed here
     --> src/main.rs:9:27
      |
    9 |         <Self as Fn(A) -> B>::call(self, (a,))
      |                           ^ associated type not allowed here
    
    error: aborting due to previous error

    I'm closing this because the ICE is fixed and supporting type bindings in value paths (let x = Trait<AssocTy = u8>::method();) is a separate problem, please open a new lang-team issue if you are interested in supporting it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

C-bugCategory: This is a bug.I-ICEIssue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions