about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMichael Goulet <michael@errs.io>2023-03-14 19:05:15 +0000
committerMichael Goulet <michael@errs.io>2023-03-14 19:12:42 +0000
commit00dc3b24b7cf3db69ce4b3648e1fb9d1cd539c67 (patch)
tree4461ec8df5bffae51bad0d235bef51e87777cfbe
parent9eae77381ec58cd89346367fc498547c5e30c497 (diff)
downloadrust-00dc3b24b7cf3db69ce4b3648e1fb9d1cd539c67.tar.gz
rust-00dc3b24b7cf3db69ce4b3648e1fb9d1cd539c67.zip
Tighter spans
-rw-r--r--compiler/rustc_passes/src/check_attr.rs37
-rw-r--r--tests/ui/proc-macro/signature-proc-macro-attribute.stderr4
-rw-r--r--tests/ui/proc-macro/signature-proc-macro-derive.stderr16
-rw-r--r--tests/ui/proc-macro/signature-proc-macro.stderr16
4 files changed, 53 insertions, 20 deletions
diff --git a/compiler/rustc_passes/src/check_attr.rs b/compiler/rustc_passes/src/check_attr.rs
index 0f92c5e74ae..8bed7888142 100644
--- a/compiler/rustc_passes/src/check_attr.rs
+++ b/compiler/rustc_passes/src/check_attr.rs
@@ -20,7 +20,7 @@ use rustc_hir::{MethodKind, Target, Unsafety};
 use rustc_middle::hir::nested_filter;
 use rustc_middle::middle::resolve_bound_vars::ObjectLifetimeDefault;
 use rustc_middle::traits::ObligationCause;
-use rustc_middle::ty::error::ExpectedFound;
+use rustc_middle::ty::error::{ExpectedFound, TypeError};
 use rustc_middle::ty::query::Providers;
 use rustc_middle::ty::{self, TyCtxt};
 use rustc_session::lint::builtin::{
@@ -2213,7 +2213,7 @@ impl CheckAttrVisitor<'_> {
             tcx.fn_sig(def_id).subst(tcx, fresh_substs),
         );
 
-        let cause = ObligationCause::misc(span, def_id);
+        let mut cause = ObligationCause::misc(span, def_id);
         let sig = ocx.normalize(&cause, param_env, sig);
 
         // proc macro is not WF.
