File tree Expand file tree Collapse file tree 3 files changed +65
-0
lines changed Expand file tree Collapse file tree 3 files changed +65
-0
lines changed Original file line number Diff line number Diff line change 1+ // force-host
2+ // no-prefer-dynamic
3+
4+ #![ feature( proc_macro_def_site) ]
5+ #![ feature( proc_macro_diagnostic) ]
6+ #![ feature( proc_macro_hygiene) ]
7+ #![ feature( proc_macro_quote) ]
8+ #![ crate_type = "proc-macro" ]
9+
10+ extern crate proc_macro;
11+ use proc_macro:: * ;
12+
13+ #[ proc_macro]
14+ pub fn resolve_located_at ( input : TokenStream ) -> TokenStream {
15+ match & * input. into_iter ( ) . collect :: < Vec < _ > > ( ) {
16+ [ a, b, ..] => {
17+ // The error is reported at input `a`.
18+ let mut diag = Diagnostic :: new ( Level :: Error , "expected error" ) ;
19+ diag. set_spans ( Span :: def_site ( ) . located_at ( a. span ( ) ) ) ;
20+ diag. emit ( ) ;
21+
22+ // Resolves to `struct S;` at def site, but the error is reported at input `b`.
23+ let s = TokenTree :: Ident ( Ident :: new ( "S" , b. span ( ) . resolved_at ( Span :: def_site ( ) ) ) ) ;
24+ quote ! ( {
25+ struct S ;
26+
27+ $s
28+ } )
29+ }
30+ _ => panic ! ( "unexpected input" ) ,
31+ }
32+ }
Original file line number Diff line number Diff line change 1+ // aux-build:resolved-located-at.rs
2+
3+ #![ feature( proc_macro_hygiene) ]
4+
5+ #[ macro_use]
6+ extern crate resolved_located_at;
7+
8+ fn main ( ) {
9+ resolve_located_at ! ( a b)
10+ //~^ ERROR expected error
11+ //~| ERROR mismatched types
12+ }
Original file line number Diff line number Diff line change 1+ error: expected error
2+ --> $DIR/resolved-located-at.rs:9:25
3+ |
4+ LL | resolve_located_at!(a b)
5+ | ^
6+ |
7+ = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
8+
9+ error[E0308]: mismatched types
10+ --> $DIR/resolved-located-at.rs:9:27
11+ |
12+ LL | fn main() {
13+ | - expected `()` because of default return type
14+ LL | resolve_located_at!(a b)
15+ | ^ expected `()`, found struct `main::S`
16+ |
17+ = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
18+
19+ error: aborting due to 2 previous errors
20+
21+ For more information about this error, try `rustc --explain E0308`.
You can’t perform that action at this time.
0 commit comments