| //@ compile-flags: --crate-type=lib | |
| #![feature(const_precise_live_drops)] | |
| #![feature(const_swap)] | |
| // Mutable borrow of a field with drop impl. | |
| pub const fn f() { | |
| let mut a: (u32, Option<String>) = (0, None); //~ ERROR destructor of | |
| let _ = &mut a.1; | |
| } | |
| // Mutable borrow of a type with drop impl. | |
| pub const A1: () = { | |
| let mut x = None; //~ ERROR destructor of | |
| let mut y = Some(String::new()); | |
| let a = &mut x; | |
| let b = &mut y; | |
| std::mem::swap(a, b); | |
| std::mem::forget(y); | |
| }; | |
| // Mutable borrow of a type with drop impl. | |
| pub const A2: () = { | |
| let mut x = None; | |
| let mut y = Some(String::new()); | |
| let a = &mut x; | |
| let b = &mut y; | |
| std::mem::swap(a, b); | |
| std::mem::forget(y); | |
| let _z = x; //~ ERROR destructor of | |
| }; | |
| // Shared borrow of a type that might be !Freeze and Drop. | |
| pub const fn g1<T>() { | |
| let x: Option<T> = None; //~ ERROR destructor of | |
| let _ = x.is_some(); | |
| } | |
| // Shared borrow of a type that might be !Freeze and Drop. | |
| pub const fn g2<T>() { | |
| let x: Option<T> = None; | |
| let _ = x.is_some(); | |
| let _y = x; //~ ERROR destructor of | |
| } | |
| // Mutable raw reference to a Drop type. | |
| pub const fn address_of_mut() { | |
| let mut x: Option<String> = None; //~ ERROR destructor of | |
| &raw mut x; | |
| let mut y: Option<String> = None; //~ ERROR destructor of | |
| std::ptr::addr_of_mut!(y); | |
| } | |
| // Const raw reference to a Drop type. Conservatively assumed to allow mutation | |
| // until resolution of https://github.com/rust-lang/rust/issues/56604. | |
| pub const fn address_of_const() { | |
| let x: Option<String> = None; //~ ERROR destructor of | |
| &raw const x; | |
| let y: Option<String> = None; //~ ERROR destructor of | |
| std::ptr::addr_of!(y); | |
| } |