Skip to content

Commit 00dc3b2

Browse files
Tighter spans
1 parent 9eae773 commit 00dc3b2

File tree

4 files changed

+53
-20
lines changed

4 files changed

+53
-20
lines changed

compiler/rustc_passes/src/check_attr.rs

+35-2
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use rustc_hir::{MethodKind, Target, Unsafety};
2020
use rustc_middle::hir::nested_filter;
2121
use rustc_middle::middle::resolve_bound_vars::ObjectLifetimeDefault;
2222
use rustc_middle::traits::ObligationCause;
23-
use rustc_middle::ty::error::ExpectedFound;
23+
use rustc_middle::ty::error::{ExpectedFound, TypeError};
2424
use rustc_middle::ty::query::Providers;
2525
use rustc_middle::ty::{self, TyCtxt};
2626
use rustc_session::lint::builtin::{
@@ -2213,7 +2213,7 @@ impl CheckAttrVisitor<'_> {
22132213
tcx.fn_sig(def_id).subst(tcx, fresh_substs),
22142214
);
22152215

2216-
let cause = ObligationCause::misc(span, def_id);
2216+
let mut cause = ObligationCause::misc(span, def_id);
22172217
let sig = ocx.normalize(&cause, param_env, sig);
22182218

22192219
// proc macro is not WF.
@@ -2235,6 +2235,39 @@ impl CheckAttrVisitor<'_> {
22352235

