about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVadim Petrochenkov <vadim.petrochenkov@gmail.com>2020-11-12 23:42:42 +0300
committerVadim Petrochenkov <vadim.petrochenkov@gmail.com>2020-11-20 19:35:03 +0300
commit993bb072ff30a0e6fbc4689ba1639dfdb951888c (patch)
tree8ecec80ce62bb7bde501c06d255115a4cf5e65de
parentae6aa22cf26fede2177abe4ff974030058885b7a (diff)
downloadrust-993bb072ff30a0e6fbc4689ba1639dfdb951888c.tar.gz
rust-993bb072ff30a0e6fbc4689ba1639dfdb951888c.zip
rustc_expand: Mark inner `#![test]` attributes as soft-unstable
-rw-r--r--compiler/rustc_resolve/src/macros.rs29
-rw-r--r--library/std/src/num/tests.rs6
-rw-r--r--src/test/ui/feature-gate/issue-43106-gating-of-test.rs1
-rw-r--r--src/test/ui/feature-gate/issue-43106-gating-of-test.stderr2
-rw-r--r--src/test/ui/issues/issue-28134.rs1
-rw-r--r--src/test/ui/issues/issue-28134.stderr2
-rw-r--r--src/test/ui/proc-macro/proc-macro-gates.rs5
-rw-r--r--src/test/ui/proc-macro/proc-macro-gates.stderr12
8 files changed, 37 insertions, 21 deletions
diff --git a/compiler/rustc_resolve/src/macros.rs b/compiler/rustc_resolve/src/macros.rs
index 1ee96f81e4f..c8dbe685128 100644
--- a/compiler/rustc_resolve/src/macros.rs
+++ b/compiler/rustc_resolve/src/macros.rs
@@ -22,7 +22,7 @@ use rustc_hir::def::{self, DefKind, NonMacroAttrKind};
 use rustc_hir::def_id;
 use rustc_middle::middle::stability;
 use rustc_middle::ty;
-use rustc_session::lint::builtin::UNUSED_MACROS;
+use rustc_session::lint::builtin::{SOFT_UNSTABLE, UNUSED_MACROS};
 use rustc_session::parse::feature_err;
 use rustc_session::Session;
 use rustc_span::edition::Edition;
@@ -459,22 +459,21 @@ impl<'a> Resolver<'a> {
         }
 
         // We are trying to avoid reporting this error if other related errors were reported.
-        if inner_attr
+        if res != Res::Err
+            && inner_attr
             && !self.session.features_untracked().custom_inner_attributes
-            && path != &sym::test
-            && res != Res::Err
         {
-            feature_err(
-                &self.session.parse_sess,
-                sym::custom_inner_attributes,
-                path.span,
-                match res {
-                    Res::Def(..) => "inner macro attributes are unstable",
-                    Res::NonMacroAttr(..) => "custom inner attributes are unstable",
-                    _ => unreachable!(),
-                },
-            )
-            .emit();
+            let msg = match res {
+                Res::Def(..) => "inner macro attributes are unstable",
+                Res::NonMacroAttr(..) => "custom inner attributes are unstable",
+                _ => unreachable!(),
+            };
+            if path == &sym::test {
+                self.session.parse_sess.buffer_lint(SOFT_UNSTABLE, path.span, node_id, msg);
+            } else {
+                feature_err(&self.session.parse_sess, sym::custom_inner_attributes, path.span, msg)
+                    .emit();
+            }
         }
 
         Ok((ext, res))
