about summary refs log tree commit diff
diff options
context:
space:
mode:
authorDodo <kasper199914@gmail.com>2019-12-20 21:42:03 +0100
committerDodo <kasper199914@gmail.com>2019-12-20 21:42:03 +0100
commit382d370c4f5750900ec8896b3659d7624fe048a0 (patch)
tree449da325635e6a6a2e11f435dc30e97c014cc312
parent6b561b4917e803c4be4ca44d8e552b680cb9e380 (diff)
downloadrust-382d370c4f5750900ec8896b3659d7624fe048a0.tar.gz
rust-382d370c4f5750900ec8896b3659d7624fe048a0.zip
Make ptr::slice_from_raw_parts a const fn available under a feature flag
-rw-r--r--src/libcore/ptr/mod.rs6
-rw-r--r--src/libcore/tests/lib.rs3
-rw-r--r--src/libcore/tests/ptr.rs11
3 files changed, 18 insertions, 2 deletions
diff --git a/src/libcore/ptr/mod.rs b/src/libcore/ptr/mod.rs
index 776165e7bd7..67a64b53b0b 100644
--- a/src/libcore/ptr/mod.rs
+++ b/src/libcore/ptr/mod.rs
@@ -257,7 +257,8 @@ pub(crate) struct FatPtr<T> {
 /// ```
 #[inline]
 #[unstable(feature = "slice_from_raw_parts", reason = "recently added", issue = "36925")]
-pub fn slice_from_raw_parts<T>(data: *const T, len: usize) -> *const [T] {
+#[rustc_const_unstable(feature = "const_slice_from_raw_parts", issue = "67456")]
+pub const fn slice_from_raw_parts<T>(data: *const T, len: usize) -> *const [T] {
     unsafe { Repr { raw: FatPtr { data, len } }.rust }
 }
 
@@ -273,7 +274,8 @@ pub fn slice_from_raw_parts<T>(data: *const T, len: usize) -> *const [T] {
 /// [`from_raw_parts_mut`]: ../../std/slice/fn.from_raw_parts_mut.html
 #[inline]
 #[unstable(feature = "slice_from_raw_parts", reason = "recently added", issue = "36925")]
-pub fn slice_from_raw_parts_mut<T>(data: *mut T, len: usize) -> *mut [T] {
+#[rustc_const_unstable(feature = "const_slice_from_raw_parts", issue = "67456")]
+pub const fn slice_from_raw_parts_mut<T>(data: *mut T, len: usize) -> *mut [T] {
     unsafe { Repr { raw: FatPtr { data, len } }.rust_mut }
 }
 
diff --git a/src/libcore/tests/lib.rs b/src/libcore/tests/lib.rs
index b28ed2eaa08..1f20ebc01e9 100644
--- a/src/libcore/tests/lib.rs
+++ b/src/libcore/tests/lib.rs
@@ -36,6 +36,9 @@
 #![feature(iter_is_partitioned)]
 #![feature(iter_order_by)]
 #![feature(cmp_min_max_by)]
+#![feature(slice_from_raw_parts)]
+#![feature(const_slice_from_raw_parts)]
+#![feature(const_raw_ptr_deref)]
 
 extern crate test;
 
diff --git a/src/libcore/tests/ptr.rs b/src/libcore/tests/ptr.rs
index eea736bc88f..473bc881d29 100644
--- a/src/libcore/tests/ptr.rs
+++ b/src/libcore/tests/ptr.rs
@@ -2,6 +2,17 @@ use core::cell::RefCell;
 use core::ptr::*;
 
 #[test]
+fn test_const_from_raw_parts() {
+    const SLICE: &[u8] = &[1, 2, 3, 4];
+    const FROM_RAW: &[u8] = unsafe { &*slice_from_raw_parts(SLICE.as_ptr(), SLICE.len()) };
+    assert_eq!(SLICE, FROM_RAW);
+
+    let slice = &[1, 2, 3, 4, 5];
+    let from_raw = unsafe { &*slice_from_raw_parts(slice.as_ptr(), 2) } ;
+    assert_eq!(&slice[..2], from_raw);
+}
+
+#[test]
 fn test() {
     unsafe {
         struct Pair {