Implement built-in attribute macro #[cfg_eval]

This commit is contained in:
Vadim Petrochenkov 2021-03-06 21:33:02 +03:00
parent 069e612e73
commit 5dad6c2575
11 changed files with 259 additions and 0 deletions

View file

@ -0,0 +1,9 @@
#![feature(cfg_eval)]
#![feature(stmt_expr_attributes)]
fn main() {
let _ = #[cfg_eval] #[cfg(FALSE)] 0;
//~^ ERROR removing an expression is not supported in this position
//~| ERROR removing an expression is not supported in this position
//~| ERROR removing an expression is not supported in this position
}

View file

@ -0,0 +1,20 @@
error: removing an expression is not supported in this position
--> $DIR/cfg-eval-fail.rs:5:25
|
LL | let _ = #[cfg_eval] #[cfg(FALSE)] 0;
| ^^^^^^^^^^^^^
error: removing an expression is not supported in this position
--> $DIR/cfg-eval-fail.rs:5:25
|
LL | let _ = #[cfg_eval] #[cfg(FALSE)] 0;
| ^^^^^^^^^^^^^
error: removing an expression is not supported in this position
--> $DIR/cfg-eval-fail.rs:5:25
|
LL | let _ = #[cfg_eval] #[cfg(FALSE)] 0;
| ^^^^^^^^^^^^^
error: aborting due to 3 previous errors

View file

@ -0,0 +1,32 @@
// check-pass
// compile-flags: -Z span-debug
// aux-build:test-macros.rs
#![feature(cfg_eval)]
#![feature(proc_macro_hygiene)]
#![feature(stmt_expr_attributes)]
#![no_std] // Don't load unnecessary hygiene information from std
extern crate std;
#[macro_use]
extern crate test_macros;
#[cfg_eval]
#[print_attr]
struct S1 {
#[cfg(FALSE)]
field_false: u8,
#[cfg(all(/*true*/))]
#[cfg_attr(FALSE, unknown_attr)]
#[cfg_attr(all(/*true*/), allow())]
field_true: u8,
}
#[cfg_eval]
#[cfg(FALSE)]
struct S2 {}
fn main() {
let _ = #[cfg_eval] #[print_attr](#[cfg(FALSE)] 0, #[cfg(all(/*true*/))] 1);
}

View file

@ -0,0 +1,135 @@
PRINT-ATTR INPUT (DISPLAY): struct S1 { #[cfg(all())] #[allow()] field_true : u8, }
PRINT-ATTR INPUT (DEBUG): TokenStream [
Ident {
ident: "struct",
span: $DIR/cfg-eval.rs:17:1: 24:2 (#0),
},
Ident {
ident: "S1",
span: $DIR/cfg-eval.rs:17:1: 24:2 (#0),
},
Group {
delimiter: Brace,
stream: TokenStream [
Punct {
ch: '#',
spacing: Alone,
span: $DIR/cfg-eval.rs:17:1: 24:2 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "cfg",
span: $DIR/cfg-eval.rs:17:1: 24:2 (#0),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [
Ident {
ident: "all",
span: $DIR/cfg-eval.rs:17:1: 24:2 (#0),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [],
span: $DIR/cfg-eval.rs:17:1: 24:2 (#0),
},
],
span: $DIR/cfg-eval.rs:17:1: 24:2 (#0),
},
],
span: $DIR/cfg-eval.rs:17:1: 24:2 (#0),
},
Punct {
ch: '#',
spacing: Alone,
span: $DIR/cfg-eval.rs:17:1: 24:2 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "allow",
span: $DIR/cfg-eval.rs:17:1: 24:2 (#0),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [],
span: $DIR/cfg-eval.rs:17:1: 24:2 (#0),
},
],
span: $DIR/cfg-eval.rs:17:1: 24:2 (#0),
},
Ident {
ident: "field_true",
span: $DIR/cfg-eval.rs:17:1: 24:2 (#0),
},
Punct {
ch: ':',
spacing: Alone,
span: $DIR/cfg-eval.rs:17:1: 24:2 (#0),
},
Ident {
ident: "u8",
span: $DIR/cfg-eval.rs:17:1: 24:2 (#0),
},
Punct {
ch: ',',
spacing: Alone,
span: $DIR/cfg-eval.rs:17:1: 24:2 (#0),
},
],
span: $DIR/cfg-eval.rs:17:1: 24:2 (#0),
},
]
PRINT-ATTR INPUT (DISPLAY): (#[cfg(all())] 1,)
PRINT-ATTR INPUT (DEBUG): TokenStream [
Group {
delimiter: Parenthesis,
stream: TokenStream [
Punct {
ch: '#',
spacing: Alone,
span: $DIR/cfg-eval.rs:31:38: 31:80 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "cfg",
span: $DIR/cfg-eval.rs:31:38: 31:80 (#0),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [
Ident {
ident: "all",
span: $DIR/cfg-eval.rs:31:38: 31:80 (#0),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [],
span: $DIR/cfg-eval.rs:31:38: 31:80 (#0),
},
],
span: $DIR/cfg-eval.rs:31:38: 31:80 (#0),
},
],
span: $DIR/cfg-eval.rs:31:38: 31:80 (#0),
},
Literal {
kind: Integer,
symbol: "1",
suffix: None,
span: $DIR/cfg-eval.rs:31:38: 31:80 (#0),
},
Punct {
ch: ',',
spacing: Alone,
span: $DIR/cfg-eval.rs:31:38: 31:80 (#0),
},
],
span: $DIR/cfg-eval.rs:31:38: 31:80 (#0),
},
]