about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJonas Schievink <jonasschievink@gmail.com>2020-09-25 19:42:52 +0200
committerGitHub <noreply@github.com>2020-09-25 19:42:52 +0200
commit12b8d8943d5439af4e529390e70d478a0994eeb3 (patch)
treebbbdbb7e54c33a24f23981e1c97f77ae8fbe5791
parenta7bdf851cfc869fe0a1938705bc62493034c2ea0 (diff)
parent54c9c949a171b9c55d265ab4831d310e5865b4ee (diff)
downloadrust-12b8d8943d5439af4e529390e70d478a0994eeb3.tar.gz
rust-12b8d8943d5439af4e529390e70d478a0994eeb3.zip
Rollup merge of #77183 - bugadani:issue-77088, r=varkor
Allow multiple allow_internal_unstable attributes

Fixes #77088
-rw-r--r--compiler/rustc_attr/src/builtin.rs21
-rw-r--r--src/test/ui/internal/auxiliary/internal_unstable.rs9
-rw-r--r--src/test/ui/internal/internal-unstable.rs1
-rw-r--r--src/test/ui/internal/internal-unstable.stderr8
4 files changed, 28 insertions, 11 deletions
diff --git a/compiler/rustc_attr/src/builtin.rs b/compiler/rustc_attr/src/builtin.rs
index 1808eb270ba..03dbcc45024 100644
--- a/compiler/rustc_attr/src/builtin.rs
+++ b/compiler/rustc_attr/src/builtin.rs
@@ -1022,14 +1022,21 @@ pub fn find_transparency(
 
 pub fn allow_internal_unstable<'a>(
     sess: &'a Session,
-    attrs: &[Attribute],
+    attrs: &'a [Attribute],
 ) -> Option<impl Iterator<Item = Symbol> + 'a> {
-    let attr = sess.find_by_name(attrs, sym::allow_internal_unstable)?;
-    let list = attr.meta_item_list().or_else(|| {
-        sess.diagnostic()
-            .span_err(attr.span, "allow_internal_unstable expects list of feature names");
-        None
-    })?;
+    let attrs = sess.filter_by_name(attrs, sym::allow_internal_unstable);
+    let list = attrs
+        .filter_map(move |attr| {
+            attr.meta_item_list().or_else(|| {
+                sess.diagnostic().span_err(
+                    attr.span,
+                    "`allow_internal_unstable` expects a list of feature names",
+                );
+                None
+            })
+        })
+        .flatten();
+
     Some(list.into_iter().filter_map(move |it| {
         let name = it.ident().map(|ident| ident.name);
         if name.is_none() {
diff --git a/src/test/ui/internal/auxiliary/internal_unstable.rs b/src/test/ui/internal/auxiliary/internal_unstable.rs
index 148cbd1899e..eb4d6cb380e 100644
--- a/src/test/ui/internal/auxiliary/internal_unstable.rs
+++ b/src/test/ui/internal/auxiliary/internal_unstable.rs
@@ -52,6 +52,15 @@ macro_rules! access_field_allow {
     ($e: expr) => { $e.x }
 }
 
+// regression test for #77088
+#[stable(feature = "stable", since = "1.0.0")]
+#[allow_internal_unstable(struct_field)]
+#[allow_internal_unstable(struct2_field)]
+#[macro_export]
+macro_rules! access_field_allow2 {
+    ($e: expr) => { $e.x }
+}
+
 #[stable(feature = "stable", since = "1.0.0")]
 #[allow_internal_unstable()]
 #[macro_export]
diff --git a/src/test/ui/internal/internal-unstable.rs b/src/test/ui/internal/internal-unstable.rs
index e09a5d89172..94bd6aab23b 100644
--- a/src/test/ui/internal/internal-unstable.rs
+++ b/src/test/ui/internal/internal-unstable.rs
@@ -28,6 +28,7 @@ fn main() {
     construct_unstable_allow!(0);
     |x: internal_unstable::Foo| { call_method_allow!(x) };
     |x: internal_unstable::Bar| { access_field_allow!(x) };
+    |x: internal_unstable::Bar| { access_field_allow2!(x) }; // regression test for #77088
 
     // bad.
     pass_through_allow!(internal_unstable::unstable()); //~ ERROR use of unstable
diff --git a/src/test/ui/internal/internal-unstable.stderr b/src/test/ui/internal/internal-unstable.stderr
index 2c6bf42ae86..2e6360c75c4 100644
--- a/src/test/ui/internal/internal-unstable.stderr
+++ b/src/test/ui/internal/internal-unstable.stderr
@@ -1,5 +1,5 @@
 error[E0658]: use of unstable library feature 'function'
-  --> $DIR/internal-unstable.rs:33:25
+  --> $DIR/internal-unstable.rs:34:25
    |
 LL |     pass_through_allow!(internal_unstable::unstable());
    |                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -7,7 +7,7 @@ LL |     pass_through_allow!(internal_unstable::unstable());
    = help: add `#![feature(function)]` to the crate attributes to enable
 
 error[E0658]: use of unstable library feature 'function'
-  --> $DIR/internal-unstable.rs:35:27
+  --> $DIR/internal-unstable.rs:36:27
    |
 LL |     pass_through_noallow!(internal_unstable::unstable());
    |                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -15,7 +15,7 @@ LL |     pass_through_noallow!(internal_unstable::unstable());
    = help: add `#![feature(function)]` to the crate attributes to enable
 
 error[E0658]: use of unstable library feature 'function'
-  --> $DIR/internal-unstable.rs:39:22
+  --> $DIR/internal-unstable.rs:40:22
    |
 LL |     println!("{:?}", internal_unstable::unstable());
    |                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -23,7 +23,7 @@ LL |     println!("{:?}", internal_unstable::unstable());
    = help: add `#![feature(function)]` to the crate attributes to enable
 
 error[E0658]: use of unstable library feature 'function'
-  --> $DIR/internal-unstable.rs:41:10
+  --> $DIR/internal-unstable.rs:42:10
    |
 LL |     bar!(internal_unstable::unstable());
    |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^