Crates.io | select-rustc |
lib.rs | select-rustc |
version | 0.1.2 |
source | src |
created_at | 2019-04-29 05:10:25.153363 |
updated_at | 2019-05-07 03:26:59.271266 |
description | Conditional compilation according to rustc compiler version |
homepage | |
repository | https://github.com/dtolnay/select-rustc |
max_upload_size | |
id | 130872 |
size | 41,265 |
This crate provides macros for conditional compilation according to rustc
compiler version, analogous to #[cfg(...)]
and
#[cfg_attr(...)]
.
[dependencies]
select-rustc = "0.1"
#[rustc::stable]
—
True on any stable compiler.
#[rustc::stable(1.34)]
—
True on exactly the specified stable compiler.
#[rustc::beta]
—
True on any beta compiler.
#[rustc::nightly]
—
True on any nightly compiler or dev build.
#[rustc::nightly(2019-01-01)]
—
True on exactly one nightly.
#[rustc::since(1.34)]
—
True on that stable release and any later compiler, including beta and
nightly.
#[rustc::since(2019-01-01)]
—
True on that nightly and all newer ones.
#[rustc::before(
version or date)]
—
Negative of #[rustc::since(...)].
#[rustc::not(
selector)]
—
Negative of any selector; for example #[rustc::not(nightly)].
#[rustc::any(
selectors...)]
—
True if any of the comma-separated selectors is true; for example
#[rustc::any(stable, beta)].
#[rustc::all(
selectors...)]
—
True if all of the comma-separated selectors are true; for example
#[rustc::all(since(1.31), before(1.34))].
#[rustc::attr(
selector,
attribute)]
—
For conditional inclusion of attributes; analogous to cfg_attr
.
Providing additional trait impls as types are stabilized in the standard library without breaking compatibility with older compilers; in this case Pin<P> stabilized in Rust 1.33:
#[rustc::since(1.33)]
use std::pin::Pin;
#[rustc::since(1.33)]
impl<P: MyTrait> MyTrait for Pin<P> {
/* ... */
}
Similar but for language features; the ability to control alignment greater than 1 of packed structs was stabilized in Rust 1.33.
#[rustc::attr(before(1.33), repr(packed))]
#[rustc::attr(since(1.33), repr(packed(2)))]
struct Six(i16, i32);
fn main() {
println!("{}", std::mem::align_of::<Six>());
}
Augmenting code with const
as const impls are stabilized in the standard
library. This use of const
as an attribute is recognized as a special case by
the rustc::attr macro.
use std::time::Duration;
#[rustc::attr(since(1.32), const)]
fn duration_as_days(dur: Duration) -> u64 {
dur.as_secs() / 60 / 60 / 24
}