diff --git a/library/std/src/num/tests.rs b/library/std/src/num/tests.rs
index 2f50b73f490..df0df3f23f7 100644
--- a/library/std/src/num/tests.rs
+++ b/library/std/src/num/tests.rs
@@ -75,8 +75,8 @@ fn test_checked_mul() {
 
 macro_rules! test_is_power_of_two {
     ($test_name:ident, $T:ident) => {
+        #[test]
         fn $test_name() {
-            #![test]
             assert_eq!((0 as $T).is_power_of_two(), false);
             assert_eq!((1 as $T).is_power_of_two(), true);
             assert_eq!((2 as $T).is_power_of_two(), true);
@@ -96,8 +96,8 @@ test_is_power_of_two! { test_is_power_of_two_uint, usize }
 
 macro_rules! test_next_power_of_two {
     ($test_name:ident, $T:ident) => {
+        #[test]
         fn $test_name() {
-            #![test]
             assert_eq!((0 as $T).next_power_of_two(), 1);
             let mut next_power = 1;
             for i in 1 as $T..40 {
@@ -118,8 +118,8 @@ test_next_power_of_two! { test_next_power_of_two_uint, usize }
 
 macro_rules! test_checked_next_power_of_two {
     ($test_name:ident, $T:ident) => {
+        #[test]
         fn $test_name() {
-            #![test]
             assert_eq!((0 as $T).checked_next_power_of_two(), Some(1));
             let smax = $T::MAX >> 1;
             assert_eq!(smax.checked_next_power_of_two(), Some(smax + 1));
diff --git a/src/test/ui/feature-gate/issue-43106-gating-of-test.rs b/src/test/ui/feature-gate/issue-43106-gating-of-test.rs
index d343746955f..ee3fe712e36 100644
--- a/src/test/ui/feature-gate/issue-43106-gating-of-test.rs
+++ b/src/test/ui/feature-gate/issue-43106-gating-of-test.rs
@@ -1,5 +1,6 @@
 // The non-crate level cases are in issue-43106-gating-of-builtin-attrs.rs.
 
+#![allow(soft_unstable)]
 #![test                    = "4200"]
 //~^ ERROR cannot determine resolution for the attribute macro `test`
 
diff --git a/src/test/ui/feature-gate/issue-43106-gating-of-test.stderr b/src/test/ui/feature-gate/issue-43106-gating-of-test.stderr
index a7d3a1e1684..335af5e7905 100644
--- a/src/test/ui/feature-gate/issue-43106-gating-of-test.stderr
+++ b/src/test/ui/feature-gate/issue-43106-gating-of-test.stderr
@@ -1,5 +1,5 @@
 error: cannot determine resolution for the attribute macro `test`
-  --> $DIR/issue-43106-gating-of-test.rs:3:4
+  --> $DIR/issue-43106-gating-of-test.rs:4:4
    |
 LL | #![test                    = "4200"]
    |    ^^^^
diff --git a/src/test/ui/issues/issue-28134.rs b/src/test/ui/issues/issue-28134.rs
index fa692db4bf6..1ed2d330b51 100644
--- a/src/test/ui/issues/issue-28134.rs
+++ b/src/test/ui/issues/issue-28134.rs
@@ -1,3 +1,4 @@
 // compile-flags: --test
 
+#![allow(soft_unstable)]
 #![test] //~ ERROR cannot determine resolution for the attribute macro `test`
diff --git a/src/test/ui/issues/issue-28134.stderr b/src/test/ui/issues/issue-28134.stderr
index 5f8d27dd043..8ed4d015f32 100644
--- a/src/test/ui/issues/issue-28134.stderr
+++ b/src/test/ui/issues/issue-28134.stderr
@@ -1,5 +1,5 @@
 error: cannot determine resolution for the attribute macro `test`
-  --> $DIR/issue-28134.rs:3:4
+  --> $DIR/issue-28134.rs:4:4
    |
 LL | #![test]
    |    ^^^^
diff --git a/src/test/ui/proc-macro/proc-macro-gates.rs b/src/test/ui/proc-macro/proc-macro-gates.rs
index 4c72ecbfc03..e2cf4e73987 100644
--- a/src/test/ui/proc-macro/proc-macro-gates.rs
+++ b/src/test/ui/proc-macro/proc-macro-gates.rs
@@ -45,4 +45,9 @@ fn attrs() {
     //~^ ERROR: custom attributes cannot be applied to expressions
 }
 
+fn test_case() {
+    #![test] //~ ERROR inner macro attributes are unstable
+             //~| WARN this was previously accepted
+}
+
 fn main() {}
diff --git a/src/test/ui/proc-macro/proc-macro-gates.stderr b/src/test/ui/proc-macro/proc-macro-gates.stderr
index 33a808037ee..118213a17d4 100644
--- a/src/test/ui/proc-macro/proc-macro-gates.stderr
+++ b/src/test/ui/proc-macro/proc-macro-gates.stderr
@@ -76,6 +76,16 @@ LL |     let _x = #[identity_attr] println!();
    = note: see issue #54727 <https://github.com/rust-lang/rust/issues/54727> for more information
    = help: add `#![feature(proc_macro_hygiene)]` to the crate attributes to enable
 
-error: aborting due to 9 previous errors
+error: inner macro attributes are unstable
+  --> $DIR/proc-macro-gates.rs:49:8
+   |
+LL |     #![test]
+   |        ^^^^
+   |
+   = note: `#[deny(soft_unstable)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #64266 <https://github.com/rust-lang/rust/issues/64266>
+
+error: aborting due to 10 previous errors
 
 For more information about this error, try `rustc --explain E0658`.