about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAaron Turon <aturon@mozilla.com>2014-07-16 13:50:33 -0700
committerAaron Turon <aturon@mozilla.com>2014-07-16 13:53:06 -0700
commit81b69d153869062af6992dc2c99c5536c7ff99f0 (patch)
tree0ad4391d3ee95745acdef3365a60da0148c429e6
parent06c7ee9c56f7c768be94c89f699527b44be664ab (diff)
downloadrust-81b69d153869062af6992dc2c99c5536c7ff99f0.tar.gz
rust-81b69d153869062af6992dc2c99c5536c7ff99f0.zip
stability lint: ignore code from macro expansion
This small patch causes the stability lint to bail out when traversing
any AST produced via a macro expansion. Ultimately, we would like to
lint the contents of the macro at the place where the macro is defined,
but regardless we should not be linting it at the use site.

Closes #15703
-rw-r--r--src/librustc/lint/builtin.rs3
-rw-r--r--src/test/auxiliary/lint_stability.rs8
-rw-r--r--src/test/compile-fail/lint-stability.rs11
3 files changed, 20 insertions, 2 deletions
diff --git a/src/librustc/lint/builtin.rs b/src/librustc/lint/builtin.rs
index 62236d753ad..fbe4b211f97 100644
--- a/src/librustc/lint/builtin.rs
+++ b/src/librustc/lint/builtin.rs
@@ -1433,6 +1433,9 @@ impl LintPass for Stability {
     }
 
     fn check_expr(&mut self, cx: &Context, e: &ast::Expr) {
+        // if the expression was produced by a macro expansion,
+        if e.span.expn_info.is_some() { return }
+
         let id = match e.node {
             ast::ExprPath(..) | ast::ExprStruct(..) => {
                 match cx.tcx.def_map.borrow().find(&e.id) {
diff --git a/src/test/auxiliary/lint_stability.rs b/src/test/auxiliary/lint_stability.rs
index b63aa18b75d..b0090c63969 100644
--- a/src/test/auxiliary/lint_stability.rs
+++ b/src/test/auxiliary/lint_stability.rs
@@ -10,6 +10,9 @@
 #![crate_id="lint_stability#0.1"]
 #![crate_type = "lib"]
 
+#![feature(macro_rules)]
+#![macro_escape]
+
 #[deprecated]
 pub fn deprecated() {}
 #[deprecated="text"]
@@ -173,3 +176,8 @@ pub struct StableTupleStruct(pub int);
 pub struct FrozenTupleStruct(pub int);
 #[locked]
 pub struct LockedTupleStruct(pub int);
+
+#[macro_export]
+macro_rules! macro_test(
+    () => (deprecated());
+)
diff --git a/src/test/compile-fail/lint-stability.rs b/src/test/compile-fail/lint-stability.rs
index 5d06ad79c9b..3a9380befbc 100644
--- a/src/test/compile-fail/lint-stability.rs
+++ b/src/test/compile-fail/lint-stability.rs
@@ -11,13 +11,14 @@
 // aux-build:lint_stability.rs
 // aux-build:inherited_stability.rs
 
-#![feature(globs)]
+#![feature(globs, phase)]
 #![deny(unstable)]
 #![deny(deprecated)]
 #![deny(experimental)]
 #![allow(dead_code)]
 
 mod cross_crate {
+    #[phase(plugin, link)]
     extern crate lint_stability;
     use self::lint_stability::*;
 
@@ -76,7 +77,6 @@ mod cross_crate {
         foo.method_locked_text();
         foo.trait_locked_text();
 
-
         let _ = DeprecatedStruct { i: 0 }; //~ ERROR use of deprecated item
         let _ = ExperimentalStruct { i: 0 }; //~ ERROR use of experimental item
         let _ = UnstableStruct { i: 0 }; //~ ERROR use of unstable item
@@ -108,6 +108,13 @@ mod cross_crate {
         let _ = StableTupleStruct (1);
         let _ = FrozenTupleStruct (1);
         let _ = LockedTupleStruct (1);
+
+        // At the moment, the following just checks that the stability
+        // level of expanded code does not trigger the
+        // lint. Eventually, we will want to lint the contents of the
+        // macro in the module *defining* it. Also, stability levels
+        // on macros themselves are not yet linted.
+        macro_test!();
     }
 
     fn test_method_param<F: Trait>(foo: F) {