about summary refs log tree commit diff
path: root/src/librustc_interface/passes.rs
diff options
context:
space:
mode:
authorDylan DPC <dylan.dpc@gmail.com>2020-06-12 12:28:25 +0200
committerGitHub <noreply@github.com>2020-06-12 12:28:25 +0200
commit657a41fe73942006a01d67598bcbe80b8b03e69e (patch)
treef6f5c255dc50760f8f95ad85f8288acf9ee1b562 /src/librustc_interface/passes.rs
parentc06799e4c4103330c972eb04f08aa72b7c1d5ace (diff)
parentd60df536d5d6a4ad2d6b2cdf4c443e022fe35d30 (diff)
downloadrust-657a41fe73942006a01d67598bcbe80b8b03e69e.tar.gz
rust-657a41fe73942006a01d67598bcbe80b8b03e69e.zip
Rollup merge of #73178 - petrochenkov:explint, r=varkor
expand: More precise locations for expansion-time lints

First commit: a macro expansion doesn't have a `NodeId` associated with it, but it has a parent `DefId` which we can use for linting.
The observable effect is that lints associated with macro expansions can now be `allow`ed at finer-grained level than whole crate.

Second commit: each macro definition has a `NodeId` which we can use for linting, unless that macro definition was decoded from other crate.
Diffstat (limited to 'src/librustc_interface/passes.rs')
-rw-r--r--src/librustc_interface/passes.rs15
1 files changed, 10 insertions, 5 deletions
diff --git a/src/librustc_interface/passes.rs b/src/librustc_interface/passes.rs
index 9a60e74d94d..1a9bf4e1e8f 100644
--- a/src/librustc_interface/passes.rs
+++ b/src/librustc_interface/passes.rs
@@ -307,16 +307,21 @@ fn configure_and_expand_inner<'a>(
             ecx.check_unused_macros();
         });
 
-        let mut missing_fragment_specifiers: Vec<_> =
-            ecx.parse_sess.missing_fragment_specifiers.borrow().iter().cloned().collect();
-        missing_fragment_specifiers.sort();
+        let mut missing_fragment_specifiers: Vec<_> = ecx
+            .parse_sess
+            .missing_fragment_specifiers
+            .borrow()
+            .iter()
+            .map(|(span, node_id)| (*span, *node_id))
+            .collect();
+        missing_fragment_specifiers.sort_unstable_by_key(|(span, _)| *span);
 
         let recursion_limit_hit = ecx.reduced_recursion_limit.is_some();
 
-        for span in missing_fragment_specifiers {
+        for (span, node_id) in missing_fragment_specifiers {
             let lint = lint::builtin::MISSING_FRAGMENT_SPECIFIER;
             let msg = "missing fragment specifier";
-            resolver.lint_buffer().buffer_lint(lint, ast::CRATE_NODE_ID, span, msg);
+            resolver.lint_buffer().buffer_lint(lint, node_id, span, msg);
         }
         if cfg!(windows) {
             env::set_var("PATH", &old_path);