File tree 2 files changed +44
-0
lines changed
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