Skip to content

Commit

Permalink
use attribute after check the rustc version
Browse files Browse the repository at this point in the history
  • Loading branch information
flier committed May 3, 2020
1 parent a218659 commit 43da098
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 11 deletions.
9 changes: 7 additions & 2 deletions build.rs
Expand Up @@ -2,12 +2,17 @@ use std::env;
use std::process::Command;
use std::str::{self, FromStr};

fn main(){
fn main() {
let minor = match rustc_minor_version() {
Some(minor) => minor,
None => return,
};

// #[repr(transparent)] stabilized in Rust 1.28:
if minor >= 28 {
println!("cargo:rustc-cfg=bitflags_repr_transparent");
}

// const fn stabilized in Rust 1.31:
if minor >= 31 {
println!("cargo:rustc-cfg=bitflags_const_fn");
Expand Down Expand Up @@ -41,4 +46,4 @@ fn rustc_minor_version() -> Option<u32> {
};

u32::from_str(next).ok()
}
}
50 changes: 41 additions & 9 deletions src/lib.rs
Expand Up @@ -390,6 +390,25 @@ macro_rules! bitflags {
};
}

#[macro_export(local_inner_macros)]
#[doc(hidden)]
#[cfg(bitflags_repr_transparent)]
macro_rules! __repr_transparent {
($($inner:tt)*) => {
#[repr(transparent)]
$($inner)*
}
}

#[macro_export(local_inner_macros)]
#[doc(hidden)]
#[cfg(not(bitflags_repr_transparent))]
macro_rules! __repr_transparent {
($($inner:tt)*) => {
$($inner)*
}
}

#[macro_export(local_inner_macros)]
#[doc(hidden)]
macro_rules! __bitflags {
Expand All @@ -402,11 +421,12 @@ macro_rules! __bitflags {
)+
}
) => {
$(#[$outer])*
#[repr(transparent)]
#[derive(Copy, PartialEq, Eq, Clone, PartialOrd, Ord, Hash)]
$($vis)* struct $BitFlags {
bits: $T,
__repr_transparent! {
$(#[$outer])*
#[derive(Copy, PartialEq, Eq, Clone, PartialOrd, Ord, Hash)]
$($vis)* struct $BitFlags {
bits: $T,
}
}

__impl_bitflags! {
Expand Down Expand Up @@ -1029,9 +1049,18 @@ mod tests {
assert_eq!(unsafe { Flags::from_bits_unchecked(0) }, Flags::empty());
assert_eq!(unsafe { Flags::from_bits_unchecked(0b1) }, Flags::A);
assert_eq!(unsafe { Flags::from_bits_unchecked(0b10) }, Flags::B);
assert_eq!(unsafe { Flags::from_bits_unchecked(0b11) }, (Flags::A | Flags::B));
assert_eq!(unsafe { Flags::from_bits_unchecked(0b1000) }, (extra | Flags::empty()));
assert_eq!(unsafe { Flags::from_bits_unchecked(0b1001) }, (extra | Flags::A));
assert_eq!(
unsafe { Flags::from_bits_unchecked(0b11) },
(Flags::A | Flags::B)
);
assert_eq!(
unsafe { Flags::from_bits_unchecked(0b1000) },
(extra | Flags::empty())
);
assert_eq!(
unsafe { Flags::from_bits_unchecked(0b1001) },
(extra | Flags::A)
);
}

#[test]
Expand Down Expand Up @@ -1276,7 +1305,10 @@ mod tests {
let extra = unsafe { Flags::from_bits_unchecked(0xb8) };
assert_eq!(format!("{:?}", extra), "0xb8");
assert_eq!(format!("{:?}", Flags::A | extra), "A | 0xb8");
assert_eq!(format!("{:?}", Flags::ABC | extra), "A | B | C | ABC | 0xb8");
assert_eq!(
format!("{:?}", Flags::ABC | extra),
"A | B | C | ABC | 0xb8"
);
}

#[test]
Expand Down

0 comments on commit 43da098

Please sign in to comment.