mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 08:13:41 +00:00
fix #102878
This commit is contained in:
parent
eed7f2f58b
commit
68260289b5
@ -336,19 +336,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
|
/// `From` impl that enables existing diagnostic calls to functions which now take
|
||||||
|
@ -14,7 +14,7 @@ use rustc_ast::{NodeId, DUMMY_NODE_ID};
|
|||||||
use rustc_ast_pretty::pprust;
|
use rustc_ast_pretty::pprust;
|
||||||
use rustc_attr::{self as attr, TransparencyError};
|
use rustc_attr::{self as attr, TransparencyError};
|
||||||
use rustc_data_structures::fx::{FxHashMap, FxIndexMap};
|
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_feature::Features;
|
||||||
use rustc_lint_defs::builtin::{
|
use rustc_lint_defs::builtin::{
|
||||||
RUST_2021_INCOMPATIBLE_OR_PATTERNS, SEMICOLON_IN_EXPRESSIONS_FROM_MACROS,
|
RUST_2021_INCOMPATIBLE_OR_PATTERNS, SEMICOLON_IN_EXPRESSIONS_FROM_MACROS,
|
||||||
@ -68,19 +68,22 @@ fn emit_frag_parse_err(
|
|||||||
kind: AstFragmentKind,
|
kind: AstFragmentKind,
|
||||||
) {
|
) {
|
||||||
// FIXME(davidtwco): avoid depending on the error message text
|
// 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 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] = (
|
||||||
|
DiagnosticMessage::Str(format!(
|
||||||
|
"macro expansion ends with an incomplete expression: {}",
|
||||||
|
message.replace(", found `<eof>`", ""),
|
||||||
|
)),
|
||||||
|
msg.1,
|
||||||
|
);
|
||||||
if !e.span.is_dummy() {
|
if !e.span.is_dummy() {
|
||||||
// early end of macro arm (#52866)
|
// early end of macro arm (#52866)
|
||||||
e.replace_span_with(parser.sess.source_map().next_point(parser.token.span));
|
e.replace_span_with(parser.sess.source_map().next_point(parser.token.span));
|
||||||
}
|
}
|
||||||
let msg = &e.message[0];
|
|
||||||
e.message[0] = (
|
|
||||||
rustc_errors::DiagnosticMessage::Str(format!(
|
|
||||||
"macro expansion ends with an incomplete expression: {}",
|
|
||||||
msg.0.expect_str().replace(", found `<eof>`", ""),
|
|
||||||
)),
|
|
||||||
msg.1,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
if e.span.is_dummy() {
|
if e.span.is_dummy() {
|
||||||
// Get around lack of span in error (#30128)
|
// Get around lack of span in error (#30128)
|
||||||
|
10
src/test/ui/macros/issue-102878.rs
Normal file
10
src/test/ui/macros/issue-102878.rs
Normal file
@ -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
src/test/ui/macros/issue-102878.stderr
Normal file
60
src/test/ui/macros/issue-102878.stderr
Normal file
@ -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
|
||||||
|
|
Loading…
Reference in New Issue
Block a user