// force-host // no-prefer-dynamic #![feature(proc_macro_def_site)] #![feature(proc_macro_diagnostic)] #![feature(proc_macro_quote)] #![crate_type = "proc-macro"] extern crate proc_macro; use proc_macro::*; #[proc_macro] pub fn resolve_located_at(input: TokenStream) -> TokenStream { match &*input.into_iter().collect::>() { [a, b, ..] => { // The error is reported at input `a`. let mut diag = Diagnostic::new(Level::Error, "expected error"); diag.set_spans(Span::def_site().located_at(a.span())); diag.emit(); // Resolves to `struct S;` at def site, but the error is reported at input `b`. let s = TokenTree::Ident(Ident::new("S", b.span().resolved_at(Span::def_site()))); quote!({ struct S; $s }) } _ => panic!("unexpected input"), } }