File tree Expand file tree Collapse file tree 2 files changed +44
-0
lines changed Expand file tree Collapse file tree 2 files changed +44
-0
lines changed Original file line number Diff line number Diff line change 1+ // Copyright 2018 The Rust Project Developers. See the COPYRIGHT
2+ // file at the top-level directory of this distribution and at
3+ // http://rust-lang.org/COPYRIGHT.
4+ //
5+ // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+ // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+ // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+ // option. This file may not be copied, modified, or distributed
9+ // except according to those terms.
10+
11+ #![ feature( generators, generator_trait, box_leak) ]
12+
13+ use std:: cell:: RefCell ;
14+ use std:: ops:: Generator ;
15+
16+ fn main ( ) {
17+ let ( cell, mut gen) ;
18+ cell = Box :: new ( RefCell :: new ( 0 ) ) ;
19+ let ref_ = Box :: leak ( Box :: new ( Some ( cell. borrow_mut ( ) ) ) ) ;
20+ // the upvar is the non-dropck `&mut Option<Ref<'a, i32>>`.
21+ gen = || {
22+ // but the generator can use it to drop a `Ref<'a, i32>`.
23+ let _d = ref_. take ( ) ; //~ ERROR `ref_` does not live long enough
24+ yield ;
25+ } ;
26+ gen. resume ( ) ;
27+ // drops the RefCell and then the Ref, leading to use-after-free
28+ }
Original file line number Diff line number Diff line change 1+ error[E0597]: `ref_` does not live long enough
2+ --> $DIR/dropck.rs:23:18
3+ |
4+ 21 | gen = || {
5+ | -- capture occurs here
6+ 22 | // but the generator can use it to drop a `Ref<'a, i32>`.
7+ 23 | let _d = ref_.take(); //~ ERROR `ref_` does not live long enough
8+ | ^^^^ borrowed value does not live long enough
9+ ...
10+ 28 | }
11+ | - borrowed value dropped before borrower
12+ |
13+ = note: values in a scope are dropped in the opposite order they are created
14+
15+ error: aborting due to previous error
16+
You can’t perform that action at this time.
0 commit comments