1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
|
#![feature(macro_metavar_expr)]
// `curly` = Right hand side curly brackets
// `no_rhs_dollar` = No dollar sign at the right hand side meta variable "function"
// `round` = Left hand side round brackets
macro_rules! curly__no_rhs_dollar__round {
( $( $i:ident ),* ) => { ${ count($i) } };
}
macro_rules! curly__no_rhs_dollar__no_round {
( $i:ident ) => { ${ count($i) } };
//~^ ERROR `count` can not be placed inside the innermost repetition
}
macro_rules! curly__rhs_dollar__no_round {
( $i:ident ) => { ${ count($i) } };
//~^ ERROR `count` can not be placed inside the innermost repetition
}
#[rustfmt::skip] // autoformatters can break a few of the error traces
macro_rules! no_curly__no_rhs_dollar__round {
( $( $i:ident ),* ) => { count(i) };
//~^ ERROR cannot find function `count` in this scope
//~| ERROR cannot find value `i` in this scope
}
#[rustfmt::skip] // autoformatters can break a few of the error traces
macro_rules! no_curly__no_rhs_dollar__no_round {
( $i:ident ) => { count(i) };
//~^ ERROR cannot find function `count` in this scope
//~| ERROR cannot find value `i` in this scope
}
#[rustfmt::skip] // autoformatters can break a few of the error traces
macro_rules! no_curly__rhs_dollar__round {
( $( $i:ident ),* ) => { count($i) };
//~^ ERROR variable `i` is still repeating at this depth
}
#[rustfmt::skip] // autoformatters can break a few of the error traces
macro_rules! no_curly__rhs_dollar__no_round {
( $i:ident ) => { count($i) };
//~^ ERROR cannot find function `count` in this scope
}
// Other scenarios
macro_rules! dollar_dollar_in_the_lhs {
( $$ $a:ident ) => {
//~^ ERROR unexpected token: $
};
}
macro_rules! extra_garbage_after_metavar {
( $( $i:ident ),* ) => {
${count() a b c}
//~^ ERROR unexpected token: a
//~| ERROR expected expression, found `$`
${count($i a b c)}
//~^ ERROR unexpected token: a
${count($i, 1 a b c)}
//~^ ERROR unexpected token: a
${count($i) a b c}
//~^ ERROR unexpected token: a
${ignore($i) a b c}
//~^ ERROR unexpected token: a
${ignore($i a b c)}
//~^ ERROR unexpected token: a
${index() a b c}
//~^ ERROR unexpected token: a
${index(1 a b c)}
//~^ ERROR unexpected token: a
${index() a b c}
//~^ ERROR unexpected token: a
${index(1 a b c)}
//~^ ERROR unexpected token: a
};
}
const IDX: usize = 1;
macro_rules! metavar_depth_is_not_literal {
( $( $i:ident ),* ) => { ${ index(IDX) } };
//~^ ERROR meta-variable expression depth must be a literal
//~| ERROR expected expression, found `$`
}
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
//~| ERROR expected expression
}
macro_rules! metavar_with_literal_suffix {
( $( $i:ident ),* ) => { ${ index(1u32) } };
//~^ ERROR only unsuffixes integer literals are supported in meta-variable expressions
//~| ERROR expected expression, found `$`
}
macro_rules! metavar_without_parens {
( $( $i:ident ),* ) => { ${ count{i} } };
//~^ ERROR meta-variable expression parameter must be wrapped in parentheses
//~| ERROR expected expression, found `$`
}
#[rustfmt::skip]
macro_rules! open_brackets_without_tokens {
( $( $i:ident ),* ) => { ${ {} } };
//~^ ERROR expected expression, found `$`
//~| ERROR expected identifier
}
macro_rules! unknown_count_ident {
( $( $i:ident )* ) => {
${count(foo)}
//~^ ERROR meta-variable expressions must be referenced using a dollar sign
//~| ERROR expected expression
};
}
macro_rules! unknown_ignore_ident {
( $( $i:ident )* ) => {
${ignore(bar)}
//~^ ERROR meta-variable expressions must be referenced using a dollar sign
//~| ERROR expected expression
};
}
macro_rules! unknown_metavar {
( $( $i:ident ),* ) => { ${ aaaaaaaaaaaaaa(i) } };
//~^ ERROR unrecognized meta-variable expression
//~| ERROR expected expression
}
fn main() {
curly__no_rhs_dollar__round!(a, b, c);
curly__no_rhs_dollar__no_round!(a);
curly__rhs_dollar__no_round!(a);
no_curly__no_rhs_dollar__round!(a, b, c);
no_curly__no_rhs_dollar__no_round!(a);
no_curly__rhs_dollar__round!(a, b, c);
no_curly__rhs_dollar__no_round!(a);
//~^ ERROR cannot find value `a` in this scope
extra_garbage_after_metavar!(a);
metavar_depth_is_not_literal!(a);
metavar_token_without_ident!(a);
metavar_with_literal_suffix!(a);
metavar_without_parens!(a);
open_brackets_without_tokens!(a);
unknown_count_ident!(a);
unknown_ignore_ident!(a);
unknown_metavar!(a);
}
|