about summary refs log tree commit diff
diff options
context:
space:
mode:
authorScott McMurray <scottmcm@users.noreply.github.com>2020-09-30 20:00:09 -0700
committerScott McMurray <scottmcm@users.noreply.github.com>2020-09-30 20:00:09 -0700
commit20202da09e86bd15ffcd0ce22b5ebe8a27ef17a0 (patch)
tree8f6d268d0feae937c873d0ff82dc7b8101c4ee74
parent9bb55dc8642d811d66a7599812009cc063577e00 (diff)
downloadrust-20202da09e86bd15ffcd0ce22b5ebe8a27ef17a0.tar.gz
rust-20202da09e86bd15ffcd0ce22b5ebe8a27ef17a0.zip
Improve the example for ptr::copy
Fixes #77220
-rw-r--r--library/core/src/intrinsics.rs12
1 files changed, 11 insertions, 1 deletions
diff --git a/library/core/src/intrinsics.rs b/library/core/src/intrinsics.rs
index 243fc7bfaa5..18b54c8ea3e 100644
--- a/library/core/src/intrinsics.rs
+++ b/library/core/src/intrinsics.rs
@@ -1901,11 +1901,21 @@ pub unsafe fn copy_nonoverlapping<T>(src: *const T, dst: *mut T, count: usize) {
 /// ```
 /// use std::ptr;
 ///
+/// /// # Safety:
+/// /// * `ptr` must be correctly aligned for its type and non-zero.
+/// /// * `ptr` must be valid for reads of `elts` contiguous objects of type `T`.
+/// /// * Those elements must not be used after calling this function.
 /// # #[allow(dead_code)]
 /// unsafe fn from_buf_raw<T>(ptr: *const T, elts: usize) -> Vec<T> {
 ///     let mut dst = Vec::with_capacity(elts);
-///     dst.set_len(elts);
+///
+///     // SAFETY: Our precondition ensures the source is aligned and valid,
+///     // and `Vec::with_capacity` ensures that we have usable space to write them.
 ///     ptr::copy(ptr, dst.as_mut_ptr(), elts);
+///
+///     // SAFETY: We created it with this much capacity earlier,
+///     // and the previous `copy` has initialized these elements.
+///     dst.set_len(elts);
 ///     dst
 /// }
 /// ```