Attach min_const_generics to a crate feature (#63)

* Attach min_const_generics to a crate feature

* Remove `min_const_generics` detection logic
This commit is contained in:
Connor Horman 2021-06-05 10:25:57 -04:00 committed by GitHub
parent f3e16c7051
commit cd8dbd64e9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 18 additions and 50 deletions

View File

@ -17,6 +17,7 @@ extern_crate_alloc = []
extern_crate_std = ["extern_crate_alloc"] extern_crate_std = ["extern_crate_alloc"]
zeroable_maybe_uninit = [] zeroable_maybe_uninit = []
derive = ["bytemuck_derive"] derive = ["bytemuck_derive"]
min_const_generics = []
[dependencies] [dependencies]
# use the upper line for testing against bytemuck_derive changes, if any # use the upper line for testing against bytemuck_derive changes, if any

View File

@ -1,45 +0,0 @@
use std::{
env,
process::Command,
str::{self, FromStr},
};
fn main() {
let minor = match rustc_minor_version() {
Some(minor) => minor,
None => return,
};
if minor >= 51 {
println!("cargo:rustc-cfg=min_const_generics");
}
}
fn rustc_minor_version() -> Option<u32> {
let rustc = match env::var_os("RUSTC") {
Some(rustc) => rustc,
None => return None,
};
let output = match Command::new(rustc).arg("--version").output() {
Ok(output) => output,
Err(_) => return None,
};
let version = match str::from_utf8(&output.stdout) {
Ok(version) => version,
Err(_) => return None,
};
let mut pieces = version.split('.');
if pieces.next() != Some("rustc 1") {
return None;
}
let next = match pieces.next() {
Some(next) => next,
None => return None,
};
u32::from_str(next).ok()
}

View File

@ -50,7 +50,7 @@ use core::{marker::*, mem::*, num::*, ptr::*};
#[doc(hidden)] #[doc(hidden)]
pub use ::core as __core; pub use ::core as __core;
#[cfg(not(generic_const))] #[cfg(not(feature = "min_const_generics"))]
macro_rules! impl_unsafe_marker_for_array { macro_rules! impl_unsafe_marker_for_array {
( $marker:ident , $( $n:expr ),* ) => { ( $marker:ident , $( $n:expr ),* ) => {
$(unsafe impl<T> $marker for [T; $n] where T: $marker {})* $(unsafe impl<T> $marker for [T; $n] where T: $marker {})*

View File

@ -66,10 +66,10 @@ unsafe impl<T: Pod> Pod for ManuallyDrop<T> {}
// Note(Lokathor): MaybeUninit can NEVER be Pod. // Note(Lokathor): MaybeUninit can NEVER be Pod.
#[cfg(min_const_generics)] #[cfg(feature = "min_const_generics")]
unsafe impl<T, const N: usize> Pod for [T; N] where T: Pod {} unsafe impl<T, const N: usize> Pod for [T; N] where T: Pod {}
#[cfg(not(min_const_generics))] #[cfg(not(feature = "min_const_generics"))]
impl_unsafe_marker_for_array!( impl_unsafe_marker_for_array!(
Pod, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, Pod, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 48, 64, 96, 128, 256, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 48, 64, 96, 128, 256,

View File

@ -109,10 +109,10 @@ unsafe impl<
{ {
} }
#[cfg(min_const_generics)] #[cfg(feature = "min_const_generics")]
unsafe impl<T, const N: usize> Zeroable for [T; N] where T: Zeroable {} unsafe impl<T, const N: usize> Zeroable for [T; N] where T: Zeroable {}
#[cfg(not(min_const_generics))] #[cfg(not(feature = "min_const_generics"))]
impl_unsafe_marker_for_array!( impl_unsafe_marker_for_array!(
Zeroable, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, Zeroable, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 48, 64, 96, 128, 256, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 48, 64, 96, 128, 256,

12
tests/array_tests.rs Normal file
View File

@ -0,0 +1,12 @@
#[test]
pub fn test_cast_array() {
let x = [0u32, 1u32, 2u32];
let _: [u16; 6] = bytemuck::cast(x);
}
#[cfg(feature = "min_const_generics")]
#[test]
pub fn test_cast_long_array() {
let x = [0u32; 65];
let _: [u16; 130] = bytemuck::cast(x);
}