summaryrefslogtreecommitdiffstats
path: root/tests/ui/consts/qualif-indirect-mutation-fail.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/consts/qualif-indirect-mutation-fail.rs')
-rw-r--r--tests/ui/consts/qualif-indirect-mutation-fail.rs64
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);
+}