Skip to content

Commit

Permalink
Rollup merge of #102893 - TaKO8Ki:fix-102878, r=davidtwco
Browse files Browse the repository at this point in the history
Fix ICE #102878

Fixes #102878
  • Loading branch information
matthiaskrgr authored Oct 11, 2022
2 parents cb67283 + 6826028 commit a13c7da
Show file tree
Hide file tree
Showing 4 changed files with 81 additions and 21 deletions.
13 changes: 0 additions & 13 deletions compiler/rustc_error_messages/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -337,19 +337,6 @@ impl DiagnosticMessage {
}
}
}

/// Returns the `String` contained within the `DiagnosticMessage::Str` variant, assuming that
/// this diagnostic message is of the legacy, non-translatable variety. Panics if this
/// assumption does not hold.
///
/// Don't use this - it exists to support some places that do comparison with diagnostic
/// strings.
pub fn expect_str(&self) -> &str {
match self {
DiagnosticMessage::Str(s) => s,
_ => panic!("expected non-translatable diagnostic message"),
}
}
}

/// `From` impl that enables existing diagnostic calls to functions which now take
Expand Down
19 changes: 11 additions & 8 deletions compiler/rustc_expand/src/mbe/macro_rules.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ use rustc_ast::{NodeId, DUMMY_NODE_ID};
use rustc_ast_pretty::pprust;
use rustc_attr::{self as attr, TransparencyError};
use rustc_data_structures::fx::{FxHashMap, FxIndexMap};
use rustc_errors::{Applicability, Diagnostic, DiagnosticBuilder};
use rustc_errors::{Applicability, Diagnostic, DiagnosticBuilder, DiagnosticMessage};
use rustc_feature::Features;
use rustc_lint_defs::builtin::{
RUST_2021_INCOMPATIBLE_OR_PATTERNS, SEMICOLON_IN_EXPRESSIONS_FROM_MACROS,
Expand Down Expand Up @@ -68,19 +68,22 @@ fn emit_frag_parse_err(
kind: AstFragmentKind,
) {
// FIXME(davidtwco): avoid depending on the error message text
if parser.token == token::Eof && e.message[0].0.expect_str().ends_with(", found `<eof>`") {
if !e.span.is_dummy() {
// early end of macro arm (#52866)
e.replace_span_with(parser.sess.source_map().next_point(parser.token.span));
}
if parser.token == token::Eof
&& let DiagnosticMessage::Str(message) = &e.message[0].0
&& message.ends_with(", found `<eof>`")
{
let msg = &e.message[0];
e.message[0] = (
rustc_errors::DiagnosticMessage::Str(format!(
DiagnosticMessage::Str(format!(
"macro expansion ends with an incomplete expression: {}",
msg.0.expect_str().replace(", found `<eof>`", ""),
message.replace(", found `<eof>`", ""),
)),
msg.1,
);
if !e.span.is_dummy() {
// early end of macro arm (#52866)
e.replace_span_with(parser.sess.source_map().next_point(parser.token.span));
}
}
if e.span.is_dummy() {
// Get around lack of span in error (#30128)
Expand Down
10 changes: 10 additions & 0 deletions src/test/ui/macros/issue-102878.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
macro_rules!test{($l:expr,$_:r)=>({const:y y)}
//~^ ERROR mismatched closing delimiter: `)`
//~| ERROR invalid fragment specifier `r`
//~| ERROR expected identifier, found keyword `const`
//~| ERROR expected identifier, found keyword `const`
//~| ERROR expected identifier, found `:`

fn s(){test!(1,i)}

fn main() {}
60 changes: 60 additions & 0 deletions src/test/ui/macros/issue-102878.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
error: mismatched closing delimiter: `)`
--> $DIR/issue-102878.rs:1:35
|
LL | macro_rules!test{($l:expr,$_:r)=>({const:y y)}
| -^ ^ mismatched closing delimiter
| ||
| |unclosed delimiter
| closing delimiter possibly meant for this

error: invalid fragment specifier `r`
--> $DIR/issue-102878.rs:1:27
|
LL | macro_rules!test{($l:expr,$_:r)=>({const:y y)}
| ^^^^
|
= help: valid fragment specifiers are `ident`, `block`, `stmt`, `expr`, `pat`, `ty`, `lifetime`, `literal`, `path`, `meta`, `tt`, `item` and `vis`

error: expected identifier, found keyword `const`
--> $DIR/issue-102878.rs:1:36
|
LL | macro_rules!test{($l:expr,$_:r)=>({const:y y)}
| ^^^^^ expected identifier, found keyword
...
LL | fn s(){test!(1,i)}
| ---------- in this macro invocation
|
= note: this error originates in the macro `test` (in Nightly builds, run with -Z macro-backtrace for more info)
help: escape `const` to use it as an identifier
|
LL | macro_rules!test{($l:expr,$_:r)=>({r#const:y y)}
| ++

error: expected identifier, found keyword `const`
--> $DIR/issue-102878.rs:1:36
|
LL | macro_rules!test{($l:expr,$_:r)=>({const:y y)}
| ^^^^^ expected identifier, found keyword
...
LL | fn s(){test!(1,i)}
| ---------- in this macro invocation
|
= note: this error originates in the macro `test` (in Nightly builds, run with -Z macro-backtrace for more info)
help: escape `const` to use it as an identifier
|
LL | macro_rules!test{($l:expr,$_:r)=>({r#const:y y)}
| ++

error: expected identifier, found `:`
--> $DIR/issue-102878.rs:1:41
|
LL | macro_rules!test{($l:expr,$_:r)=>({const:y y)}
| ^ expected identifier
...
LL | fn s(){test!(1,i)}
| ---------- in this macro invocation
|
= note: this error originates in the macro `test` (in Nightly builds, run with -Z macro-backtrace for more info)

error: aborting due to 5 previous errors

0 comments on commit a13c7da

Please sign in to comment.