| //@ check-pass |
| //@ compile-flags: -Z span-debug |
| //@ aux-build:test-macros.rs |
| |
| #![feature(cfg_eval)] |
| #![feature(proc_macro_hygiene)] |
| #![feature(stmt_expr_attributes)] |
| #![feature(rustc_attrs)] |
| #![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() { |
| // Subtle - we need a trailing comma after the '1' - otherwise, `#[cfg_eval]` will |
| // turn this into `(#[cfg(all())] 1)`, which is a parenthesized expression, not a tuple |
| // expression. `#[cfg]` is not supported inside parenthesized expressions, so this will |
| // produce an error when attribute collection runs. |
| let _ = #[cfg_eval] #[print_attr] #[cfg_attr(not(FALSE), rustc_dummy)] |
| (#[cfg(FALSE)] 0, #[cfg(all(/*true*/))] 1,); |
| } |