| // Ensure that *any* assignment to the return place of a value with interior mutability | |
| // disqualifies it from promotion. | |
| use std::cell::Cell; | |
| const X: Option<Cell<i32>> = { | |
| let mut x = None; | |
| if false { | |
| x = Some(Cell::new(4)); | |
| } | |
| x | |
| }; | |
| const Y: Option<Cell<i32>> = { | |
| let mut y = Some(Cell::new(4)); | |
| if true { | |
| y = None; | |
| } | |
| y | |
| }; | |
| const Z: Option<Cell<i32>> = { | |
| let mut z = None; | |
| let mut i = 0; | |
| while i < 10 { | |
| if i == 8 { | |
| z = Some(Cell::new(4)); | |
| } | |
| if i == 9 { | |
| z = None; | |
| } | |
| i += 1; | |
| } | |
| z | |
| }; | |
| fn main() { | |
| let x: &'static _ = &X; //~ ERROR temporary value dropped while borrowed | |
| let y: &'static _ = &Y; //~ ERROR temporary value dropped while borrowed | |
| let z: &'static _ = &Z; //~ ERROR temporary value dropped while borrowed | |
| } |