Rollup merge of #69623 - Centril:fix-69396-tmp, r=petrochenkov
stash API: remove panic to fix ICE. Implements the temporary solution suggested in https://github.com/rust-lang/rust/pull/69537#issuecomment-593143975. Fixes https://github.com/rust-lang/rust/issues/69396. r? @petrochenkov
This commit is contained in:
commit
0255561dea
3 changed files with 74 additions and 14 deletions
|
@ -444,22 +444,12 @@ impl Handler {
|
|||
}
|
||||
|
||||
/// Stash a given diagnostic with the given `Span` and `StashKey` as the key for later stealing.
|
||||
/// If the diagnostic with this `(span, key)` already exists, this will result in an ICE.
|
||||
pub fn stash_diagnostic(&self, span: Span, key: StashKey, diag: Diagnostic) {
|
||||
let mut inner = self.inner.borrow_mut();
|
||||
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);
|
||||
}
|
||||
// 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);
|
||||
}
|
||||
|
||||
/// Steal a previously stashed diagnostic with the given `Span` and `StashKey` as the key.
|
||||
|
|
17
src/test/ui/issues/issue-69396-const-no-type-in-macro.rs
Normal file
17
src/test/ui/issues/issue-69396-const-no-type-in-macro.rs
Normal file
|
@ -0,0 +1,17 @@
|
|||
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() {}
|
53
src/test/ui/issues/issue-69396-const-no-type-in-macro.stderr
Normal file
53
src/test/ui/issues/issue-69396-const-no-type-in-macro.stderr
Normal file
|
@ -0,0 +1,53 @@
|
|||
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`.
|
Loading…
Add table
Add a link
Reference in a new issue