//@ force-host //@ no-prefer-dynamic #![feature(proc_macro_quote)] #![crate_type = "proc-macro"] extern crate proc_macro; use proc_macro::*; #[proc_macro] pub fn proc_macro_rules(input: TokenStream) -> TokenStream { if input.is_empty() { let id = |s| TokenTree::from(Ident::new(s, Span::mixed_site())); let item_def = id("ItemDef"); let local_def = id("local_def"); let item_use = id("ItemUse"); let local_use = id("local_use"); let mut single_quote = Punct::new('\'', Spacing::Joint); single_quote.set_span(Span::mixed_site()); let label_use: TokenStream = [ TokenTree::from(single_quote), id("label_use"), ].iter().cloned().collect(); quote!( struct $item_def; let $local_def = 0; $item_use; // OK $local_use; // ERROR break $label_use; // ERROR ) } else { let mut dollar_crate = input.into_iter().next().unwrap(); dollar_crate.set_span(Span::mixed_site()); quote!( type A = $dollar_crate::ItemUse; ) } }