about summary refs log tree commit diff
path: root/src/liballoc
diff options
context:
space:
mode:
authorLukas Lueg <lukas.lueg@gmail.com>2020-01-28 22:28:13 +0100
committerLukas Lueg <lukas.lueg@gmail.com>2020-01-28 22:28:13 +0100
commitb4c96a9199f13c5c1c2afa6258d2b9206c151d9f (patch)
tree48d63f3d6135c2f875dcbe8536b5b9fead4b6753 /src/liballoc
parentbecebf3106407b892f25807473e23d6e8f116a1e (diff)
downloadrust-b4c96a9199f13c5c1c2afa6258d2b9206c151d9f.tar.gz
rust-b4c96a9199f13c5c1c2afa6258d2b9206c151d9f.zip
Refine [Arc/Rc]::from_raw() docs
Diffstat (limited to 'src/liballoc')
-rw-r--r--src/liballoc/rc.rs18
-rw-r--r--src/liballoc/sync.rs18
2 files changed, 26 insertions, 10 deletions
diff --git a/src/liballoc/rc.rs b/src/liballoc/rc.rs
index 60a8e1714b6..1d2222adb9d 100644
--- a/src/liballoc/rc.rs
+++ b/src/liballoc/rc.rs
@@ -570,16 +570,24 @@ impl<T: ?Sized> Rc<T> {
         ptr
     }
 
-    /// Constructs an `Rc` from a raw pointer.
+    /// Constructs an `Rc<T>` from a raw pointer.
     ///
-    /// The raw pointer must have been previously returned by a call to a
-    /// [`Rc::into_raw`][into_raw] using the same `T`.
+    /// The raw pointer must have been previously returned by a call to
+    /// [`Rc<U>::into_raw`][into_raw] where `U` must have the same size
+    /// and alignment as `T`. This is trivially true if `U` is `T`.
+    /// Note that if `U` is not `T` but has the same size and alignment, this is
+    /// basically like transmuting references of different types. See
+    /// [`mem::transmute`][transmute] for more information on what
+    /// restrictions apply in this case.
+    ///
+    /// The user of `from_raw` has to make sure a specific value of `T` is only
+    /// dropped once.
     ///
     /// This function is unsafe because improper use may lead to memory unsafety,
-    /// even if `T` is never accessed. For example, a double-free may occur if the function is
-    /// called twice on the same raw pointer.
+    /// even if the returned `Rc<T>` is never accessed.
     ///
     /// [into_raw]: struct.Rc.html#method.into_raw
+    /// [transmute]: ../../std/mem/fn.transmute.html
     ///
     /// # Examples
     ///
diff --git a/src/liballoc/sync.rs b/src/liballoc/sync.rs
index 024f9407604..f9c8da58c75 100644
--- a/src/liballoc/sync.rs
+++ b/src/liballoc/sync.rs
@@ -550,16 +550,24 @@ impl<T: ?Sized> Arc<T> {
         ptr
     }
 
-    /// Constructs an `Arc` from a raw pointer.
+    /// Constructs an `Arc<T>` from a raw pointer.
     ///
-    /// The raw pointer must have been previously returned by a call to a
-    /// [`Arc::into_raw`][into_raw], using the same `T`.
+    /// The raw pointer must have been previously returned by a call to
+    /// [`Arc<U>::into_raw`][into_raw] where `U` must have the same size and
+    /// alignment as `T`. This is trivially true if `U` is `T`.
+    /// Note that if `U` is not `T` but has the same size and alignment, this is
+    /// basically like transmuting references of different types. See
+    /// [`mem::transmute`][transmute] for more information on what
+    /// restrictions apply in this case.
+    ///
+    /// The user of `from_raw` has to make sure a specific value of `T` is only
+    /// dropped once.
     ///
     /// This function is unsafe because improper use may lead to memory unsafety,
-    /// even if `T` is never accessed. For example, a double-free may occur if the function is
-    /// called twice on the same raw pointer.
+    /// even if the returned `Arc<T>` is never accessed.
     ///
     /// [into_raw]: struct.Arc.html#method.into_raw
+    /// [transmute]: ../../std/mem/fn.transmute.html
     ///
     /// # Examples
     ///