]> git.lizzy.rs Git - rust.git/commitdiff
Allow individual lints to opt into being reported in external macros
authorOliver Schneider <github35764891676564198441@oli-obk.de>
Fri, 20 Jul 2018 20:45:52 +0000 (22:45 +0200)
committerOliver Schneider <github35764891676564198441@oli-obk.de>
Fri, 20 Jul 2018 20:45:52 +0000 (22:45 +0200)
src/librustc/lint/builtin.rs
src/librustc/lint/mod.rs

index a46b31206224732568d9094dacb59c764fe8aff2..430e06ecbdfbc634f411adc5745878444d9a3c06 100644 (file)
@@ -77,7 +77,8 @@
 declare_lint! {
     pub UNREACHABLE_CODE,
     Warn,
-    "detects unreachable code paths"
+    "detects unreachable code paths",
+    report_in_external_macro
 }
 
 declare_lint! {
 declare_lint! {
     pub DEPRECATED,
     Warn,
-    "detects use of deprecated items"
+    "detects use of deprecated items",
+    report_in_external_macro
 }
 
 declare_lint! {
index 8efce297a9117414117f48afddfd44980e6ed8bf..6fa6c31c7421d19a7bc6dabda04a38bd13ff8a6c 100644 (file)
@@ -80,6 +80,9 @@ pub struct Lint {
     /// Starting at the given edition, default to the given lint level. If this is `None`, then use
     /// `default_level`.
     pub edition_lint_opts: Option<(Edition, Level)>,
+
+    /// Whether this lint is reported even inside expansions of external macros
+    pub report_in_external_macro: bool,
 }
 
 impl Lint {
@@ -100,11 +103,18 @@ pub fn default_level(&self, session: &Session) -> Level {
 #[macro_export]
 macro_rules! declare_lint {
     ($vis: vis $NAME: ident, $Level: ident, $desc: expr) => (
+        declare_lint!{$vis $NAME, $Level, $desc, false}
+    );
+    ($vis: vis $NAME: ident, $Level: ident, $desc: expr, report_in_external_macro) => (
+        declare_lint!{$vis $NAME, $Level, $desc, true}
+    );
+    ($vis: vis $NAME: ident, $Level: ident, $desc: expr, $external: expr) => (
         $vis static $NAME: &$crate::lint::Lint = &$crate::lint::Lint {
             name: stringify!($NAME),
             default_level: $crate::lint::$Level,
             desc: $desc,
             edition_lint_opts: None,
+            report_in_external_macro: $external,
         };
     );
     ($vis: vis $NAME: ident, $Level: ident, $desc: expr,
@@ -115,6 +125,7 @@ macro_rules! declare_lint {
             default_level: $crate::lint::$Level,
             desc: $desc,
             edition_lint_opts: Some(($lint_edition, $crate::lint::Level::$edition_level)),
+            report_in_external_macro: false,
         };
     );
 }
@@ -583,8 +594,7 @@ pub fn struct_lint_level<'a>(sess: &'a Session,
     // items to take care of (delete the macro invocation). As a result we have
     // a few lints we whitelist here for allowing a lint even though it's in a
     // foreign macro invocation.
-    } else if lint_id != LintId::of(builtin::UNREACHABLE_CODE) &&
-        lint_id != LintId::of(builtin::DEPRECATED) {
+    } else if !lint.report_in_external_macro {
         if err.span.primary_spans().iter().any(|s| in_external_macro(sess, *s)) {
             err.cancel();
         }