Skip to content

Commit

Permalink
Rollup merge of #90267 - EliseZeroTwo:elisezerotwo/fix_invalid_attrs_…
Browse files Browse the repository at this point in the history
…ice, r=Aaron1011

fix: inner attribute followed by outer attribute causing ICE

Fixes #87936, #88938, and #89971.

This removes the assertion that validates that there are no outer attributes following inner attributes. Where the inner attribute is invalid you get an actual error.
  • Loading branch information
matthiaskrgr committed Oct 27, 2021
2 parents 088dc91 + 7f0d43a commit 17d1742
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 6 deletions.
6 changes: 0 additions & 6 deletions compiler/rustc_ast/src/tokenstream.rs
Original file line number Diff line number Diff line change
Expand Up @@ -221,12 +221,6 @@ impl AttrAnnotatedTokenStream {
for attr in &data.attrs {
match attr.style {
crate::AttrStyle::Outer => {
assert!(
inner_attrs.len() == 0,
"Found outer attribute {:?} after inner attrs {:?}",
attr,
inner_attrs
);
outer_attrs.push(attr);
}
crate::AttrStyle::Inner => {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// force-host
// no-prefer-dynamic

#![crate_type = "proc-macro"]

extern crate proc_macro;

use proc_macro::TokenStream;

#[proc_macro_derive(ICE)]
pub fn derive(_: TokenStream) -> TokenStream {
r#"#[allow(missing_docs)] struct X { }"#.parse().unwrap()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// aux-build:issue-89971-outer-attr-following-inner-attr-ice.rs

#[macro_use]
extern crate issue_89971_outer_attr_following_inner_attr_ice;

fn main() {
Mew();
X {};
}

#![deny(missing_docs)]
//~^ ERROR an inner attribute is not permitted in this context
#[derive(ICE)]
#[deny(missing_docs)]
struct Mew();
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
error: an inner attribute is not permitted in this context
--> $DIR/issue-89971-outer-attr-following-inner-attr-ice.rs:11:1
|
LL | #![deny(missing_docs)]
| ^^^^^^^^^^^^^^^^^^^^^^
...
LL | struct Mew();
| ------------- the inner attribute doesn't annotate this struct
|
= note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files
help: to annotate the struct, change the attribute from inner to outer style
|
LL - #![deny(missing_docs)]
LL + #[deny(missing_docs)]
|

error: aborting due to previous error

0 comments on commit 17d1742

Please sign in to comment.