Change:
I'm seeing an internal compiler error on the following input (found by ):
I ran : That's a rollup commit. Of the components of the rollup, looks to me to be most likely to be related. (cc
Hmm, bummer. It looks like they are getting the same span and so the stashed error is overwritten. We might need to insert a there to handle the possibility of span reuse from different things.
triage: P-high. Removing nomination. Added regression stable-to-stable tag.
Fixed in

Discussion:
} /// Stash a given diagnostic with the given `Span` and `StashKey` as the key for later stealing. <del> /// If the diagnostic with this `(span, key)` already exists, this will result in an ICE. </del> pub fn stash_diagnostic(&self, span: Span, key: StashKey, diag: Diagnostic) { let mut inner = self.inner.borrow_mut(); <del> if let Some(mut old_diag) = inner.stashed_diagnostics.insert((span, key), diag) { // We are removing a previously stashed diagnostic which should not happen. old_diag.level = Bug; old_diag.note(&format!( "{}:{}: already existing stashed diagnostic with (span = {:?}, key = {:?})", file!(), line!(), span, key )); inner.emit_diag_at_span(old_diag, span); panic!(ExplicitBug); } </del> <ins> // FIXME(Centril, #69537): Consider reintroducing panic on overwriting a stashed diagnostic // if/when we have a more robust macro-friendly replacement for `(span, key)` as a key. // See the PR for a discussion. inner.stashed_diagnostics.insert((span, key), diag); </ins> } /// Steal a previously stashed diagnostic with the given `Span` and `StashKey` as the key.

<ins> macro_rules! suite { ( $( $fn:ident; )* ) => { $( const A = "A".$fn(); //~^ ERROR the name `A` is defined multiple times //~| ERROR missing type for `const` item //~| ERROR the type placeholder `_` is not allowed within types )* } } suite! { len; is_empty; } fn main() {} </ins>

<ins> error[E0428]: the name `A` is defined multiple times --> $DIR/issue-69396-const-no-type-in-macro.rs:4:13 | LL |               const A = "A".$fn(); |               ^^^^^^^^^^^^^^^^^^^^ |               | |               `A` redefined here |               previous definition of the value `A` here ... LL | / suite! { LL | |     len; LL | |     is_empty; LL | | } | |_- in this macro invocation | = note: `A` must be defined only once in the value namespace of this module = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) error: missing type for `const` item --> $DIR/issue-69396-const-no-type-in-macro.rs:4:19 | LL |               const A = "A".$fn(); |                     ^ help: provide a type for the item: `A: usize` ... LL | / suite! { LL | |     len; LL | |     is_empty; LL | | } | |_- in this macro invocation | = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) error[E0121]: the type placeholder `_` is not allowed within types on item signatures --> $DIR/issue-69396-const-no-type-in-macro.rs:4:19 | LL |               const A = "A".$fn(); |                     ^ |                     | |                     not allowed in type signatures |                     help: replace `_` with the correct type: `bool` ... LL | / suite! { LL | |     len; LL | |     is_empty; LL | | } | |_- in this macro invocation | = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) error: aborting due to 3 previous errors Some errors have detailed explanations: E0121, E0428. For more information about an error, try `rustc --explain E0121`. </ins>