about summary refs log tree commit diff
path: root/src/libcore
diff options
context:
space:
mode:
Diffstat (limited to 'src/libcore')
-rw-r--r--src/libcore/mem.rs15
1 files changed, 9 insertions, 6 deletions
diff --git a/src/libcore/mem.rs b/src/libcore/mem.rs
index 7fea029e02d..4b9e070619f 100644
--- a/src/libcore/mem.rs
+++ b/src/libcore/mem.rs
@@ -173,12 +173,15 @@ pub unsafe fn zeroed<T>() -> T {
 #[inline]
 #[unstable(feature = "filling_drop")]
 pub unsafe fn dropped<T>() -> T {
-    let mut x: T = uninitialized();
-    let p: *mut u8 = transmute(&mut x as *mut T);
-    for i in 0..size_of::<T>() {
-        *p.offset(i as isize) = POST_DROP_U8;
-    }
-    x
+    #[cfg(stage0)]
+    #[inline(always)]
+    unsafe fn dropped_impl<T>() -> T { zeroed() }
+
+    #[cfg(not(stage0))]
+    #[inline(always)]
+    unsafe fn dropped_impl<T>() -> T { intrinsics::init_dropped() }
+
+    dropped_impl()
 }
 
 /// Create an uninitialized value.