| // Ensure that we don't consider `const Trait` to |
| // match the macro fragment specifier `ty` as that would be a breaking |
| // change theoretically speaking. Syntactically trait object types can |
| // be "bare", i.e., lack the prefix `dyn`. |
| // By contrast, `?Trait` *does* match `ty` and therefore an arm like |
| // `?$Trait:path` would never be reached. |
| // See `parser/macro/mbe-bare-trait-object-maybe-trait-bound.rs`. |
| // `[const] Trait` is already an error for a `ty` fragment, |
| // so we do not need to prevent that. |
| |
| macro_rules! check { |
| ($Type:ty) => { |
| compile_error!("ty"); |
| }; |
| (const $Trait:path) => {}; |
| ([const] $Trait:path) => { [const] Trait }; |
| } |
| |
| check! { const Trait } |
| check! { [const] Trait } |
| //~^ ERROR: expected identifier, found `]` |
| //~| ERROR: const trait impls are experimental |
| |
| fn main() {} |