22362236
if let Err(terr) = ocx.eq(&cause, param_env, expected_sig, sig) {
22372237
let mut diag = tcx.sess.create_err(errors::ProcMacroBadSig { span, kind });
2238+
2239+
let hir_sig = tcx.hir().fn_sig_by_hir_id(hir_id);
2240+
if let Some(hir_sig) = hir_sig {
2241+
match terr {
2242+
TypeError::ArgumentMutability(idx) | TypeError::ArgumentSorts(_, idx) => {
2243+
if let Some(ty) = hir_sig.decl.inputs.get(idx) {
2244+
diag.set_span(ty.span);
2245+
cause.span = ty.span;
2246+
} else if idx == hir_sig.decl.inputs.len() {
2247+
let span = hir_sig.decl.output.span();
2248+
diag.set_span(span);
2249+
cause.span = span;
2250+
}
2251+
}
2252+
TypeError::ArgCount => {
2253+
if let Some(ty) = hir_sig.decl.inputs.get(expected_sig.inputs().len()) {
2254+
diag.set_span(ty.span);
2255+
cause.span = ty.span;
2256+
}
2257+
}
2258+
TypeError::UnsafetyMismatch(_) => {
2259+
// FIXME: Would be nice if we had a span here..
2260+
}
2261+
TypeError::AbiMismatch(_) => {
2262+
// FIXME: Would be nice if we had a span here..
2263+
}
2264+
TypeError::VariadicMismatch(_) => {
2265+
// FIXME: Would be nice if we had a span here..
2266+
}
2267+
_ => {}
2268+
}
2269+
}
2270+
22382271
infcx.err_ctxt().note_type_err(
22392272
&mut diag,
22402273
&cause,

tests/ui/proc-macro/signature-proc-macro-attribute.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ LL | pub fn bad_everything(input: String) -> String {
2626
found signature `fn(std::string::String) -> std::string::String`
2727

2828
error: attribute proc macro has incorrect signature
29-
--> $DIR/signature-proc-macro-attribute.rs:28:1
29+
--> $DIR/signature-proc-macro-attribute.rs:28:52
3030
|
3131
LL | pub fn too_many(a: TokenStream, b: TokenStream, c: String) -> TokenStream {
32-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ incorrect number of function parameters
32+
| ^^^^^^ incorrect number of function parameters
3333
|
3434
= note: expected signature `fn(proc_macro::TokenStream, proc_macro::TokenStream) -> proc_macro::TokenStream`
3535
found signature `fn(proc_macro::TokenStream, proc_macro::TokenStream, std::string::String) -> proc_macro::TokenStream`

tests/ui/proc-macro/signature-proc-macro-derive.stderr

+8-8
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,35 @@
11
error: derive proc macro has incorrect signature
2-
--> $DIR/signature-proc-macro-derive.rs:10:1
2+
--> $DIR/signature-proc-macro-derive.rs:10:25
33
|
44
LL | pub fn bad_input(input: String) -> TokenStream {
5-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `proc_macro::TokenStream`, found `std::string::String`
5+
| ^^^^^^ expected `proc_macro::TokenStream`, found `std::string::String`
66
|
77
= note: expected signature `fn(proc_macro::TokenStream) -> proc_macro::TokenStream`
88
found signature `fn(std::string::String) -> proc_macro::TokenStream`
99

1010
error: derive proc macro has incorrect signature
11-
--> $DIR/signature-proc-macro-derive.rs:16:1
11+
--> $DIR/signature-proc-macro-derive.rs:16:42
1212
|
1313
LL | pub fn bad_output(input: TokenStream) -> String {
14-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `proc_macro::TokenStream`, found `std::string::String`
14+
| ^^^^^^ expected `proc_macro::TokenStream`, found `std::string::String`
1515
|
1616
= note: expected signature `fn(proc_macro::TokenStream) -> proc_macro::TokenStream`
1717
found signature `fn(proc_macro::TokenStream) -> std::string::String`
1818

1919
error: derive proc macro has incorrect signature
20-
--> $DIR/signature-proc-macro-derive.rs:22:1
20+
--> $DIR/signature-proc-macro-derive.rs:22:30
2121
|
2222
LL | pub fn bad_everything(input: String) -> String {
23-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `proc_macro::TokenStream`, found `std::string::String`
23+
| ^^^^^^ expected `proc_macro::TokenStream`, found `std::string::String`
2424
|
2525
= note: expected signature `fn(proc_macro::TokenStream) -> proc_macro::TokenStream`
2626
found signature `fn(std::string::String) -> std::string::String`
2727

2828
error: derive proc macro has incorrect signature
29-
--> $DIR/signature-proc-macro-derive.rs:28:1
29+
--> $DIR/signature-proc-macro-derive.rs:28:36
3030
|
3131
LL | pub fn too_many(a: TokenStream, b: TokenStream, c: String) -> TokenStream {
32-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ incorrect number of function parameters
32+
| ^^^^^^^^^^^ incorrect number of function parameters
3333
|
3434
= note: expected signature `fn(proc_macro::TokenStream) -> proc_macro::TokenStream`
3535
found signature `fn(proc_macro::TokenStream, proc_macro::TokenStream, std::string::String) -> proc_macro::TokenStream`

tests/ui/proc-macro/signature-proc-macro.stderr

+8-8
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,35 @@
11
error: function-like proc macro has incorrect signature
2-
--> $DIR/signature-proc-macro.rs:10:1
2+
--> $DIR/signature-proc-macro.rs:10:25
33
|
44
LL | pub fn bad_input(input: String) -> TokenStream {
5-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `proc_macro::TokenStream`, found `std::string::String`
5+
| ^^^^^^ expected `proc_macro::TokenStream`, found `std::string::String`
66
|
77
= note: expected signature `fn(proc_macro::TokenStream) -> proc_macro::TokenStream`
88
found signature `fn(std::string::String) -> proc_macro::TokenStream`
99

1010
error: function-like proc macro has incorrect signature
11-
--> $DIR/signature-proc-macro.rs:16:1
11+
--> $DIR/signature-proc-macro.rs:16:42
1212
|
1313
LL | pub fn bad_output(input: TokenStream) -> String {
14-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `proc_macro::TokenStream`, found `std::string::String`
14+
| ^^^^^^ expected `proc_macro::TokenStream`, found `std::string::String`
1515
|
1616
= note: expected signature `fn(proc_macro::TokenStream) -> proc_macro::TokenStream`
1717
found signature `fn(proc_macro::TokenStream) -> std::string::String`
1818

1919
error: function-like proc macro has incorrect signature
20-
--> $DIR/signature-proc-macro.rs:22:1
20+
--> $DIR/signature-proc-macro.rs:22:30
2121
|
2222
LL | pub fn bad_everything(input: String) -> String {
23-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `proc_macro::TokenStream`, found `std::string::String`
23+
| ^^^^^^ expected `proc_macro::TokenStream`, found `std::string::String`
2424
|
2525
= note: expected signature `fn(proc_macro::TokenStream) -> proc_macro::TokenStream`
2626
found signature `fn(std::string::String) -> std::string::String`
2727

2828
error: function-like proc macro has incorrect signature
29-
--> $DIR/signature-proc-macro.rs:28:1
29+
--> $DIR/signature-proc-macro.rs:28:36
3030
|
3131
LL | pub fn too_many(a: TokenStream, b: TokenStream, c: String) -> TokenStream {
32-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ incorrect number of function parameters
32+
| ^^^^^^^^^^^ incorrect number of function parameters
3333
|
3434
= note: expected signature `fn(proc_macro::TokenStream) -> proc_macro::TokenStream`
3535
found signature `fn(proc_macro::TokenStream, proc_macro::TokenStream, std::string::String) -> proc_macro::TokenStream`

0 commit comments

Comments
 (0)