Change:
<!-- Thank you for finding an Internal Compiler Error! If possible, try to provide a minimal verifiable example. You can read "Rust Bug Minimization Patterns" for how to create smaller examples. --<!-- If you're using the stable version of the compiler, you should also check if the bug also exists in the beta or nightly versions. --: <!-- Include a backtrace in the code block by setting in your environment. E.g. . --<details<summary<strongBacktrace</strong</summary<p</p</detailscc
Also note that on 1.45.0 there is no ICE, so this is a regression (EDIT: it ICEs starting from 1.46.0) modify labels: +regression-from-stable-to-stable
searched nightlies: from nightly-2020-03-01 to nightly-2020-11-02 regressed nightly: nightly-2020-06-25 searched commits: from to regressed commit: <details<summarybisected with <a href=''cargo-bisect-rustc</av0.6.0</summaryHost triple: x86_64-apple-darwin Reproduce with: </details

Discussion:
} let mut builder = tokenstream::TokenStreamBuilder::new(); for attr in attrs { <del> assert_eq!( attr.style, ast::AttrStyle::Outer, "inner attributes should prevent cached tokens from existing" ); </del> <ins> // FIXME: Correctly handle tokens for inner attributes. // For now, we fall back to reparsing the original AST node if attr.style == ast::AttrStyle::Inner { return None; } </ins> builder.push( attr.tokens .as_ref()

use rustc_ast::ptr::P; use rustc_ast::token::{self, TokenKind}; use rustc_ast::tokenstream::{DelimSpan, TokenStream, TokenTree}; <del> use rustc_ast::{self as ast, AttrStyle, AttrVec, Attribute, DUMMY_NODE_ID}; </del> <ins> use rustc_ast::{self as ast, AttrVec, Attribute, DUMMY_NODE_ID}; </ins> use rustc_ast::{AssocItem, AssocItemKind, ForeignItemKind, Item, ItemKind, Mod}; use rustc_ast::{Async, Const, Defaultness, IsAuto, Mutability, Unsafe, UseTree, UseTreeKind}; use rustc_ast::{BindingMode, Block, FnDecl, FnSig, Param, SelfKind};

let (mut item, tokens) = if needs_tokens { let (item, tokens) = self.collect_tokens(parse_item)?; <del> (item, Some(tokens)) </del> <ins> (item, tokens) </ins> } else { (parse_item(self)?, None) }; <del> self.unclosed_delims.append(&mut unclosed_delims); // Once we've parsed an item and recorded the tokens we got while // parsing we may want to store `tokens` into the item we're about to // return. Note, though, that we specifically didn't capture tokens // related to outer attributes. The `tokens` field here may later be // used with procedural macros to convert this item back into a token // stream, but during expansion we may be removing attributes as we go // along. // // If we've got inner attributes then the `tokens` we've got above holds // these inner attributes. If an inner attribute is expanded we won't // actually remove it from the token stream, so we'll just keep yielding // it (bad!). To work around this case for now we just avoid recording // `tokens` if we detect any inner attributes. This should help keep // expansion correct, but we should fix this bug one day! if let Some(tokens) = tokens { if let Some(item) = &mut item { if !item.attrs.iter().any(|attr| attr.style == AttrStyle::Inner) { item.tokens = tokens; } </del> <ins> if let Some(item) = &mut item { // If we captured tokens during parsing (due to encountering an `NtItem`), // use those instead if item.tokens.is_none() { item.tokens = tokens; </ins> } } <ins> self.unclosed_delims.append(&mut unclosed_delims); </ins> Ok(item) }

<ins> // check-pass // edition:2018 // compile-flags: -Z span-debug // aux-build:test-macros.rs #![no_std] // Don't load unnecessary hygiene information from std extern crate std; #[macro_use] extern crate test_macros; macro_rules! foo {( #[fake_attr] $item:item ) => ( $item )} macro_rules! outer {($item:item) => ( print_bang! { // Identity proc-macro foo! { #[fake_attr] $item } } )} outer! { mod bar { //! Foo } } fn main() {} </ins>

<ins> PRINT-BANG INPUT (DISPLAY): foo ! { #[fake_attr] mod bar { #![doc = r" Foo"] } } PRINT-BANG INPUT (DEBUG): TokenStream [ Ident { ident: "foo", span: $DIR/issue-78675-captured-inner-attrs.rs:20:9: 20:12 (#4), }, Punct { ch: '!', spacing: Alone, span: $DIR/issue-78675-captured-inner-attrs.rs:20:12: 20:13 (#4), }, Group { delimiter: Brace, stream: TokenStream [ Punct { ch: '#', spacing: Alone, span: $DIR/issue-78675-captured-inner-attrs.rs:21:13: 21:14 (#4), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { ident: "fake_attr", span: $DIR/issue-78675-captured-inner-attrs.rs:21:15: 21:24 (#4), }, ], span: $DIR/issue-78675-captured-inner-attrs.rs:21:14: 21:25 (#4), }, Group { delimiter: None, stream: TokenStream [ Ident { ident: "mod", span: $DIR/issue-78675-captured-inner-attrs.rs:22:13: 22:18 (#4), }, Ident { ident: "bar", span: $DIR/issue-78675-captured-inner-attrs.rs:22:13: 22:18 (#4), }, Group { delimiter: Brace, stream: TokenStream [ Punct { ch: '#', spacing: Joint, span: $DIR/issue-78675-captured-inner-attrs.rs:22:13: 22:18 (#4), }, Punct { ch: '!', spacing: Alone, span: $DIR/issue-78675-captured-inner-attrs.rs:22:13: 22:18 (#4), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { ident: "doc", span: $DIR/issue-78675-captured-inner-attrs.rs:22:13: 22:18 (#4), }, Punct { ch: '=', spacing: Alone, span: $DIR/issue-78675-captured-inner-attrs.rs:22:13: 22:18 (#4), }, Literal { kind: StrRaw(0), symbol: " Foo", suffix: None, span: $DIR/issue-78675-captured-inner-attrs.rs:22:13: 22:18 (#4), }, ], span: $DIR/issue-78675-captured-inner-attrs.rs:22:13: 22:18 (#4), }, ], span: $DIR/issue-78675-captured-inner-attrs.rs:22:13: 22:18 (#4), }, ], span: $DIR/issue-78675-captured-inner-attrs.rs:22:13: 22:18 (#4), }, ], span: $DIR/issue-78675-captured-inner-attrs.rs:20:14: 23:10 (#4), }, ] </ins>