@@ -2235,6 +2235,39 @@ impl CheckAttrVisitor<'_> {
 
         if let Err(terr) = ocx.eq(&cause, param_env, expected_sig, sig) {
             let mut diag = tcx.sess.create_err(errors::ProcMacroBadSig { span, kind });
+
+            let hir_sig = tcx.hir().fn_sig_by_hir_id(hir_id);
+            if let Some(hir_sig) = hir_sig {
+                match terr {
+                    TypeError::ArgumentMutability(idx) | TypeError::ArgumentSorts(_, idx) => {
+                        if let Some(ty) = hir_sig.decl.inputs.get(idx) {
+                            diag.set_span(ty.span);
+                            cause.span = ty.span;
+                        } else if idx == hir_sig.decl.inputs.len() {
+                            let span = hir_sig.decl.output.span();
+                            diag.set_span(span);
+                            cause.span = span;
+                        }
+                    }
+                    TypeError::ArgCount => {
+                        if let Some(ty) = hir_sig.decl.inputs.get(expected_sig.inputs().len()) {
+                            diag.set_span(ty.span);
+                            cause.span = ty.span;
+                        }
+                    }
+                    TypeError::UnsafetyMismatch(_) => {
+                        // FIXME: Would be nice if we had a span here..
+                    }
+                    TypeError::AbiMismatch(_) => {
+                        // FIXME: Would be nice if we had a span here..
+                    }
+                    TypeError::VariadicMismatch(_) => {
+                        // FIXME: Would be nice if we had a span here..
+                    }
+                    _ => {}
+                }
+            }
+
             infcx.err_ctxt().note_type_err(
                 &mut diag,
                 &cause,
diff --git a/tests/ui/proc-macro/signature-proc-macro-attribute.stderr b/tests/ui/proc-macro/signature-proc-macro-attribute.stderr
index afbd18a4f78..ce832eaa5c7 100644
--- a/tests/ui/proc-macro/signature-proc-macro-attribute.stderr
+++ b/tests/ui/proc-macro/signature-proc-macro-attribute.stderr
@@ -26,10 +26,10 @@ LL | pub fn bad_everything(input: String) -> String {
               found signature `fn(std::string::String) -> std::string::String`
 
 error: attribute proc macro has incorrect signature
-  --> $DIR/signature-proc-macro-attribute.rs:28:1
+  --> $DIR/signature-proc-macro-attribute.rs:28:52
    |
 LL | pub fn too_many(a: TokenStream, b: TokenStream, c: String) -> TokenStream {
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ incorrect number of function parameters
+   |                                                    ^^^^^^ incorrect number of function parameters
    |
    = note: expected signature `fn(proc_macro::TokenStream, proc_macro::TokenStream) -> proc_macro::TokenStream`
               found signature `fn(proc_macro::TokenStream, proc_macro::TokenStream, std::string::String) -> proc_macro::TokenStream`
diff --git a/tests/ui/proc-macro/signature-proc-macro-derive.stderr b/tests/ui/proc-macro/signature-proc-macro-derive.stderr
index 7a75a808e19..03c6abad17d 100644
--- a/tests/ui/proc-macro/signature-proc-macro-derive.stderr
+++ b/tests/ui/proc-macro/signature-proc-macro-derive.stderr
@@ -1,35 +1,35 @@
 error: derive proc macro has incorrect signature
-  --> $DIR/signature-proc-macro-derive.rs:10:1
+  --> $DIR/signature-proc-macro-derive.rs:10:25
    |
 LL | pub fn bad_input(input: String) -> TokenStream {
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `proc_macro::TokenStream`, found `std::string::String`
+   |                         ^^^^^^ expected `proc_macro::TokenStream`, found `std::string::String`
    |
    = note: expected signature `fn(proc_macro::TokenStream) -> proc_macro::TokenStream`
               found signature `fn(std::string::String) -> proc_macro::TokenStream`
 
 error: derive proc macro has incorrect signature
-  --> $DIR/signature-proc-macro-derive.rs:16:1
+  --> $DIR/signature-proc-macro-derive.rs:16:42
    |
 LL | pub fn bad_output(input: TokenStream) -> String {
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `proc_macro::TokenStream`, found `std::string::String`
+   |                                          ^^^^^^ expected `proc_macro::TokenStream`, found `std::string::String`
    |
    = note: expected signature `fn(proc_macro::TokenStream) -> proc_macro::TokenStream`
               found signature `fn(proc_macro::TokenStream) -> std::string::String`
 
 error: derive proc macro has incorrect signature
-  --> $DIR/signature-proc-macro-derive.rs:22:1
+  --> $DIR/signature-proc-macro-derive.rs:22:30
    |
 LL | pub fn bad_everything(input: String) -> String {
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `proc_macro::TokenStream`, found `std::string::String`
+   |                              ^^^^^^ expected `proc_macro::TokenStream`, found `std::string::String`
    |
    = note: expected signature `fn(proc_macro::TokenStream) -> proc_macro::TokenStream`
               found signature `fn(std::string::String) -> std::string::String`
 
 error: derive proc macro has incorrect signature
-  --> $DIR/signature-proc-macro-derive.rs:28:1
+  --> $DIR/signature-proc-macro-derive.rs:28:36
    |
 LL | pub fn too_many(a: TokenStream, b: TokenStream, c: String) -> TokenStream {
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ incorrect number of function parameters
+   |                                    ^^^^^^^^^^^ incorrect number of function parameters
    |
    = note: expected signature `fn(proc_macro::TokenStream) -> proc_macro::TokenStream`
               found signature `fn(proc_macro::TokenStream, proc_macro::TokenStream, std::string::String) -> proc_macro::TokenStream`
diff --git a/tests/ui/proc-macro/signature-proc-macro.stderr b/tests/ui/proc-macro/signature-proc-macro.stderr
index 3a4bd730130..dd2cb0570da 100644
--- a/tests/ui/proc-macro/signature-proc-macro.stderr
+++ b/tests/ui/proc-macro/signature-proc-macro.stderr
@@ -1,35 +1,35 @@
 error: function-like proc macro has incorrect signature
-  --> $DIR/signature-proc-macro.rs:10:1
+  --> $DIR/signature-proc-macro.rs:10:25
    |
 LL | pub fn bad_input(input: String) -> TokenStream {
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `proc_macro::TokenStream`, found `std::string::String`
+   |                         ^^^^^^ expected `proc_macro::TokenStream`, found `std::string::String`
    |
    = note: expected signature `fn(proc_macro::TokenStream) -> proc_macro::TokenStream`
               found signature `fn(std::string::String) -> proc_macro::TokenStream`
 
 error: function-like proc macro has incorrect signature
-  --> $DIR/signature-proc-macro.rs:16:1
+  --> $DIR/signature-proc-macro.rs:16:42
    |
 LL | pub fn bad_output(input: TokenStream) -> String {
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `proc_macro::TokenStream`, found `std::string::String`
+   |                                          ^^^^^^ expected `proc_macro::TokenStream`, found `std::string::String`
    |
    = note: expected signature `fn(proc_macro::TokenStream) -> proc_macro::TokenStream`
               found signature `fn(proc_macro::TokenStream) -> std::string::String`
 
 error: function-like proc macro has incorrect signature
-  --> $DIR/signature-proc-macro.rs:22:1
+  --> $DIR/signature-proc-macro.rs:22:30
    |
 LL | pub fn bad_everything(input: String) -> String {
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `proc_macro::TokenStream`, found `std::string::String`
+   |                              ^^^^^^ expected `proc_macro::TokenStream`, found `std::string::String`
    |
    = note: expected signature `fn(proc_macro::TokenStream) -> proc_macro::TokenStream`
               found signature `fn(std::string::String) -> std::string::String`
 
 error: function-like proc macro has incorrect signature
-  --> $DIR/signature-proc-macro.rs:28:1
+  --> $DIR/signature-proc-macro.rs:28:36
    |
 LL | pub fn too_many(a: TokenStream, b: TokenStream, c: String) -> TokenStream {
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ incorrect number of function parameters
+   |                                    ^^^^^^^^^^^ incorrect number of function parameters
    |
    = note: expected signature `fn(proc_macro::TokenStream) -> proc_macro::TokenStream`
               found signature `fn(proc_macro::TokenStream, proc_macro::TokenStream, std::string::String) -> proc_macro::TokenStream`