]> git.lizzy.rs Git - rust.git/blob - src/test/ui/generator/yield-while-local-borrowed.rs
Auto merge of #54624 - arielb1:evaluate-outlives, r=nikomatsakis
[rust.git] / src / test / ui / generator / yield-while-local-borrowed.rs
1 // Copyright 2017 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 // compile-flags: -Z borrowck=compare
12
13 #![feature(generators, generator_trait)]
14
15 use std::ops::{GeneratorState, Generator};
16 use std::cell::Cell;
17
18 unsafe fn borrow_local_inline() {
19     // Not OK to yield with a borrow of a temporary.
20     //
21     // (This error occurs because the region shows up in the type of
22     // `b` and gets extended by region inference.)
23     let mut b = move || {
24         let a = &mut 3;
25         //~^ ERROR borrow may still be in use when generator yields (Ast)
26         //~| ERROR borrow may still be in use when generator yields (Mir)
27         yield();
28         println!("{}", a);
29     };
30     b.resume();
31 }
32
33 unsafe fn borrow_local_inline_done() {
34     // No error here -- `a` is not in scope at the point of `yield`.
35     let mut b = move || {
36         {
37             let a = &mut 3;
38         }
39         yield();
40     };
41     b.resume();
42 }
43
44 unsafe fn borrow_local() {
45     // Not OK to yield with a borrow of a temporary.
46     //
47     // (This error occurs because the region shows up in the type of
48     // `b` and gets extended by region inference.)
49     let mut b = move || {
50         let a = 3;
51         {
52             let b = &a;
53             //~^ ERROR borrow may still be in use when generator yields (Ast)
54             //~| ERROR borrow may still be in use when generator yields (Mir)
55             yield();
56             println!("{}", b);
57         }
58     };
59     b.resume();
60 }
61
62 fn main() { }