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