From 28d5d2fad06688164946cea250e23516cabc3541 Mon Sep 17 00:00:00 2001
From: Andrew Paseltiner <apaseltiner@gmail.com>
Date: Sun, 9 Aug 2015 21:52:43 -0400
Subject: [PATCH] Remove transmute from
 `btree::node::Node::as_slices_internal_mut`

Closes #27620.
---
 src/libcollections/btree/node.rs | 25 +++++++++++++++++++++++--
 1 file changed, 23 insertions(+), 2 deletions(-)

diff --git a/src/libcollections/btree/node.rs b/src/libcollections/btree/node.rs
index e0018efe9e0..37f235c1c7b 100644
--- a/src/libcollections/btree/node.rs
+++ b/src/libcollections/btree/node.rs
@@ -390,8 +390,29 @@ impl<K, V> Node<K, V> {
 
     #[inline]
     pub fn as_slices_internal_mut<'b>(&'b mut self) -> MutNodeSlice<'b, K, V> {
-        // FIXME(#27620): Bad: This relies on structure layout!
-        unsafe { mem::transmute(self.as_slices_internal()) }
+        let len = self.len();
+        let is_leaf = self.is_leaf();
+        let keys = unsafe { slice::from_raw_parts_mut(*self.keys, len) };
+        let vals = unsafe { slice::from_raw_parts_mut(*self.vals, len) };
+        let edges: &mut [_] = if is_leaf {
+            &mut []
+        } else {
+            unsafe {
+                let data = match self.edges {
+                    None => heap::EMPTY as *mut Node<K,V>,
+                    Some(ref mut p) => **p as *mut Node<K,V>,
+                };
+                slice::from_raw_parts_mut(data, len + 1)
+            }
+        };
+        MutNodeSlice {
+            keys: keys,
+            vals: vals,
+            edges: edges,
+            head_is_edge: true,
+            tail_is_edge: true,
+            has_edges: !is_leaf,
+        }
     }
 
     #[inline]