// General syntax errors that apply to all matavariable expressions // // We don't invoke the macros here to ensure code gets rejected at the definition rather than // only when expanded. #![feature(macro_metavar_expr)] macro_rules! dollar_dollar_in_the_lhs { ( $$ $a:ident ) => { //~^ ERROR unexpected token: $ }; } macro_rules! metavar_in_the_lhs { ( ${ len() } ) => { //~^ ERROR unexpected token: { //~| ERROR expected one of: `*`, `+`, or `?` }; } macro_rules! metavar_token_without_ident { ( $( $i:ident ),* ) => { ${ ignore() } }; //~^ ERROR meta-variable expressions must be referenced using a dollar sign } macro_rules! metavar_with_literal_suffix { ( $( $i:ident ),* ) => { ${ index(1u32) } }; //~^ ERROR only unsuffixes integer literals are supported in meta-variable expressions } macro_rules! mve_without_parens { ( $( $i:ident ),* ) => { ${ count } }; //~^ ERROR expected `(` } #[rustfmt::skip] macro_rules! empty_expression { () => { ${} }; //~^ ERROR expected identifier or string literal } #[rustfmt::skip] macro_rules! open_brackets_with_lit { () => { ${ "hi" } }; //~^ ERROR expected identifier } macro_rules! mvs_missing_paren { ( $( $i:ident ),* ) => { ${ count $i ($i) } }; //~^ ERROR expected `(` } macro_rules! mve_wrong_delim { ( $( $i:ident ),* ) => { ${ count{i} } }; //~^ ERROR expected `(` } macro_rules! invalid_metavar { () => { ${ignore($123)} } //~^ ERROR expected identifier, found `123` } #[rustfmt::skip] macro_rules! open_brackets_with_group { ( $( $i:ident ),* ) => { ${ {} } }; //~^ ERROR expected identifier } macro_rules! extra_garbage_after_metavar { ( $( $i:ident ),* ) => { ${count() a b c} //~^ ERROR unexpected trailing tokens ${count($i a b c)} //~^ ERROR unexpected trailing tokens ${count($i, 1 a b c)} //~^ ERROR unexpected trailing tokens ${count($i) a b c} //~^ ERROR unexpected trailing tokens ${ignore($i) a b c} //~^ ERROR unexpected trailing tokens ${ignore($i a b c)} //~^ ERROR unexpected trailing tokens ${index() a b c} //~^ ERROR unexpected trailing tokens ${index(1 a b c)} //~^ ERROR unexpected trailing tokens ${index() a b c} //~^ ERROR unexpected trailing tokens ${index(1 a b c)} //~^ ERROR unexpected trailing tokens ${index(1, a b c)} //~^ ERROR unexpected trailing tokens }; } const IDX: usize = 1; macro_rules! metavar_depth_is_not_literal { ( $( $i:ident ),* ) => { ${ index(IDX) } }; //~^ ERROR meta-variable expression depth must be a literal } macro_rules! unknown_count_ident { ( $( $i:ident )* ) => { ${count(foo)} //~^ ERROR meta-variable expressions must be referenced using a dollar sign }; } macro_rules! unknown_ignore_ident { ( $( $i:ident )* ) => { ${ignore(bar)} //~^ ERROR meta-variable expressions must be referenced using a dollar sign }; } macro_rules! unknown_metavar { ( $( $i:ident ),* ) => { ${ aaaaaaaaaaaaaa(i) } }; //~^ ERROR unrecognized metavariable expression } fn main() {}