summaryrefslogtreecommitdiffstats
path: root/src/test/ui/issues/issue-39827.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/issues/issue-39827.rs')
-rw-r--r--src/test/ui/issues/issue-39827.rs34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/test/ui/issues/issue-39827.rs b/src/test/ui/issues/issue-39827.rs
new file mode 100644
index 000000000..782c668c8
--- /dev/null
+++ b/src/test/ui/issues/issue-39827.rs
@@ -0,0 +1,34 @@
+// run-pass
+#![feature(core_intrinsics)]
+
+use std::intrinsics::{ volatile_copy_memory, volatile_store, volatile_load,
+ volatile_copy_nonoverlapping_memory,
+ volatile_set_memory };
+
+//
+// This test ensures that volatile intrinsics can be specialised with
+// zero-sized types and, in case of copy/set functions, can accept
+// number of elements equal to zero.
+//
+fn main () {
+ let mut dst_pair = (1, 2);
+ let src_pair = (3, 4);
+ let mut dst_empty = ();
+ let src_empty = ();
+
+ const COUNT_0: usize = 0;
+ const COUNT_100: usize = 100;
+
+ unsafe {
+ volatile_copy_memory(&mut dst_pair, &dst_pair, COUNT_0);
+ volatile_copy_nonoverlapping_memory(&mut dst_pair, &src_pair, 0);
+ volatile_copy_memory(&mut dst_empty, &dst_empty, 100);
+ volatile_copy_nonoverlapping_memory(&mut dst_empty, &src_empty,
+ COUNT_100);
+ volatile_set_memory(&mut dst_empty, 0, COUNT_100);
+ volatile_set_memory(&mut dst_pair, 0, COUNT_0);
+ volatile_store(&mut dst_empty, ());
+ volatile_store(&mut dst_empty, src_empty);
+ volatile_load(&src_empty);
+ }
+}