Skip to content

Broken MIR in DefId (TerminatorKind::Call with GATs) #131373

@racharron

Description

@racharron

Code

struct Ref<T>(T);

trait Reference: 'static {
    type Ref<'a>;
    fn get_ref(&self) -> Self::Ref<'_>;
}

trait Lock: 'static {
    type Locked<'a>;
    fn locked(&self) -> Self::Locked<'_>;
}

struct SliceRef<'a, T: ?Sized> {
    inner: &'a T
}

impl<'a, 'b, T: ?Sized, SR: Reference> IntoIterator for &'b SliceRef<'a, T> where &'a T: IntoIterator<Item=&'a SR> {
    type Item = SR::Ref<'a>;
    type IntoIter = std::iter::Map<<&'a T as IntoIterator>::IntoIter, for<'c> fn(&'c SR) -> SR::Ref<'c>>;
    fn into_iter(self) -> Self::IntoIter {
        self.inner.into_iter().map(|cr| { cr.get_ref() })
    }
}

impl<SR: Reference> Reference for Vec<SR> {
    type Ref<'a> = SliceRef<'a, [SR]>;
    fn get_ref(&self) -> Self::Ref<'_> {
        SliceRef {
            inner: &**self,
        }
    }
}

impl<SR: Reference> Lock for Ref<SR> {
    type Locked<'a> = SR::Ref<'a>;
    fn locked(&self) -> Self::Locked<'_> {
        self.0.get_ref()
    }
}

impl Reference for () {
    type Ref<'a> = &'a ();
    fn get_ref(&self) -> Self::Ref<'_> {
        unimplemented!()
    }
}

fn main() {
    let data = Ref(Vec::<()>::new());
    let _ = (&data.locked()).into_iter();
}

Meta

rustc --version --verbose:

rustc 1.81.0 (eeb90cda1 2024-09-04)
binary: rustc
commit-hash: eeb90cda1969383f56a2637cbd3037bdf598841c
commit-date: 2024-09-04
host: x86_64-pc-windows-msvc
release: 1.81.0
LLVM version: 18.1.7

Error output

