diff options
| author | Camelid <camelidcamel@gmail.com> | 2021-01-04 18:34:31 -0800 |
|---|---|---|
| committer | Camelid <camelidcamel@gmail.com> | 2021-01-04 19:23:55 -0800 |
| commit | bbf175df3cd17763ff601151eed6f84d0cabda13 (patch) | |
| tree | d9949855cbbbe8e3796eb015c86c20fa6524ea15 | |
| parent | 80184183ba0a53aa4f491753de9502acd3d6920c (diff) | |
| download | rust-bbf175df3cd17763ff601151eed6f84d0cabda13.tar.gz rust-bbf175df3cd17763ff601151eed6f84d0cabda13.zip | |
Make `size_of_val` and `min_align_of_val` intrinsics unsafe
| -rw-r--r-- | compiler/rustc_typeck/src/check/intrinsic.rs | 2 | ||||
| -rw-r--r-- | library/core/src/mem/mod.rs | 16 |
2 files changed, 11 insertions, 7 deletions
diff --git a/compiler/rustc_typeck/src/check/intrinsic.rs b/compiler/rustc_typeck/src/check/intrinsic.rs index 673dec6c7f9..e4e6cf73c7e 100644 --- a/compiler/rustc_typeck/src/check/intrinsic.rs +++ b/compiler/rustc_typeck/src/check/intrinsic.rs @@ -63,8 +63,6 @@ pub fn intrinsic_operation_unsafety(intrinsic: Symbol) -> hir::Unsafety { | sym::min_align_of | sym::needs_drop | sym::caller_location - | sym::size_of_val - | sym::min_align_of_val | sym::add_with_overflow | sym::sub_with_overflow | sym::mul_with_overflow diff --git a/library/core/src/mem/mod.rs b/library/core/src/mem/mod.rs index 971ec5d9c8d..64cf5286eb1 100644 --- a/library/core/src/mem/mod.rs +++ b/library/core/src/mem/mod.rs @@ -4,6 +4,7 @@ //! types, initializing and manipulating memory. #![stable(feature = "rust1", since = "1.0.0")] +#![cfg_attr(bootstrap, allow(unused_unsafe))] use crate::clone; use crate::cmp; @@ -333,7 +334,8 @@ pub const fn size_of<T>() -> usize { #[stable(feature = "rust1", since = "1.0.0")] #[rustc_const_unstable(feature = "const_size_of_val", issue = "46571")] pub const fn size_of_val<T: ?Sized>(val: &T) -> usize { - intrinsics::size_of_val(val) + // SAFETY: `val` is a reference, so it's a valid raw pointer + unsafe { intrinsics::size_of_val(val) } } /// Returns the size of the pointed-to value in bytes. @@ -381,7 +383,8 @@ pub const fn size_of_val<T: ?Sized>(val: &T) -> usize { #[unstable(feature = "layout_for_ptr", issue = "69835")] #[rustc_const_unstable(feature = "const_size_of_val_raw", issue = "46571")] pub const unsafe fn size_of_val_raw<T: ?Sized>(val: *const T) -> usize { - intrinsics::size_of_val(val) + // SAFETY: the caller must provide a valid raw pointer + unsafe { intrinsics::size_of_val(val) } } /// Returns the [ABI]-required minimum alignment of a type. @@ -425,7 +428,8 @@ pub fn min_align_of<T>() -> usize { #[stable(feature = "rust1", since = "1.0.0")] #[rustc_deprecated(reason = "use `align_of_val` instead", since = "1.2.0")] pub fn min_align_of_val<T: ?Sized>(val: &T) -> usize { - intrinsics::min_align_of_val(val) + // SAFETY: val is a reference, so it's a valid raw pointer + unsafe { intrinsics::min_align_of_val(val) } } /// Returns the [ABI]-required minimum alignment of a type. @@ -469,7 +473,8 @@ pub const fn align_of<T>() -> usize { #[rustc_const_unstable(feature = "const_align_of_val", issue = "46571")] #[allow(deprecated)] pub const fn align_of_val<T: ?Sized>(val: &T) -> usize { - intrinsics::min_align_of_val(val) + // SAFETY: val is a reference, so it's a valid raw pointer + unsafe { intrinsics::min_align_of_val(val) } } /// Returns the [ABI]-required minimum alignment of the type of the value that `val` points to. @@ -513,7 +518,8 @@ pub const fn align_of_val<T: ?Sized>(val: &T) -> usize { #[unstable(feature = "layout_for_ptr", issue = "69835")] #[rustc_const_unstable(feature = "const_align_of_val_raw", issue = "46571")] pub const unsafe fn align_of_val_raw<T: ?Sized>(val: *const T) -> usize { - intrinsics::min_align_of_val(val) + // SAFETY: the caller must provide a valid raw pointer + unsafe { intrinsics::min_align_of_val(val) } } /// Returns `true` if dropping values of type `T` matters. |
