--- /dev/null
+// force-host
+// no-prefer-dynamic
+
+#![feature(proc_macro_def_site)]
+#![feature(proc_macro_diagnostic)]
+#![feature(proc_macro_hygiene)]
+#![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::<Vec<_>>() {
+ [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"),
+ }
+}
--- /dev/null
+// aux-build:resolved-located-at.rs
+
+#![feature(proc_macro_hygiene)]
+
+#[macro_use]
+extern crate resolved_located_at;
+
+fn main() {
+ resolve_located_at!(a b)
+ //~^ ERROR expected error
+ //~| ERROR mismatched types
+}
--- /dev/null
+error: expected error
+ --> $DIR/resolved-located-at.rs:9:25
+ |
+LL | resolve_located_at!(a b)
+ | ^
+ |
+ = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error[E0308]: mismatched types
+ --> $DIR/resolved-located-at.rs:9:27
+ |
+LL | fn main() {
+ | - expected `()` because of default return type
+LL | resolve_located_at!(a b)
+ | ^ expected `()`, found struct `main::S`
+ |
+ = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0308`.