Bug: 180113514

Clone this repo:
  1. 5f00680 [LSC] Add LOCAL_LICENSE_KINDS to external/rust/crates/rustversion am: d376700887 by Bob Badour · 8 days ago master sdk-release
  2. d376700 [LSC] Add LOCAL_LICENSE_KINDS to external/rust/crates/rustversion by Bob Badour · 9 days ago
  3. e7bf000 Add Android.bp am: d550abe65f by Thiébaud Weksteen · 12 days ago
  4. 2504109 Initial import of 1.0.4 am: 11c5f14abe by Thiébaud Weksteen · 12 days ago
  5. d550abe Add Android.bp by Thiébaud Weksteen · 13 days ago simpleperf-release

Compiler version cfg

This crate provides macros for conditional compilation according to rustc compiler version, analogous to #[cfg(...)] and #[cfg_attr(...)].

[dependencies]
rustversion = "1.0"

Selectors

  • #[rustversion::stable]
    True on any stable compiler.

  • #[rustversion::stable(1.34)]
    True on exactly the specified stable compiler.

  • #[rustversion::beta]
    True on any beta compiler.

  • #[rustversion::nightly]
    True on any nightly compiler or dev build.

  • #[rustversion::nightly(2019-01-01)]
    True on exactly one nightly.

  • #[rustversion::since(1.34)]
    True on that stable release and any later compiler, including beta and nightly.

  • #[rustversion::since(2019-01-01)]
    True on that nightly and all newer ones.

  • #[rustversion::before(version or date)]
    Negative of #[rustversion::since(...)].

  • #[rustversion::not(selector)]
    Negative of any selector; for example #[rustversion::not(nightly)].

  • #[rustversion::any(selectors...)]
    True if any of the comma-separated selectors is true; for example #[rustversion::any(stable, beta)].

  • #[rustversion::all(selectors...)]
    True if all of the comma-separated selectors are true; for example #[rustversion::all(since(1.31), before(1.34))].

  • #[rustversion::attr(selector,attribute)]
    For conditional inclusion of attributes; analogous to cfg_attr.

Use cases

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:

#[rustversion::since(1.33)]
use std::pin::Pin;

#[rustversion::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.

#[rustversion::attr(before(1.33), repr(packed))]
#[rustversion::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 rustversion::attr macro.

use std::time::Duration;

#[rustversion::attr(since(1.32), const)]
fn duration_as_days(dur: Duration) -> u64 {
    dur.as_secs() / 60 / 60 / 24
}

License