Skip to content

Commit

Permalink
Auto merge of rust-lang#106967 - saethlin:remove-vec-as-ptr-assume, r…
Browse files Browse the repository at this point in the history
…=thomcc

Remove the assume(!is_null) from Vec::as_ptr

At a guess, this code is leftover from LLVM was worse at keeping track of the niche information here. In any case, we don't need this anymore: Removing this `assume` doesn't get rid of the `nonnull` attribute on the return type.
  • Loading branch information
bors committed Mar 21, 2023
2 parents 84c47b8 + 738c8b0 commit ef03fda
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 11 deletions.
13 changes: 2 additions & 11 deletions library/alloc/src/vec/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,6 @@ use core::cmp::Ordering;
use core::convert::TryFrom;
use core::fmt;
use core::hash::{Hash, Hasher};
use core::intrinsics::assume;
use core::iter;
#[cfg(not(no_global_oom_handling))]
use core::iter::FromIterator;
Expand Down Expand Up @@ -1240,11 +1239,7 @@ impl<T, A: Allocator> Vec<T, A> {
pub fn as_ptr(&self) -> *const T {
// We shadow the slice method of the same name to avoid going through
// `deref`, which creates an intermediate reference.
let ptr = self.buf.ptr();
unsafe {
assume(!ptr.is_null());
}
ptr
self.buf.ptr()
}

/// Returns an unsafe mutable pointer to the vector's buffer, or a dangling
Expand Down Expand Up @@ -1277,11 +1272,7 @@ impl<T, A: Allocator> Vec<T, A> {
pub fn as_mut_ptr(&mut self) -> *mut T {
// We shadow the slice method of the same name to avoid going through
// `deref_mut`, which creates an intermediate reference.
let ptr = self.buf.ptr();
unsafe {
assume(!ptr.is_null());
}
ptr
self.buf.ptr()
}

/// Returns a reference to the underlying allocator.
Expand Down
19 changes: 19 additions & 0 deletions tests/codegen/vec-as-ptr.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
// compile-flags: -O -Zmerge-functions=disabled

#![crate_type = "lib"]

// Test that even though we return a *const u8 not a &[u8] or a NonNull<u8>, LLVM knows that this
// pointer is nonnull.
// CHECK: nonnull {{i8\*|ptr}} @vec_as_ptr
#[no_mangle]
pub fn vec_as_ptr(v: &Vec<u8>) -> *const u8 {
v.as_ptr()
}

// Test that even though we return a *const u8 not a &[u8] or a NonNull<u8>, LLVM knows that this
// pointer is nonnull.
// CHECK: nonnull {{i8\*|ptr}} @vec_as_mut_ptr
#[no_mangle]
pub fn vec_as_mut_ptr(v: &mut Vec<u8>) -> *mut u8 {
v.as_mut_ptr()
}

0 comments on commit ef03fda

Please sign in to comment.