From 4151ef6f9c3a8b84c22c39b3381640e85ef0c359 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Thu, 8 Nov 2018 13:09:34 -0800 Subject: [PATCH 1/2] Support i128 and u128 to tokens --- Cargo.toml | 2 +- build.rs | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ src/to_tokens.rs | 6 ++++++ tests/test.rs | 13 +++++++++++++ 4 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 build.rs diff --git a/Cargo.toml b/Cargo.toml index 43a96a5..235113b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,7 @@ readme = "README.md" include = ["Cargo.toml", "src/**/*.rs", "tests/**/*.rs", "README.md", "LICENSE-APACHE", "LICENSE-MIT"] [dependencies] -proc-macro2 = { version = "0.4.13", default-features = false } +proc-macro2 = { version = "0.4.21", default-features = false } [features] default = ["proc-macro"] diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..a0474a4 --- /dev/null +++ b/build.rs @@ -0,0 +1,48 @@ +use std::env; +use std::process::Command; +use std::str::{self, FromStr}; + +// The rustc-cfg strings below are *not* public API. Please let us know by +// opening a GitHub issue if your build environment requires some way to enable +// these cfgs other than by executing our build script. +fn main() { + let minor = match rustc_minor_version() { + Some(minor) => minor, + None => return, + }; + + // 128-bit integers stabilized in Rust 1.26: + // https://blog.rust-lang.org/2018/05/10/Rust-1.26.html + if minor >= 26 { + println!("cargo:rustc-cfg=integer128"); + } +} + +fn rustc_minor_version() -> Option { + 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() +} diff --git a/src/to_tokens.rs b/src/to_tokens.rs index b7d395a..4a9c8f1 100644 --- a/src/to_tokens.rs +++ b/src/to_tokens.rs @@ -143,6 +143,12 @@ primitive! { f64 => f64_suffixed } +#[cfg(integer128)] +primitive! { + i128 => i128_suffixed + u128 => u128_suffixed +} + impl ToTokens for char { fn to_tokens(&self, tokens: &mut TokenStream) { tokens.append(Literal::character(*self)); diff --git a/tests/test.rs b/tests/test.rs index 6f0ac89..c785793 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -135,6 +135,19 @@ fn test_integer() { assert_eq!(expected, tokens.to_string()); } +#[cfg(integer128)] +#[test] +fn test_integer128() { + let ii128 = -1i128; + let uu128 = 1u128; + + let tokens = quote! { + #ii128 #uu128 + }; + let expected = "-1i128 1u128"; + assert_eq!(expected, tokens.to_string()); +} + #[test] fn test_floating() { let e32 = 2.345f32; From fe7e65ea16c35782985e06dc874aa617e022f957 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Thu, 8 Nov 2018 13:16:59 -0800 Subject: [PATCH 2/2] Hide unsupported integer suffixes from rustc 1.15 --- tests/conditional/integer128.rs | 11 +++++++++++ tests/test.rs | 18 +++++------------- 2 files changed, 16 insertions(+), 13 deletions(-) create mode 100644 tests/conditional/integer128.rs diff --git a/tests/conditional/integer128.rs b/tests/conditional/integer128.rs new file mode 100644 index 0000000..61e2274 --- /dev/null +++ b/tests/conditional/integer128.rs @@ -0,0 +1,11 @@ +#[test] +fn test_integer128() { + let ii128 = -1i128; + let uu128 = 1u128; + + let tokens = quote! { + #ii128 #uu128 + }; + let expected = "-1i128 1u128"; + assert_eq!(expected, tokens.to_string()); +} diff --git a/tests/test.rs b/tests/test.rs index c785793..f832da5 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -9,6 +9,11 @@ extern crate quote; use proc_macro2::{Ident, Span, TokenStream}; use quote::TokenStreamExt; +mod conditional { + #[cfg(integer128)] + mod integer128; +} + struct X; impl quote::ToTokens for X { @@ -135,19 +140,6 @@ fn test_integer() { assert_eq!(expected, tokens.to_string()); } -#[cfg(integer128)] -#[test] -fn test_integer128() { - let ii128 = -1i128; - let uu128 = 1u128; - - let tokens = quote! { - #ii128 #uu128 - }; - let expected = "-1i128 1u128"; - assert_eq!(expected, tokens.to_string()); -} - #[test] fn test_floating() { let e32 = 2.345f32;