error: internal compiler error: broken MIR in DefId(0:43 ~ tester[0e95]::main) (Terminator { source_info: SourceInfo { span: src/main.rs:50:13: 50:41 (#0), scope: scope[1] }, kind: _3 = <&SliceRef<'_, [()]> as IntoIterator>::into_iter(move _4) -> [return: bb4, unwind: bb6] }): call dest mismatch (std::iter::Map<std::slice::Iter<'?7, ()>, Binder { value: fn(&'^0.Named(DefId(0:26 ~ tester[0e95]::{impl#0}::IntoIter::'c), "'c") ()) -> &'^0.Named(DefId(0:26 ~ tester[0e95]::{impl#0}::IntoIter::'c), "'c") (), bound_vars: [Region(BrNamed(DefId(0:26 ~ tester[0e95]::{impl#0}::IntoIter::'c), 'c))] }> <- std::iter::Map<std::slice::Iter<'?6, ()>, Binder { value: fn(&'^0.Named(DefId(0:26 ~ tester[0e95]::{impl#0}::IntoIter::'c), "'c") ()) -> Alias(Projection, AliasTy { args: [(), '^0.Named(DefId(0:26 ~ tester[0e95]::{impl#0}::IntoIter::'c), "'c")], def_id: DefId(0:8 ~ tester[0e95]::Reference::Ref) }), bound_vars: [Region(BrNamed(DefId(0:26 ~ tester[0e95]::{impl#0}::IntoIter::'c), 'c))] }>): NoSolution
  --> src/main.rs:50:13
   |
50 |     let _ = (&data.locked()).into_iter();
   |             ^^^^^^^^^^^^^^^^
   |
note: delayed at compiler\rustc_borrowck\src\type_check\mod.rs:1571:21
         0: std::backtrace_rs::backtrace::dbghelp64::trace
                   at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library\std\src\..\..\backtrace\src\backtrace\dbghelp64.rs:91
         1: std::backtrace_rs::backtrace::trace_unsynchronized
                   at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library\std\src\..\..\backtrace\src\backtrace\mod.rs:66
         2: std::backtrace::Backtrace::create
                   at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library\std\src\backtrace.rs:331
         3: std::backtrace::Backtrace::capture
                   at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library\std\src\backtrace.rs:296
         4: <rustc_errors::DiagCtxtHandle>::steal_fulfilled_expectation_ids
         5: <rustc_errors::DiagCtxtHandle>::emit_diagnostic
         6: <rustc_span::ErrorGuaranteed as rustc_errors::diagnostic::EmissionGuarantee>::emit_producing_guarantee
         7: <rustc_pattern_analysis::errors::NonExhaustiveOmittedPatternLintOnArm as rustc_errors::diagnostic::LintDiagnostic<()>>::decorate_lint
         8: <rustc_borrowck::type_check::TypeChecker>::push_region_constraints
         9: rustc_borrowck::dataflow::calculate_borrows_out_of_scope_at_location
        10: rustc_borrowck::dataflow::calculate_borrows_out_of_scope_at_location
        11: <rustc_borrowck::type_check::TypeChecker>::push_region_constraints
        12: rustc_borrowck::mir_borrowck
        13: rustc_query_impl::plumbing::query_key_hash_verify_all
        14: rustc_ty_utils::ty::self_ty_of_trait_impl_enabling_order_dep_trait_object_hack
        15: rustc_query_impl::plumbing::query_key_hash_verify_all
        16: rustc_interface::passes::analysis
        17: rustc_ty_utils::ty::adt_sized_constraint
        18: rustc_ty_utils::ty::adt_sized_constraint
        19: rustc_query_impl::query_system
        20: _LNan_C
        21: _LNan_C
        22: _LNan_C
        23: alloc::boxed::impl$48::call_once
                   at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library\alloc\src\boxed.rs:2070
        24: alloc::boxed::impl$48::call_once
                   at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library\alloc\src\boxed.rs:2070
        25: std::sys::pal::windows::thread::impl$0::new::thread_start
                   at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library\std\src\sys\pal\windows\thread.rs:58
        26: BaseThreadInitThunk
        27: RtlUserThreadStart
  --> src/main.rs:50:13
   |
50 |     let _ = (&data.locked()).into_iter();
   |             ^^^^^^^^^^^^^^^^
Backtrace

   Compiling tester v0.1.0 (C:\Users\BLUEM\rust\tester)
note: no errors encountered even though delayed bugs were created                                                                                                                                                                  

note: those delayed bugs will now be shown as internal compiler errors

error: internal compiler error: broken MIR in DefId(0:43 ~ tester[0e95]::main) (Terminator { source_info: SourceInfo { span: src/main.rs:50:13: 50:41 (#0), scope: scope[1] }, kind: _3 = <&SliceRef<'_, [()]> as IntoIterator>::int
o_iter(move _4) -> [return: bb4, unwind: bb6] }): call dest mismatch (std::iter::Map<std::slice::Iter<'?7, ()>, Binder { value: fn(&'^0.Named(DefId(0:26 ~ tester[0e95]::{impl#0}::IntoIter::'c), "'c") ()) -> &'^0.Named(DefId(0:26
 ~ tester[0e95]::{impl#0}::IntoIter::'c), "'c") (), bound_vars: [Region(BrNamed(DefId(0:26 ~ tester[0e95]::{impl#0}::IntoIter::'c), 'c))] }> <- std::iter::Map<std::slice::Iter<'?6, ()>, Binder { value: fn(&'^0.Named(DefId(0:26 ~
 tester[0e95]::{impl#0}::IntoIter::'c), "'c") ()) -> Alias(Projection, AliasTy { args: [(), '^0.Named(DefId(0:26 ~ tester[0e95]::{impl#0}::IntoIter::'c), "'c")], def_id: DefId(0:8 ~ tester[0e95]::Reference::Ref) }), bound_vars: [Region(BrNamed(DefId(0:26 ~ tester[0e95]::{impl#0}::IntoIter::'c), 'c))] }>): NoSolution
  --> src/main.rs:50:13
   |
50 |     let _ = (&data.locked()).into_iter();
   |             ^^^^^^^^^^^^^^^^
   |
note: delayed at compiler\rustc_borrowck\src\type_check\mod.rs:1571:21
         0: std::backtrace_rs::backtrace::dbghelp64::trace
                   at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library\std\src\..\..\backtrace\src\backtrace\dbghelp64.rs:91
         1: std::backtrace_rs::backtrace::trace_unsynchronized
                   at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library\std\src\..\..\backtrace\src\backtrace\mod.rs:66
         2: std::backtrace::Backtrace::create
                   at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library\std\src\backtrace.rs:331
         3: std::backtrace::Backtrace::capture
                   at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library\std\src\backtrace.rs:296
         4: <rustc_errors::DiagCtxtHandle>::steal_fulfilled_expectation_ids
         5: <rustc_errors::DiagCtxtHandle>::emit_diagnostic
         6: <rustc_span::ErrorGuaranteed as rustc_errors::diagnostic::EmissionGuarantee>::emit_producing_guarantee
         7: <rustc_pattern_analysis::errors::NonExhaustiveOmittedPatternLintOnArm as rustc_errors::diagnostic::LintDiagnostic<()>>::decorate_lint
         8: <rustc_borrowck::type_check::TypeChecker>::push_region_constraints
         9: rustc_borrowck::dataflow::calculate_borrows_out_of_scope_at_location
        10: rustc_borrowck::dataflow::calculate_borrows_out_of_scope_at_location
        11: <rustc_borrowck::type_check::TypeChecker>::push_region_constraints
        12: rustc_borrowck::mir_borrowck
        13: rustc_query_impl::plumbing::query_key_hash_verify_all
        14: rustc_ty_utils::ty::self_ty_of_trait_impl_enabling_order_dep_trait_object_hack
        15: rustc_query_impl::plumbing::query_key_hash_verify_all
        16: rustc_interface::passes::analysis
        17: rustc_ty_utils::ty::adt_sized_constraint
        18: rustc_ty_utils::ty::adt_sized_constraint
        19: rustc_query_impl::query_system
        20: _LNan_C
        21: _LNan_C
        22: _LNan_C
        23: alloc::boxed::impl$48::call_once
                   at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library\alloc\src\boxed.rs:2070
        24: alloc::boxed::impl$48::call_once
                   at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library\alloc\src\boxed.rs:2070
        25: std::sys::pal::windows::thread::impl$0::new::thread_start
                   at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library\std\src\sys\pal\windows\thread.rs:58
        26: BaseThreadInitThunk
        27: RtlUserThreadStart
  --> src/main.rs:50:13
   |
50 |     let _ = (&data.locked()).into_iter();
   |             ^^^^^^^^^^^^^^^^

note: we would appreciate a bug report: https://github.com/rust-lang/rust/issues/new?labels=C-bug%2C+I-ICE%2C+T-compiler&template=ice.md

note: rustc 1.81.0 (eeb90cda1 2024-09-04) running on x86_64-pc-windows-msvc

note: compiler flags: --crate-type bin -C embed-bitcode=no -C debuginfo=2 -C incremental=[REDACTED]

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

query stack during panic:
end of query stack
error: could not compile `tester` (bin "tester")

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-GATsArea: Generic associated types (GATs)C-bugCategory: This is a bug.I-ICEIssue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️S-bug-has-testStatus: This bug is tracked inside the repo by a `known-bug` test.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.T-typesRelevant to the types team, which will review and decide on the PR/issue.fixed-by-next-solverFixed by the next-generation trait solver, `-Znext-solver`.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions