]> git.lizzy.rs Git - rust.git/commitdiff
test using the Global allocator trait to alloc/free a Box
authorRalf Jung <post@ralfj.de>
Mon, 25 Feb 2019 08:47:34 +0000 (09:47 +0100)
committerRalf Jung <post@ralfj.de>
Mon, 25 Feb 2019 08:47:34 +0000 (09:47 +0100)
tests/run-pass/heap_allocator.rs [new file with mode: 0644]
tests/run-pass/heap_system.rs [deleted file]

diff --git a/tests/run-pass/heap_allocator.rs b/tests/run-pass/heap_allocator.rs
new file mode 100644 (file)
index 0000000..e1aace8
--- /dev/null
@@ -0,0 +1,54 @@
+//ignore-windows: Inspects allocation base address on Windows
+#![feature(allocator_api)]
+
+use std::ptr::NonNull;
+use std::alloc::{Global, Alloc, Layout, System};
+
+fn check_overalign_requests<T: Alloc>(mut allocator: T) {
+    let size = 8;
+    let align = 16; // greater than size
+    let iterations = 1; // Miri is deterministic, no need to try many times
+    unsafe {
+        let pointers: Vec<_> = (0..iterations).map(|_| {
+            allocator.alloc(Layout::from_size_align(size, align).unwrap()).unwrap()
+        }).collect();
+        for &ptr in &pointers {
+            assert_eq!((ptr.as_ptr() as usize) % align, 0,
+                       "Got a pointer less aligned than requested")
+        }
+
+        // Clean up
+        for &ptr in &pointers {
+            allocator.dealloc(ptr, Layout::from_size_align(size, align).unwrap())
+        }
+    }
+}
+
+fn global_to_box() {
+    type T = [i32; 4];
+    let l = Layout::new::<T>();
+    // allocate manually with global allocator, then turn into Box and free there
+    unsafe {
+        let ptr = Global.alloc(l).unwrap().as_ptr() as *mut T;
+        let b = Box::from_raw(ptr);
+        drop(b);
+    }
+}
+
+fn box_to_global() {
+    type T = [i32; 4];
+    let l = Layout::new::<T>();
+    // allocate with the Box, then deallocate manually with global allocator
+    unsafe {
+        let b = Box::new(T::default());
+        let ptr = Box::into_raw(b);
+        Global.dealloc(NonNull::new(ptr as *mut u8).unwrap(), l);
+    }
+}
+
+fn main() {
+    check_overalign_requests(System);
+    check_overalign_requests(Global);
+    global_to_box();
+    box_to_global();
+}
diff --git a/tests/run-pass/heap_system.rs b/tests/run-pass/heap_system.rs
deleted file mode 100644 (file)
index 0eb2097..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-//ignore-windows: Inspects allocation base address on Windows
-#![feature(allocator_api)]
-
-use std::alloc::{Global, Alloc, Layout, System};
-
-fn check_overalign_requests<T: Alloc>(mut allocator: T) {
-    let size = 8;
-    let align = 16; // greater than size
-    let iterations = 1; // Miri is deterministic, no need to try many times
-    unsafe {
-        let pointers: Vec<_> = (0..iterations).map(|_| {
-            allocator.alloc(Layout::from_size_align(size, align).unwrap()).unwrap()
-        }).collect();
-        for &ptr in &pointers {
-            assert_eq!((ptr.as_ptr() as usize) % align, 0,
-                       "Got a pointer less aligned than requested")
-        }
-
-        // Clean up
-        for &ptr in &pointers {
-            allocator.dealloc(ptr, Layout::from_size_align(size, align).unwrap())
-        }
-    }
-}
-
-fn main() {
-    check_overalign_requests(System);
-    check_overalign_requests(Global);
-}