Skip to content

ICE: parallel compiler: attempted to read from stolen value: rustc_middle::thir::Thir : -Zthir-unsafeck=yes #111520

@matthiaskrgr

Description

@matthiaskrgr

Code

you need parallel compiler config to reproduce this!

rustc -Zthreads=300 -ooutputfile -Zthir-unsafeck=yes -Zdump-mir-dir=a file.rs

// FamilyType (GAT workaround) pub trait FamilyLt<'a> { type Out; } struct RefMutFamily<T>(std::marker::PhantomData<T>, ()); impl<'a, T: 'a> FamilyLt<'a> for RefMutFamily<T> { type Out = &'a mut T; } pub trait Execute { type E: Inject; fn execute(self, value: <<Self::E as Inject>::I as FamilyLt>::Out); } pub trait Inject where Self: Sized, { type I: for<'a> FamilyLt<'a>; fn inject(_: &()) -> <Self::I as FamilyLt>::Out; } impl<T: 'static> Inject for RefMutFamily<T> { type I = Self; fn inject(_: &()) -> <Self::I as FamilyLt>::Out { unimplemented!() } } // This struct is only used to give a hint to the compiler about the type `Q` struct Annotate<Q>(std::marker::PhantomData<Q>); impl<Q> Annotate<Q> { fn new() -> Self { Self(std::marker::PhantomData) } } // This function annotate a closure so it can have Higher-Rank Lifetime Bounds // // See 'annotate' workaround: https://github.com/rust-lang/rust/issues/58052 fn annotate<F, Q>(_q: Annotate<Q>, func: F) -> impl Execute + 'static where F: for<'r> FnOnce(<<Q as Inject>::I as FamilyLt<'r>>::Out) + 'static, Q: Inject + 'static, { let wrapper: Wrapper<Q, F> = Wrapper(std::marker::PhantomData, func); wrapper } struct Wrapper<Q, F>(std::marker::PhantomData<Q>, F); impl<Q, F> Execute for Wrapper<Q, F> where Q: Inject, F: for<'r> FnOnce(<<Q as Inject>::I as FamilyLt<'r>>::Out), { type E = Q; fn execute(self, value: <<Self::E as Inject>::I as FamilyLt>::Out) { (self.1)(value) } } struct Task { _processor: Box<dyn FnOnce()>, } // This function consume the closure fn task<P>(processor: P) -> Task where P: Execute + 'static { Task { _processor: Box::new(move || { let q = P::E::inject(&()); processor.execute(q); }) } } fn main() { task(annotate( Annotate::<RefMutFamily<usize>>::new(), |value: &mut usize| { *value = 2; } )); }

Meta

rustc --version --verbose:

<version> 

Error output

4a59ba4d54a3ec0d8ea1e82b7eeb5c8b0162de04 
Backtrace

<backtrace> 

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-parallel-compilerArea: parallel compilerC-bugCategory: This is a bug.I-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.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions