diff options
Diffstat (limited to 'tests/ui/consts/qualif-indirect-mutation-fail.rs')
-rw-r--r-- | tests/ui/consts/qualif-indirect-mutation-fail.rs | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/tests/ui/consts/qualif-indirect-mutation-fail.rs b/tests/ui/consts/qualif-indirect-mutation-fail.rs new file mode 100644 index 000000000..a6d293404 --- /dev/null +++ b/tests/ui/consts/qualif-indirect-mutation-fail.rs @@ -0,0 +1,64 @@ +// compile-flags: --crate-type=lib +#![feature(const_mut_refs)] +#![feature(const_precise_live_drops)] +#![feature(const_swap)] +#![feature(raw_ref_op)] + +// 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); +} |