Skip to content

Borrow checker's strange error. #57404

Closed

Description

@cheblin
#![feature(unboxed_closures)]
#![feature(const_vec_new)]
#![feature(fn_traits)]

pub struct PackBytes;

static mut HANDLERS: Vec<Box<dyn FnMut<&mut PackBytes, Output=()>>> = Vec::new();

fn main() {
    
    let mut pack = PackBytes;
    unsafe { HANDLERS[0].as_mut().call_mut(&mut pack); }
}
error[E0597]: `pack` does not live long enough
  --> src/main.rs:15:35
   |
15 |     HANDLERS[0].as_mut().call_mut(&mut pack); }
   |     ------------------------------^^^^^^^^^-
   |     |                             |
   |     |                             borrowed value does not live long enough
   |     argument requires that `pack` is borrowed for `'static`
16 | }
   | - `pack` dropped here while still borrowed

#![feature(unboxed_closures)]
#![feature(const_vec_new)]
#![feature(fn_traits)]
pub struct PackBytes;



static mut HANDLERS: Vec<Box<dyn for<'a> FnMut<&'a mut PackBytes, Output=()>>> = Vec::new();

fn main() {
    
    let mut pack = PackBytes;
    unsafe { HANDLERS[0].as_mut().call_mut(&mut pack); }
}
error: internal compiler error: src/librustc_codegen_llvm/abi.rs:433: argument to function with "rust-call" ABI is not a tuple

thread 'rustc' panicked at 'Box<Any>', src/librustc_errors/lib.rs:590:9
note: Run with `RUST_BACKTRACE=1` environment variable to display a backtrace.
error: aborting due to previous error


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.33.0-nightly (b92552d55 2019-01-06) running on x86_64-unknown-linux-gnu

note: compiler flags: -C codegen-units=1 -C debuginfo=2 --crate-type bin

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

Activity

  1. changed the title [-]Borrow checker strange error.[/-] [+]Borrow checker's strange error.[/+] on Jan 7, 2019
  2. hellow554 commented on Jan 7, 2019

    @hellow554
    Contributor

    Reduced example

    #![feature(unboxed_closures)]
    #![feature(fn_traits)]
    
    fn main() {
        let handlers: Option<Box<dyn for<'a> FnMut<&'a mut (), Output=()>>> = None;
        handlers.unwrap().as_mut().call_mut(&mut ());
    }
  3. cheblin commented on Jan 7, 2019

    @cheblin
    Author

    this, stripped works

    #![feature(const_vec_new)]
    
    pub struct PackBytes;
    
    static mut HANDLERS: Vec<Box<dyn for<'a> FnMut(&'a mut PackBytes) -> ()>> = Vec::new();
    
    fn main() {
        
        let mut pack = PackBytes;
        unsafe { (HANDLERS[0].as_mut())(&mut pack); }
    }
    
  4. reopened this on Jan 7, 2019
  5. cheblin commented on Jan 7, 2019

    @cheblin
    Author
  6. scalexm commented on Jan 7, 2019

    @scalexm
    Contributor

    The first compilation error -- the example with static mut HANDLERS: Vec<Box<dyn FnMut<&mut PackBytes, Output=()>>> = Vec::new(); looks fine to me. Types used for static variables must outlive the 'static lifetime. The compiler can prove that dyn FnMut<&'b mut PackBytes> + 'a outlives 'static only if 'a == 'b == 'static. Hence 'static lifetimes are inferred in lieu of the anonymous lifetimes. Since your pack variable does not live for the whole 'static lifetime, it cannot be used as you are trying to.

    Maybe the actual bug is that dyn FnMut<&T, Output=()> should desugar to dyn for<'a> FnMut<&'a T, Output=()>, as it would be for dyn FnMut(&T)? It may be weird to special-case only the Fn/FnMut/FnOnce traits though -- i.e. if you define your own trait trait Foo<T> { }, then Foo<&i32> just means Foo<&'b i32> for some lifetime 'b to be inferred by the compiler, it does not mean for<'a> Foo<&'a i32>.

    Your reduced example is actually different since it actually does not involve static data. It seems to be the same bug as in #22565, and hence is a bug with the unboxed_closure feature.

    Going from FnMut<&'a mut (), Output=()> to FnMut<(&'a mut (),), Output=()> (note the tuple of size 1) makes the ICE go away.

  7. added
    A-codegenArea: Code generation
    I-ICEIssue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️
    A-MIRArea: Mid-level IR (MIR) - https://blog.rust-lang.org/2016/04/19/MIR.html
    A-const-evalArea: Constant evaluation, covers all const contexts (static, const fn, ...)
    on Jan 19, 2019
  8. added
    C-bugCategory: This is a bug.
    T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.
    on Aug 6, 2019
  9. added
    requires-nightlyThis issue requires a nightly compiler in some way. When possible, use a F-* label instead.
    on Oct 25, 2019
  10. Alexendoo commented on Nov 9, 2022

    @Alexendoo
    Member

    Fixed by #99943

  11. added
    E-needs-testCall for participation: An issue has been fixed and does not reproduce, but no test has been added.
    on Nov 9, 2022
  12. added a commit that references this issue on Dec 20, 2022
  13. added a commit that references this issue on Dec 20, 2022
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-MIRArea: Mid-level IR (MIR) - https://blog.rust-lang.org/2016/04/19/MIR.htmlA-borrow-checkerArea: The borrow checkerA-closuresArea: Closures (`|…| { … }`)A-codegenArea: Code generationA-const-evalArea: Constant evaluation, covers all const contexts (static, const fn, ...)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) ❄️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. When possible, use a F-* label instead.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions