Skip to content

Commit dd18c48

Browse files
committed
Add tests
1 parent d8b5745 commit dd18c48

File tree

2 files changed

+94
-0
lines changed

2 files changed

+94
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// run-pass
2+
// aux-build:ver-cfg-rel.rs
3+
// revisions: assume no_assume
4+
// [assume]compile-flags: -Z assume-incomplete-release
5+
6+
#![feature(cfg_version)]
7+
8+
extern crate ver_cfg_rel;
9+
10+
use ver_cfg_rel::ver_cfg_rel;
11+
12+
#[ver_cfg_rel("-2")]
13+
fn foo_2() { }
14+
15+
#[ver_cfg_rel("-1")]
16+
fn foo_1() { }
17+
18+
#[cfg(assume)]
19+
#[ver_cfg_rel("0")]
20+
fn foo() { compile_error!("wrong+0") }
21+
22+
#[cfg(no_assume)]
23+
#[ver_cfg_rel("0")]
24+
fn foo() { }
25+
26+
#[ver_cfg_rel("1")]
27+
fn bar() { compile_error!("wrong+1") }
28+
29+
#[ver_cfg_rel("2")]
30+
fn bar() { compile_error!("wrong+2") }
31+
32+
fn main() {
33+
foo_2();
34+
foo_1();
35+
36+
#[cfg(no_assume)]
37+
foo();
38+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
// force-host
2+
// no-prefer-dynamic
3+
4+
#![crate_type = "proc-macro"]
5+
6+
extern crate proc_macro;
7+
use proc_macro::{TokenStream, TokenTree as Tt};
8+
use std::str::FromStr;
9+
10+
// String containing the current version number of the tip, i.e. "1.41.2"
11+
static VERSION_NUMBER: &str = include_str!("../../../../../version");
12+
13+
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
14+
struct Version {
15+
major: i16,
16+
minor: i16,
17+
patch: i16,
18+
}
19+
20+
fn parse_version(s: &str) -> Option<Version> {
21+
let mut digits = s.splitn(3, '.');
22+
let major = digits.next()?.parse().ok()?;
23+
let minor = digits.next()?.parse().ok()?;
24+
let patch = digits.next().unwrap_or("0").trim().parse().ok()?;
25+
Some(Version { major, minor, patch })
26+
}
27+
28+
#[proc_macro_attribute]
29+
/// Emits a #[cfg(version)] relative to the current one, so passing
30+
/// -1 as argument on compiler 1.50 will emit #[cfg(version("1.49.0"))],
31+
/// while 1 will emit #[cfg(version("1.51.0"))]
32+
pub fn ver_cfg_rel(attr: TokenStream, input: TokenStream) -> TokenStream {
33+
let mut v_rel = None;
34+
for a in attr.into_iter() {
35+
match a {
36+
Tt::Literal(l) => {
37+
let mut s = l.to_string();
38+
let s = s.trim_matches('"');
39+
let v: i16 = s.parse().unwrap();
40+
v_rel = Some(v);
41+
break;
42+
},
43+
_ => panic!("{:?}", a),
44+
}
45+
}
46+
let v_rel = v_rel.unwrap();
47+
48+
let mut v = parse_version(VERSION_NUMBER).unwrap();
49+
v.minor += v_rel;
50+
51+
let attr_str = format!("#[cfg(version(\"{}.{}.{}\"))]", v.major, v.minor, v.patch);
52+
let mut res = Vec::<Tt>::new();
53+
res.extend(TokenStream::from_str(&attr_str).unwrap().into_iter());
54+
res.extend(input.into_iter());
55+
res.into_iter().collect()
56+
}

0 commit comments

Comments
 (0)