Skip to content

ICE: "broken MIR in DefId" when assigning mismatched closure to FnMut  #53448

@earthengine

Description

@earthengine

The following code

#![feature(unboxed_closures)]

trait Lt<'a> {
    type T;
}
impl<'a> Lt<'a> for () {
    type T = ();
}

fn main() {
    let v:<() as Lt<'_>>::T = ();
    let f:&mut FnMut<(_,),Output=()> = &mut |_:<() as Lt<'_>>::T|{};
    f(v);
}

causes panic with message

cannot access a scoped thread local variable without calling `set` first

which is irrelevant to the code. Simply modify link_binary function in src\librustc_codegen_llvm\back\link.rs to make it panic before return, will then output some result that says

query stack during panic:
end of query stack
error: internal compiler error: broken MIR in DefId(0/0:7 ~ hrtb_fn_parameters[317d]::main[0]) (_7 = &mut (*_2)): bad assignment (&mut dyn std::ops::FnMut(()) = &mut dyn std::ops::FnMut(<() as Lt<'_>>::T)): NoSolution
  --> src/test\run-pass\hrtb-fn-parameters.rs:23:5
   |
23 |     f(v);
   |   

This is a variation of #53420 aka #29997, but is more serious and we should fix this first to make it at least emit the real error.

The proper fix of this issue, is NOT to make the code above compile; instead, it should give ICE with proper messages instead of something irrelevant so that we ensure we can get useful information from ICEs all the time, and the ICE is to be fixed after #53420 aka #29997.

Activity

changed the title [-]Compiler unexpected panic when MIRI verification fail in a certain situation[/-] [+]ICE with code irrelevant message - cannot access a scoped thread local variable without calling `set` first[/+] on Aug 22, 2018
earthengine

earthengine commented on Aug 31, 2018

@earthengine
Author

New error messages after PR #53624 :

error: internal compiler error: broken MIR in DefId(0/0:7 ~ playground[3845]::main[0]) (_7 = &mut (*_2)): bad assignment (&mut dyn std::ops::FnMut(()) = &mut dyn std::ops::FnMut(<() as Lt<'_>>::T)): NoSolution
  --> src/main.rs:13:5
   |
13 |     f(v);
   | 
added
I-ICEIssue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️
on Aug 31, 2018
added
A-NLLArea: Non-lexical lifetimes (NLL)
NLL-completeWorking towards the "valid code works" goal
and removed
NLL-completeWorking towards the "valid code works" goal
on Sep 2, 2018
matthewjasper

matthewjasper commented on Sep 2, 2018

@matthewjasper
Contributor

Marking with A-NLL since this is an issue with MIR typeck, even though this happens without nll.

added
T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.
A-MIRArea: Mid-level IR (MIR) - https://blog.rust-lang.org/2016/04/19/MIR.html
on Sep 18, 2018
pnkfelix

pnkfelix commented on Sep 18, 2018

@pnkfelix
Member

self-assigning for preliminary investigation

self-assigned this
on Sep 18, 2018

1 remaining item

removed
A-NLLArea: Non-lexical lifetimes (NLL)
on Sep 25, 2018
changed the title [-]ICE with code irrelevant message - cannot access a scoped thread local variable without calling `set` first[/-] [+]ICE: "broken MIR in DefId" when assigning mismatched closure to `FnMut` [/+] on Oct 4, 2018
pnkfelix

pnkfelix commented on May 17, 2019

@pnkfelix
Member

the bug described here should block any hypothetical stabilization of unbox closures, cc: #29625

but since that is an unstable feature, and the bug here seems isolated to people making use of that feature, I'm going to triage this as P-medium for now.

added
E-needs-testCall for participation: An issue has been fixed and does not reproduce, but no test has been added.
on Oct 7, 2020
JohnTitor

JohnTitor commented on Oct 7, 2020

@JohnTitor
Member

Triage: This is no longer ICE with the latest nightly, marking as E-needs-test.

added a commit that references this issue on Oct 14, 2020
5565241
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

A-MIRArea: Mid-level IR (MIR) - https://blog.rust-lang.org/2016/04/19/MIR.htmlA-closuresArea: Closures (`|…| { … }`)C-bugCategory: This is a bug.E-needs-testCall for participation: An issue has been fixed and does not reproduce, but no test has been added.F-unboxed_closures`#![feature(unboxed_closures)]`I-ICEIssue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️P-mediumMedium priorityT-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

    Participants

    @pnkfelix@oli-obk@Centril@jonas-schievink@earthengine

    Issue actions

      ICE: "broken MIR in DefId" when assigning mismatched closure to `FnMut` · Issue #53448 · rust-lang/rust