Skip to content

Commit 0be88eb

Browse files
authored
Auto merge of #36308 - dtolnay:inputitem, r=alexcrichton
Point macros 1.1 errors to the input item Moved from alexcrichton#6 to continue discussion. Fixes #36218. Before: ```rust error[E0106]: missing lifetime specifier --> src/main.rs:10:10 | 10 | #[derive(Serialize, Deserialize)] | ^ expected lifetime parameter error[E0038]: the trait `T` cannot be made into an object --> src/main.rs:15:15 | 15 | #[derive(Serialize, Deserialize)] | ^^^^^^^^^^ the trait `T` cannot be made into an object ``` After: ```rust error[E0106]: missing lifetime specifier --> src/main.rs:11:1 | 11 | struct A { | ^ expected lifetime parameter error[E0038]: the trait `T` cannot be made into an object --> src/main.rs:16:1 | 16 | struct B<'a> { | ^ the trait `T` cannot be made into an object ```
2 parents 4812cf3 + fe41520 commit 0be88eb

File tree

4 files changed

+21
-8
lines changed

4 files changed

+21
-8
lines changed

src/libsyntax_ext/deriving/custom.rs

+18-5
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,14 @@
1010

1111
use std::panic;
1212

13+
use errors::FatalError;
1314
use rustc_macro::{TokenStream, __internal};
1415
use syntax::ast::{self, ItemKind};
15-
use syntax::codemap::Span;
16+
use syntax::codemap::{ExpnInfo, MacroAttribute, NameAndSpan, Span};
1617
use syntax::ext::base::*;
1718
use syntax::fold::{self, Folder};
18-
use errors::FatalError;
19+
use syntax::parse::token::intern;
20+
use syntax::print::pprust;
1921

2022
pub struct CustomDerive {
2123
inner: fn(TokenStream) -> TokenStream,
@@ -31,7 +33,7 @@ impl MultiItemModifier for CustomDerive {
3133
fn expand(&self,
3234
ecx: &mut ExtCtxt,
3335
span: Span,
34-
_meta_item: &ast::MetaItem,
36+
meta_item: &ast::MetaItem,
3537
item: Annotatable)
3638
-> Vec<Annotatable> {
3739
let item = match item {
@@ -53,6 +55,17 @@ impl MultiItemModifier for CustomDerive {
5355
}
5456
}
5557

58+
let input_span = Span {
59+
expn_id: ecx.codemap().record_expansion(ExpnInfo {
60+
call_site: span,
61+
callee: NameAndSpan {
62+
format: MacroAttribute(intern(&pprust::meta_item_to_string(meta_item))),
63+
span: Some(span),
64+
allow_internal_unstable: true,
65+
},
66+
}),
67+
..item.span
68+
};
5669
let input = __internal::new_token_stream(item);
5770
let res = __internal::set_parse_sess(&ecx.parse_sess, || {
5871
let inner = self.inner;
@@ -77,9 +90,9 @@ impl MultiItemModifier for CustomDerive {
7790

7891
// Right now we have no knowledge of spans at all in custom derive
7992
// macros, everything is just parsed as a string. Reassign all spans to
80-
// the #[derive] attribute for better errors here.
93+
// the input `item` for better errors here.
8194
item.into_iter().flat_map(|item| {
82-
ChangeSpan { span: span }.fold_item(item)
95+
ChangeSpan { span: input_span }.fold_item(item)
8396
}).map(Annotatable::Item).collect()
8497
}
8598
}

src/test/compile-fail-fulldeps/rustc-macro/append-impl.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ trait Append {
2323
#[derive(PartialEq,
2424
Append,
2525
Eq)]
26-
//~^^ ERROR: the semantics of constant patterns is not yet settled
2726
struct A {
27+
//~^ ERROR: the semantics of constant patterns is not yet settled
2828
inner: u32,
2929
}
3030

src/test/compile-fail-fulldeps/rustc-macro/expand-to-unstable-2.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
extern crate derive_unstable_2;
1818

1919
#[derive(Unstable)]
20-
//~^ ERROR: reserved for internal compiler
2120
struct A;
21+
//~^ ERROR: reserved for internal compiler
2222

2323
fn main() {
2424
foo();

src/test/compile-fail-fulldeps/rustc-macro/expand-to-unstable.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
extern crate derive_unstable;
1818

1919
#[derive(Unstable)]
20-
//~^ ERROR: use of unstable library feature
2120
struct A;
21+
//~^ ERROR: use of unstable library feature
2222

2323
fn main() {
2424
unsafe { foo(); }

0 commit comments

Comments
 (0)