Skip to content

GAT ICE: impl item and trait item have different parameter counts #68648

Closed
Listed in
@DutchGhost

Description

@DutchGhost
Contributor

The following ICE's:

#![feature(generic_associated_types)]

trait Fun {
    type F<'a>;
    
    fn identity<'a>(t: Self::F<'a>) -> Self::F<'a> { t }
}

impl <T> Fun for T {
    type F<'a> = Self;
}

fn bug<'a, T: Fun<F = T>>(t: T) -> T::F<'a> {
    T::identity(t)
}


fn main() {
    let x = 10;
    
    bug(x);
}
Backtrace:
error: internal compiler error: impl item and trait item have different parameter counts

thread 'rustc' panicked at 'no errors encountered even though `delay_span_bug` issued', src/librustc_errors/lib.rs:357:17
stack backtrace:
   0: backtrace::backtrace::libunwind::trace
             at /cargo/registry/src/github.tiyicn.workers.dev-1ecc6299db9ec823/backtrace-0.3.40/src/backtrace/libunwind.rs:88
   1: backtrace::backtrace::trace_unsynchronized
             at /cargo/registry/src/github.tiyicn.workers.dev-1ecc6299db9ec823/backtrace-0.3.40/src/backtrace/mod.rs:66
   2: std::sys_common::backtrace::_print_fmt
             at src/libstd/sys_common/backtrace.rs:77
   3: <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt
             at src/libstd/sys_common/backtrace.rs:59
   4: core::fmt::write
             at src/libcore/fmt/mod.rs:1052
   5: std::io::Write::write_fmt
             at src/libstd/io/mod.rs:1426
   6: std::sys_common::backtrace::_print
             at src/libstd/sys_common/backtrace.rs:62
   7: std::sys_common::backtrace::print
             at src/libstd/sys_common/backtrace.rs:49
   8: std::panicking::default_hook::{{closure}}
             at src/libstd/panicking.rs:204
   9: std::panicking::default_hook
             at src/libstd/panicking.rs:224
  10: rustc_driver::report_ice
  11: std::panicking::rust_panic_with_hook
             at src/libstd/panicking.rs:476
  12: std::panicking::begin_panic
  13: <rustc_errors::HandlerInner as core::ops::drop::Drop>::drop
  14: core::ptr::drop_in_place
  15: <alloc::rc::Rc<T> as core::ops::drop::Drop>::drop
  16: core::ptr::drop_in_place
  17: rustc_interface::interface::run_compiler_in_existing_thread_pool
  18: scoped_tls::ScopedKey<T>::set
  19: syntax::with_globals
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

error: internal compiler error: unexpected panic

note: the compiler unexpectedly panicked. this is a bug.

note: we would appreciate a bug report: https://github.com/rust-lang/rust/blob/master/CONTRIBUTING.md#bug-reports

note: rustc 1.42.0-nightly (3761dcd34 2020-01-28) running on x86_64-unknown-linux-gnu

note: compiler flags: -C opt-level=3 -C codegen-units=1 --crate-type bin

note: some of the compiler flags provided by cargo are hidden

query stack during panic:
end of query stack
error: could not compile `playground`.

Activity

added
C-bugCategory: This is a bug.
I-ICEIssue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️
requires-nightlyThis issue requires a nightly compiler in some way.
T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.
on Jan 29, 2020
casey

casey commented on Sep 21, 2020

@casey
Contributor

I believe that I'm hitting this with very similar code. Is there a workaround, or different way of phrasing the same thing that avoids the ICE?

TheRawMeatball

TheRawMeatball commented on Jan 18, 2021

@TheRawMeatball

I'm also running into this issue, but I can't see what the error in this code is. Can someone please explain why this code is wrong?

DutchGhost

DutchGhost commented on Jan 18, 2021

@DutchGhost
ContributorAuthor

Funny, it can trip up LLVM as well:

#![feature(generic_associated_types)]

trait Fun {
    type F<'a>;
    
    fn identity<'a>(t: Self::F<'a>) -> Self::F<'a> { t }
}

impl <T: 'static> Fun for T {
    type F<'a> = &'a Self;
}

fn bug<'a, T: Fun<F = T>>(t: T) -> T::F<'a> {
    T::identity(t)
}


fn main() {
    let x = 10;
    
    bug(x);
}
Invalid bitcast
  %3 = bitcast i32 %0 to i32*, !dbg !184
Function return type does not match operand type of return inst!
  ret i32* %4, !dbg !185
 i32in function _ZN10playground3bug17h6ed92295a28c5703E
LLVM ERROR: Broken function found, compilation aborted!
error: could not compile `playground`
added 2 commits that reference this issue on Feb 5, 2021

Rollup merge of rust-lang#79554 - b-naber:generic-associated-types-in…

9096865

Rollup merge of rust-lang#79554 - b-naber:generic-associated-types-in…

deec6a9
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)C-bugCategory: This is a bug.F-generic_associated_types`#![feature(generic_associated_types)]` a.k.a. GATsI-ICEIssue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.glacierICE tracked in rust-lang/glacier.requires-nightlyThis issue requires a nightly compiler in some way.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      Participants

      @casey@jonas-schievink@TheRawMeatball@fmease@DutchGhost

      Issue actions

        GAT ICE: impl item and trait item have different parameter counts · Issue #68648 · rust-lang/rust