Rollup merge of #77183 - bugadani:issue-77088, r=varkor

Allow multiple allow_internal_unstable attributes

Fixes #77088
This commit is contained in:
Jonas Schievink 2020-09-25 19:42:52 +02:00 committed by GitHub
commit 12b8d8943d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 28 additions and 11 deletions

View File

@ -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() {

View File

@ -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]

View File

@ -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

View File

@ -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());
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^