diff --git a/src/test/ui/borrowck/issue-47215-ice-from-drop-elab.nll.stderr b/src/test/ui/borrowck/issue-47215-ice-from-drop-elab.nll.stderr new file mode 100644 index 0000000000000..255eb757a4989 --- /dev/null +++ b/src/test/ui/borrowck/issue-47215-ice-from-drop-elab.nll.stderr @@ -0,0 +1,12 @@ +error[E0507]: cannot move out of static item + --> $DIR/issue-47215-ice-from-drop-elab.rs:17:21 + | +LL | let mut x = X; //~ ERROR cannot move out of thread-local static item [E0507] + | ^ + | | + | cannot move out of static item + | help: consider borrowing here: `&X` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0507`. diff --git a/src/test/ui/borrowck/issue-47215-ice-from-drop-elab.rs b/src/test/ui/borrowck/issue-47215-ice-from-drop-elab.rs new file mode 100644 index 0000000000000..670c6bb869d59 --- /dev/null +++ b/src/test/ui/borrowck/issue-47215-ice-from-drop-elab.rs @@ -0,0 +1,20 @@ +// rust-lang/rust#47215: at one time, the compiler categorized +// thread-local statics as a temporary rvalue, as a way to enforce +// that they are only valid for a given lifetime. +// +// The problem with this is that you cannot move out of static items, +// but you *can* move temporary rvalues. I.e., the categorization +// above only solves half of the problem presented by thread-local +// statics. + +#![feature(thread_local)] + +#[thread_local] +static mut X: ::std::sync::atomic::AtomicUsize = ::std::sync::atomic::ATOMIC_USIZE_INIT; + +fn main() { + unsafe { + let mut x = X; //~ ERROR cannot move out of thread-local static item [E0507] + let _y = x.get_mut(); + } +} diff --git a/src/test/ui/borrowck/issue-47215-ice-from-drop-elab.stderr b/src/test/ui/borrowck/issue-47215-ice-from-drop-elab.stderr new file mode 100644 index 0000000000000..219a1fd2e7727 --- /dev/null +++ b/src/test/ui/borrowck/issue-47215-ice-from-drop-elab.stderr @@ -0,0 +1,12 @@ +error[E0507]: cannot move out of thread-local static item + --> $DIR/issue-47215-ice-from-drop-elab.rs:17:21 + | +LL | let mut x = X; //~ ERROR cannot move out of thread-local static item [E0507] + | ^ + | | + | cannot move out of thread-local static item + | help: consider using a reference instead: `&X` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0507`.