mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-26 16:54:01 +00:00
Auto merge of #55402 - estebank:macro-eof-2, r=nikomatsakis
Point at end of macro arm when encountering EOF Fix #52866.
This commit is contained in:
commit
10e2c729ea
@ -139,6 +139,17 @@ impl Diagnostic {
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn replace_span_with(&mut self, after: Span) -> &mut Self {
|
||||||
|
let before = self.span.clone();
|
||||||
|
self.set_span(after);
|
||||||
|
for span_label in before.span_labels() {
|
||||||
|
if let Some(label) = span_label.label {
|
||||||
|
self.span_label(after, label);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
pub fn note_expected_found(&mut self,
|
pub fn note_expected_found(&mut self,
|
||||||
label: &dyn fmt::Display,
|
label: &dyn fmt::Display,
|
||||||
expected: DiagnosticStyledString,
|
expected: DiagnosticStyledString,
|
||||||
|
@ -281,7 +281,7 @@ pub enum ParseResult<T> {
|
|||||||
Success(T),
|
Success(T),
|
||||||
/// Arm failed to match. If the second parameter is `token::Eof`, it indicates an unexpected
|
/// Arm failed to match. If the second parameter is `token::Eof`, it indicates an unexpected
|
||||||
/// end of macro invocation. Otherwise, it indicates that no rules expected the given token.
|
/// end of macro invocation. Otherwise, it indicates that no rules expected the given token.
|
||||||
Failure(syntax_pos::Span, Token),
|
Failure(syntax_pos::Span, Token, String),
|
||||||
/// Fatal error (malformed macro?). Abort compilation.
|
/// Fatal error (malformed macro?). Abort compilation.
|
||||||
Error(syntax_pos::Span, String),
|
Error(syntax_pos::Span, String),
|
||||||
}
|
}
|
||||||
@ -698,7 +698,7 @@ pub fn parse(
|
|||||||
parser.span,
|
parser.span,
|
||||||
) {
|
) {
|
||||||
Success(_) => {}
|
Success(_) => {}
|
||||||
Failure(sp, tok) => return Failure(sp, tok),
|
Failure(sp, tok, t) => return Failure(sp, tok, t),
|
||||||
Error(sp, msg) => return Error(sp, msg),
|
Error(sp, msg) => return Error(sp, msg),
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -710,7 +710,7 @@ pub fn parse(
|
|||||||
// Error messages here could be improved with links to original rules.
|
// Error messages here could be improved with links to original rules.
|
||||||
|
|
||||||
// If we reached the EOF, check that there is EXACTLY ONE possible matcher. Otherwise,
|
// If we reached the EOF, check that there is EXACTLY ONE possible matcher. Otherwise,
|
||||||
// either the parse is ambiguous (which should never happen) or their is a syntax error.
|
// either the parse is ambiguous (which should never happen) or there is a syntax error.
|
||||||
if token_name_eq(&parser.token, &token::Eof) {
|
if token_name_eq(&parser.token, &token::Eof) {
|
||||||
if eof_items.len() == 1 {
|
if eof_items.len() == 1 {
|
||||||
let matches = eof_items[0]
|
let matches = eof_items[0]
|
||||||
@ -724,7 +724,15 @@ pub fn parse(
|
|||||||
"ambiguity: multiple successful parses".to_string(),
|
"ambiguity: multiple successful parses".to_string(),
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
return Failure(parser.span, token::Eof);
|
return Failure(
|
||||||
|
if parser.span.is_dummy() {
|
||||||
|
parser.span
|
||||||
|
} else {
|
||||||
|
sess.source_map().next_point(parser.span)
|
||||||
|
},
|
||||||
|
token::Eof,
|
||||||
|
"missing tokens in macro arguments".to_string(),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Performance hack: eof_items may share matchers via Rc with other things that we want
|
// Performance hack: eof_items may share matchers via Rc with other things that we want
|
||||||
@ -757,9 +765,13 @@ pub fn parse(
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
// If there are no possible next positions AND we aren't waiting for the black-box parser,
|
// If there are no possible next positions AND we aren't waiting for the black-box parser,
|
||||||
// then their is a syntax error.
|
// then there is a syntax error.
|
||||||
else if bb_items.is_empty() && next_items.is_empty() {
|
else if bb_items.is_empty() && next_items.is_empty() {
|
||||||
return Failure(parser.span, parser.token);
|
return Failure(
|
||||||
|
parser.span,
|
||||||
|
parser.token,
|
||||||
|
"no rules expected this token in macro call".to_string(),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
// Dump all possible `next_items` into `cur_items` for the next iteration.
|
// Dump all possible `next_items` into `cur_items` for the next iteration.
|
||||||
else if !next_items.is_empty() {
|
else if !next_items.is_empty() {
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
use {ast, attr};
|
use {ast, attr};
|
||||||
use syntax_pos::{Span, DUMMY_SP};
|
use syntax_pos::{Span, DUMMY_SP};
|
||||||
use edition::Edition;
|
use edition::Edition;
|
||||||
|
use errors::FatalError;
|
||||||
use ext::base::{DummyResult, ExtCtxt, MacResult, SyntaxExtension};
|
use ext::base::{DummyResult, ExtCtxt, MacResult, SyntaxExtension};
|
||||||
use ext::base::{NormalTT, TTMacroExpander};
|
use ext::base::{NormalTT, TTMacroExpander};
|
||||||
use ext::expand::{AstFragment, AstFragmentKind};
|
use ext::expand::{AstFragment, AstFragmentKind};
|
||||||
@ -44,15 +45,34 @@ pub struct ParserAnyMacro<'a> {
|
|||||||
/// Span of the expansion site of the macro this parser is for
|
/// Span of the expansion site of the macro this parser is for
|
||||||
site_span: Span,
|
site_span: Span,
|
||||||
/// The ident of the macro we're parsing
|
/// The ident of the macro we're parsing
|
||||||
macro_ident: ast::Ident
|
macro_ident: ast::Ident,
|
||||||
|
arm_span: Span,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> ParserAnyMacro<'a> {
|
impl<'a> ParserAnyMacro<'a> {
|
||||||
pub fn make(mut self: Box<ParserAnyMacro<'a>>, kind: AstFragmentKind) -> AstFragment {
|
pub fn make(mut self: Box<ParserAnyMacro<'a>>, kind: AstFragmentKind) -> AstFragment {
|
||||||
let ParserAnyMacro { site_span, macro_ident, ref mut parser } = *self;
|
let ParserAnyMacro { site_span, macro_ident, ref mut parser, arm_span } = *self;
|
||||||
let fragment = panictry!(parser.parse_ast_fragment(kind, true).map_err(|mut e| {
|
let fragment = panictry!(parser.parse_ast_fragment(kind, true).map_err(|mut e| {
|
||||||
|
if parser.token == token::Eof && e.message().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.span));
|
||||||
|
}
|
||||||
|
let msg = &e.message[0];
|
||||||
|
e.message[0] = (
|
||||||
|
format!(
|
||||||
|
"macro expansion ends with an incomplete expression: {}",
|
||||||
|
msg.0.replace(", found `<eof>`", ""),
|
||||||
|
),
|
||||||
|
msg.1,
|
||||||
|
);
|
||||||
|
}
|
||||||
if e.span.is_dummy() { // Get around lack of span in error (#30128)
|
if e.span.is_dummy() { // Get around lack of span in error (#30128)
|
||||||
e.set_span(site_span);
|
e.replace_span_with(site_span);
|
||||||
|
if parser.sess.source_map().span_to_filename(arm_span).is_real() {
|
||||||
|
e.span_label(arm_span, "in this macro arm");
|
||||||
|
}
|
||||||
|
} else if !parser.sess.source_map().span_to_filename(parser.span).is_real() {
|
||||||
|
e.span_label(site_span, "in this macro invocation");
|
||||||
}
|
}
|
||||||
e
|
e
|
||||||
}));
|
}));
|
||||||
@ -120,6 +140,7 @@ fn generic_extension<'cx>(cx: &'cx mut ExtCtxt,
|
|||||||
// Which arm's failure should we report? (the one furthest along)
|
// Which arm's failure should we report? (the one furthest along)
|
||||||
let mut best_fail_spot = DUMMY_SP;
|
let mut best_fail_spot = DUMMY_SP;
|
||||||
let mut best_fail_tok = None;
|
let mut best_fail_tok = None;
|
||||||
|
let mut best_fail_text = None;
|
||||||
|
|
||||||
for (i, lhs) in lhses.iter().enumerate() { // try each arm's matchers
|
for (i, lhs) in lhses.iter().enumerate() { // try each arm's matchers
|
||||||
let lhs_tt = match *lhs {
|
let lhs_tt = match *lhs {
|
||||||
@ -134,6 +155,7 @@ fn generic_extension<'cx>(cx: &'cx mut ExtCtxt,
|
|||||||
quoted::TokenTree::Delimited(_, ref delimed) => delimed.tts.clone(),
|
quoted::TokenTree::Delimited(_, ref delimed) => delimed.tts.clone(),
|
||||||
_ => cx.span_bug(sp, "malformed macro rhs"),
|
_ => cx.span_bug(sp, "malformed macro rhs"),
|
||||||
};
|
};
|
||||||
|
let arm_span = rhses[i].span();
|
||||||
|
|
||||||
let rhs_spans = rhs.iter().map(|t| t.span()).collect::<Vec<_>>();
|
let rhs_spans = rhs.iter().map(|t| t.span()).collect::<Vec<_>>();
|
||||||
// rhs has holes ( `$id` and `$(...)` that need filled)
|
// rhs has holes ( `$id` and `$(...)` that need filled)
|
||||||
@ -172,12 +194,14 @@ fn generic_extension<'cx>(cx: &'cx mut ExtCtxt,
|
|||||||
// so we can print a useful error message if the parse of the expanded
|
// so we can print a useful error message if the parse of the expanded
|
||||||
// macro leaves unparsed tokens.
|
// macro leaves unparsed tokens.
|
||||||
site_span: sp,
|
site_span: sp,
|
||||||
macro_ident: name
|
macro_ident: name,
|
||||||
|
arm_span,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
Failure(sp, tok) => if sp.lo() >= best_fail_spot.lo() {
|
Failure(sp, tok, t) => if sp.lo() >= best_fail_spot.lo() {
|
||||||
best_fail_spot = sp;
|
best_fail_spot = sp;
|
||||||
best_fail_tok = Some(tok);
|
best_fail_tok = Some(tok);
|
||||||
|
best_fail_text = Some(t);
|
||||||
},
|
},
|
||||||
Error(err_sp, ref msg) => {
|
Error(err_sp, ref msg) => {
|
||||||
cx.span_fatal(err_sp.substitute_dummy(sp), &msg[..])
|
cx.span_fatal(err_sp.substitute_dummy(sp), &msg[..])
|
||||||
@ -188,7 +212,7 @@ fn generic_extension<'cx>(cx: &'cx mut ExtCtxt,
|
|||||||
let best_fail_msg = parse_failure_msg(best_fail_tok.expect("ran no matchers"));
|
let best_fail_msg = parse_failure_msg(best_fail_tok.expect("ran no matchers"));
|
||||||
let span = best_fail_spot.substitute_dummy(sp);
|
let span = best_fail_spot.substitute_dummy(sp);
|
||||||
let mut err = cx.struct_span_err(span, &best_fail_msg);
|
let mut err = cx.struct_span_err(span, &best_fail_msg);
|
||||||
err.span_label(span, best_fail_msg);
|
err.span_label(span, best_fail_text.unwrap_or(best_fail_msg));
|
||||||
if let Some(sp) = def_span {
|
if let Some(sp) = def_span {
|
||||||
if cx.source_map().span_to_filename(sp).is_real() && !sp.is_dummy() {
|
if cx.source_map().span_to_filename(sp).is_real() && !sp.is_dummy() {
|
||||||
err.span_label(cx.source_map().def_span(sp), "when calling this macro");
|
err.span_label(cx.source_map().def_span(sp), "when calling this macro");
|
||||||
@ -268,9 +292,13 @@ pub fn compile(sess: &ParseSess, features: &Features, def: &ast::Item, edition:
|
|||||||
|
|
||||||
let argument_map = match parse(sess, body.stream(), &argument_gram, None, true) {
|
let argument_map = match parse(sess, body.stream(), &argument_gram, None, true) {
|
||||||
Success(m) => m,
|
Success(m) => m,
|
||||||
Failure(sp, tok) => {
|
Failure(sp, tok, t) => {
|
||||||
let s = parse_failure_msg(tok);
|
let s = parse_failure_msg(tok);
|
||||||
sess.span_diagnostic.span_fatal(sp.substitute_dummy(def.span), &s).raise();
|
let sp = sp.substitute_dummy(def.span);
|
||||||
|
let mut err = sess.span_diagnostic.struct_span_fatal(sp, &s);
|
||||||
|
err.span_label(sp, t);
|
||||||
|
err.emit();
|
||||||
|
FatalError.raise();
|
||||||
}
|
}
|
||||||
Error(sp, s) => {
|
Error(sp, s) => {
|
||||||
sess.span_diagnostic.span_fatal(sp.substitute_dummy(def.span), &s).raise();
|
sess.span_diagnostic.span_fatal(sp.substitute_dummy(def.span), &s).raise();
|
||||||
|
@ -46,8 +46,8 @@ fn expand_mbe_matches(cx: &mut ExtCtxt, _: Span, args: &[TokenTree])
|
|||||||
NodeId::from_u32(0));
|
NodeId::from_u32(0));
|
||||||
let map = match TokenTree::parse(cx, &mbe_matcher, args.iter().cloned().collect()) {
|
let map = match TokenTree::parse(cx, &mbe_matcher, args.iter().cloned().collect()) {
|
||||||
Success(map) => map,
|
Success(map) => map,
|
||||||
Failure(_, tok) => {
|
Failure(_, tok, msg) => {
|
||||||
panic!("expected Success, but got Failure: {}", parse_failure_msg(tok));
|
panic!("expected Success, but got Failure: {} - {}", parse_failure_msg(tok), msg);
|
||||||
}
|
}
|
||||||
Error(_, s) => {
|
Error(_, s) => {
|
||||||
panic!("expected Success, but got Error: {}", s);
|
panic!("expected Success, but got Error: {}", s);
|
||||||
|
@ -19,5 +19,6 @@ mod macro_expanded_mod_helper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
mod_decl!(foo); //~ ERROR Cannot declare a non-inline module inside a block
|
mod_decl!(foo);
|
||||||
|
//~^ ERROR Cannot declare a non-inline module inside a block
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
error: Cannot declare a non-inline module inside a block unless it has a path attribute
|
error: Cannot declare a non-inline module inside a block unless it has a path attribute
|
||||||
--> $DIR/macro-expanded-mod.rs:22:15
|
--> $DIR/macro-expanded-mod.rs:22:15
|
||||||
|
|
|
|
||||||
LL | mod_decl!(foo); //~ ERROR Cannot declare a non-inline module inside a block
|
LL | mod_decl!(foo);
|
||||||
| ^^^
|
| ^^^
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
@ -2,13 +2,13 @@ error: no rules expected the token `r#async`
|
|||||||
--> $DIR/edition-keywords-2015-2015-parsing.rs:22:31
|
--> $DIR/edition-keywords-2015-2015-parsing.rs:22:31
|
||||||
|
|
|
|
||||||
LL | r#async = consumes_async!(r#async); //~ ERROR no rules expected the token `r#async`
|
LL | r#async = consumes_async!(r#async); //~ ERROR no rules expected the token `r#async`
|
||||||
| ^^^^^^^ no rules expected the token `r#async`
|
| ^^^^^^^ no rules expected this token in macro call
|
||||||
|
|
||||||
error: no rules expected the token `async`
|
error: no rules expected the token `async`
|
||||||
--> $DIR/edition-keywords-2015-2015-parsing.rs:23:35
|
--> $DIR/edition-keywords-2015-2015-parsing.rs:23:35
|
||||||
|
|
|
|
||||||
LL | r#async = consumes_async_raw!(async); //~ ERROR no rules expected the token `async`
|
LL | r#async = consumes_async_raw!(async); //~ ERROR no rules expected the token `async`
|
||||||
| ^^^^^ no rules expected the token `async`
|
| ^^^^^ no rules expected this token in macro call
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
@ -2,13 +2,13 @@ error: no rules expected the token `r#async`
|
|||||||
--> $DIR/edition-keywords-2015-2018-parsing.rs:22:31
|
--> $DIR/edition-keywords-2015-2018-parsing.rs:22:31
|
||||||
|
|
|
|
||||||
LL | r#async = consumes_async!(r#async); //~ ERROR no rules expected the token `r#async`
|
LL | r#async = consumes_async!(r#async); //~ ERROR no rules expected the token `r#async`
|
||||||
| ^^^^^^^ no rules expected the token `r#async`
|
| ^^^^^^^ no rules expected this token in macro call
|
||||||
|
|
||||||
error: no rules expected the token `async`
|
error: no rules expected the token `async`
|
||||||
--> $DIR/edition-keywords-2015-2018-parsing.rs:23:35
|
--> $DIR/edition-keywords-2015-2018-parsing.rs:23:35
|
||||||
|
|
|
|
||||||
LL | r#async = consumes_async_raw!(async); //~ ERROR no rules expected the token `async`
|
LL | r#async = consumes_async_raw!(async); //~ ERROR no rules expected the token `async`
|
||||||
| ^^^^^ no rules expected the token `async`
|
| ^^^^^ no rules expected this token in macro call
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
@ -14,19 +14,24 @@ error: no rules expected the token `r#async`
|
|||||||
--> $DIR/edition-keywords-2018-2015-parsing.rs:22:31
|
--> $DIR/edition-keywords-2018-2015-parsing.rs:22:31
|
||||||
|
|
|
|
||||||
LL | r#async = consumes_async!(r#async); //~ ERROR no rules expected the token `r#async`
|
LL | r#async = consumes_async!(r#async); //~ ERROR no rules expected the token `r#async`
|
||||||
| ^^^^^^^ no rules expected the token `r#async`
|
| ^^^^^^^ no rules expected this token in macro call
|
||||||
|
|
||||||
error: no rules expected the token `async`
|
error: no rules expected the token `async`
|
||||||
--> $DIR/edition-keywords-2018-2015-parsing.rs:23:35
|
--> $DIR/edition-keywords-2018-2015-parsing.rs:23:35
|
||||||
|
|
|
|
||||||
LL | r#async = consumes_async_raw!(async); //~ ERROR no rules expected the token `async`
|
LL | r#async = consumes_async_raw!(async); //~ ERROR no rules expected the token `async`
|
||||||
| ^^^^^ no rules expected the token `async`
|
| ^^^^^ no rules expected this token in macro call
|
||||||
|
|
||||||
error: expected one of `move`, `|`, or `||`, found `<eof>`
|
error: macro expansion ends with an incomplete expression: expected one of `move`, `|`, or `||`
|
||||||
--> <::edition_kw_macro_2015::passes_ident macros>:1:22
|
--> <::edition_kw_macro_2015::passes_ident macros>:1:25
|
||||||
|
|
|
|
||||||
LL | ( $ i : ident ) => ( $ i )
|
LL | ( $ i : ident ) => ( $ i )
|
||||||
| ^^^ expected one of `move`, `|`, or `||` here
|
| ^ expected one of `move`, `|`, or `||` here
|
||||||
|
|
|
||||||
|
::: $DIR/edition-keywords-2018-2015-parsing.rs:26:8
|
||||||
|
|
|
||||||
|
LL | if passes_ident!(async) == 1 {}
|
||||||
|
| -------------------- in this macro invocation
|
||||||
|
|
||||||
error: aborting due to 5 previous errors
|
error: aborting due to 5 previous errors
|
||||||
|
|
||||||
|
@ -14,19 +14,24 @@ error: no rules expected the token `r#async`
|
|||||||
--> $DIR/edition-keywords-2018-2018-parsing.rs:22:31
|
--> $DIR/edition-keywords-2018-2018-parsing.rs:22:31
|
||||||
|
|
|
|
||||||
LL | r#async = consumes_async!(r#async); //~ ERROR no rules expected the token `r#async`
|
LL | r#async = consumes_async!(r#async); //~ ERROR no rules expected the token `r#async`
|
||||||
| ^^^^^^^ no rules expected the token `r#async`
|
| ^^^^^^^ no rules expected this token in macro call
|
||||||
|
|
||||||
error: no rules expected the token `async`
|
error: no rules expected the token `async`
|
||||||
--> $DIR/edition-keywords-2018-2018-parsing.rs:23:35
|
--> $DIR/edition-keywords-2018-2018-parsing.rs:23:35
|
||||||
|
|
|
|
||||||
LL | r#async = consumes_async_raw!(async); //~ ERROR no rules expected the token `async`
|
LL | r#async = consumes_async_raw!(async); //~ ERROR no rules expected the token `async`
|
||||||
| ^^^^^ no rules expected the token `async`
|
| ^^^^^ no rules expected this token in macro call
|
||||||
|
|
||||||
error: expected one of `move`, `|`, or `||`, found `<eof>`
|
error: macro expansion ends with an incomplete expression: expected one of `move`, `|`, or `||`
|
||||||
--> <::edition_kw_macro_2018::passes_ident macros>:1:22
|
--> <::edition_kw_macro_2018::passes_ident macros>:1:25
|
||||||
|
|
|
|
||||||
LL | ( $ i : ident ) => ( $ i )
|
LL | ( $ i : ident ) => ( $ i )
|
||||||
| ^^^ expected one of `move`, `|`, or `||` here
|
| ^ expected one of `move`, `|`, or `||` here
|
||||||
|
|
|
||||||
|
::: $DIR/edition-keywords-2018-2018-parsing.rs:26:8
|
||||||
|
|
|
||||||
|
LL | if passes_ident!(async) == 1 {}
|
||||||
|
| -------------------- in this macro invocation
|
||||||
|
|
||||||
error: aborting due to 5 previous errors
|
error: aborting due to 5 previous errors
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@ LL | macro_rules! one_arg_macro {
|
|||||||
| -------------------------- when calling this macro
|
| -------------------------- when calling this macro
|
||||||
...
|
...
|
||||||
LL | one_arg_macro!(/**/); //~ ERROR unexpected end
|
LL | one_arg_macro!(/**/); //~ ERROR unexpected end
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^ unexpected end of macro invocation
|
| ^^^^^^^^^^^^^^^^^^^^^ missing tokens in macro arguments
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ error: no rules expected the token `@`
|
|||||||
--> $DIR/fail-simple.rs:12:12
|
--> $DIR/fail-simple.rs:12:12
|
||||||
|
|
|
|
||||||
LL | panic!(@); //~ ERROR no rules expected the token `@`
|
LL | panic!(@); //~ ERROR no rules expected the token `@`
|
||||||
| ^ no rules expected the token `@`
|
| ^ no rules expected this token in macro call
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@ LL | macro_rules! one_arg_macro {
|
|||||||
| -------------------------- when calling this macro
|
| -------------------------- when calling this macro
|
||||||
...
|
...
|
||||||
LL | one_arg_macro!();
|
LL | one_arg_macro!();
|
||||||
| ^^^^^^^^^^^^^^^^^ unexpected end of macro invocation
|
| ^^^^^^^^^^^^^^^^^ missing tokens in macro arguments
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ error: unexpected end of macro invocation
|
|||||||
--> $DIR/issue-7970b.rs:13:1
|
--> $DIR/issue-7970b.rs:13:1
|
||||||
|
|
|
|
||||||
LL | macro_rules! test {}
|
LL | macro_rules! test {}
|
||||||
| ^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^ missing tokens in macro arguments
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
@ -55,7 +55,7 @@ LL | macro_rules! foo {
|
|||||||
| ---------------- when calling this macro
|
| ---------------- when calling this macro
|
||||||
...
|
...
|
||||||
LL | foo!(a?); //~ ERROR no rules expected the token `?`
|
LL | foo!(a?); //~ ERROR no rules expected the token `?`
|
||||||
| ^ no rules expected the token `?`
|
| ^ no rules expected this token in macro call
|
||||||
|
|
||||||
error: no rules expected the token `?`
|
error: no rules expected the token `?`
|
||||||
--> $DIR/macro-at-most-once-rep-2018-feature-gate.rs:42:11
|
--> $DIR/macro-at-most-once-rep-2018-feature-gate.rs:42:11
|
||||||
@ -64,7 +64,7 @@ LL | macro_rules! foo {
|
|||||||
| ---------------- when calling this macro
|
| ---------------- when calling this macro
|
||||||
...
|
...
|
||||||
LL | foo!(a?a); //~ ERROR no rules expected the token `?`
|
LL | foo!(a?a); //~ ERROR no rules expected the token `?`
|
||||||
| ^ no rules expected the token `?`
|
| ^ no rules expected this token in macro call
|
||||||
|
|
||||||
error: no rules expected the token `?`
|
error: no rules expected the token `?`
|
||||||
--> $DIR/macro-at-most-once-rep-2018-feature-gate.rs:43:11
|
--> $DIR/macro-at-most-once-rep-2018-feature-gate.rs:43:11
|
||||||
@ -73,7 +73,7 @@ LL | macro_rules! foo {
|
|||||||
| ---------------- when calling this macro
|
| ---------------- when calling this macro
|
||||||
...
|
...
|
||||||
LL | foo!(a?a?a); //~ ERROR no rules expected the token `?`
|
LL | foo!(a?a?a); //~ ERROR no rules expected the token `?`
|
||||||
| ^ no rules expected the token `?`
|
| ^ no rules expected this token in macro call
|
||||||
|
|
||||||
error: aborting due to 10 previous errors
|
error: aborting due to 10 previous errors
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@ LL | macro_rules! foo {
|
|||||||
| ---------------- when calling this macro
|
| ---------------- when calling this macro
|
||||||
...
|
...
|
||||||
LL | foo!(a?); //~ ERROR no rules expected the token `?`
|
LL | foo!(a?); //~ ERROR no rules expected the token `?`
|
||||||
| ^ no rules expected the token `?`
|
| ^ no rules expected this token in macro call
|
||||||
|
|
||||||
error: no rules expected the token `?`
|
error: no rules expected the token `?`
|
||||||
--> $DIR/macro-at-most-once-rep-2018.rs:37:11
|
--> $DIR/macro-at-most-once-rep-2018.rs:37:11
|
||||||
@ -20,7 +20,7 @@ LL | macro_rules! foo {
|
|||||||
| ---------------- when calling this macro
|
| ---------------- when calling this macro
|
||||||
...
|
...
|
||||||
LL | foo!(a?a); //~ ERROR no rules expected the token `?`
|
LL | foo!(a?a); //~ ERROR no rules expected the token `?`
|
||||||
| ^ no rules expected the token `?`
|
| ^ no rules expected this token in macro call
|
||||||
|
|
||||||
error: no rules expected the token `?`
|
error: no rules expected the token `?`
|
||||||
--> $DIR/macro-at-most-once-rep-2018.rs:38:11
|
--> $DIR/macro-at-most-once-rep-2018.rs:38:11
|
||||||
@ -29,7 +29,7 @@ LL | macro_rules! foo {
|
|||||||
| ---------------- when calling this macro
|
| ---------------- when calling this macro
|
||||||
...
|
...
|
||||||
LL | foo!(a?a?a); //~ ERROR no rules expected the token `?`
|
LL | foo!(a?a?a); //~ ERROR no rules expected the token `?`
|
||||||
| ^ no rules expected the token `?`
|
| ^ no rules expected this token in macro call
|
||||||
|
|
||||||
error: unexpected end of macro invocation
|
error: unexpected end of macro invocation
|
||||||
--> $DIR/macro-at-most-once-rep-2018.rs:40:5
|
--> $DIR/macro-at-most-once-rep-2018.rs:40:5
|
||||||
@ -38,16 +38,16 @@ LL | macro_rules! barplus {
|
|||||||
| -------------------- when calling this macro
|
| -------------------- when calling this macro
|
||||||
...
|
...
|
||||||
LL | barplus!(); //~ERROR unexpected end of macro invocation
|
LL | barplus!(); //~ERROR unexpected end of macro invocation
|
||||||
| ^^^^^^^^^^^ unexpected end of macro invocation
|
| ^^^^^^^^^^^ missing tokens in macro arguments
|
||||||
|
|
||||||
error: unexpected end of macro invocation
|
error: unexpected end of macro invocation
|
||||||
--> $DIR/macro-at-most-once-rep-2018.rs:41:14
|
--> $DIR/macro-at-most-once-rep-2018.rs:41:15
|
||||||
|
|
|
|
||||||
LL | macro_rules! barplus {
|
LL | macro_rules! barplus {
|
||||||
| -------------------- when calling this macro
|
| -------------------- when calling this macro
|
||||||
...
|
...
|
||||||
LL | barplus!(a); //~ERROR unexpected end of macro invocation
|
LL | barplus!(a); //~ERROR unexpected end of macro invocation
|
||||||
| ^ unexpected end of macro invocation
|
| ^ missing tokens in macro arguments
|
||||||
|
|
||||||
error: no rules expected the token `?`
|
error: no rules expected the token `?`
|
||||||
--> $DIR/macro-at-most-once-rep-2018.rs:42:15
|
--> $DIR/macro-at-most-once-rep-2018.rs:42:15
|
||||||
@ -56,7 +56,7 @@ LL | macro_rules! barplus {
|
|||||||
| -------------------- when calling this macro
|
| -------------------- when calling this macro
|
||||||
...
|
...
|
||||||
LL | barplus!(a?); //~ ERROR no rules expected the token `?`
|
LL | barplus!(a?); //~ ERROR no rules expected the token `?`
|
||||||
| ^ no rules expected the token `?`
|
| ^ no rules expected this token in macro call
|
||||||
|
|
||||||
error: no rules expected the token `?`
|
error: no rules expected the token `?`
|
||||||
--> $DIR/macro-at-most-once-rep-2018.rs:43:15
|
--> $DIR/macro-at-most-once-rep-2018.rs:43:15
|
||||||
@ -65,7 +65,7 @@ LL | macro_rules! barplus {
|
|||||||
| -------------------- when calling this macro
|
| -------------------- when calling this macro
|
||||||
...
|
...
|
||||||
LL | barplus!(a?a); //~ ERROR no rules expected the token `?`
|
LL | barplus!(a?a); //~ ERROR no rules expected the token `?`
|
||||||
| ^ no rules expected the token `?`
|
| ^ no rules expected this token in macro call
|
||||||
|
|
||||||
error: unexpected end of macro invocation
|
error: unexpected end of macro invocation
|
||||||
--> $DIR/macro-at-most-once-rep-2018.rs:47:5
|
--> $DIR/macro-at-most-once-rep-2018.rs:47:5
|
||||||
@ -74,16 +74,16 @@ LL | macro_rules! barstar {
|
|||||||
| -------------------- when calling this macro
|
| -------------------- when calling this macro
|
||||||
...
|
...
|
||||||
LL | barstar!(); //~ERROR unexpected end of macro invocation
|
LL | barstar!(); //~ERROR unexpected end of macro invocation
|
||||||
| ^^^^^^^^^^^ unexpected end of macro invocation
|
| ^^^^^^^^^^^ missing tokens in macro arguments
|
||||||
|
|
||||||
error: unexpected end of macro invocation
|
error: unexpected end of macro invocation
|
||||||
--> $DIR/macro-at-most-once-rep-2018.rs:48:14
|
--> $DIR/macro-at-most-once-rep-2018.rs:48:15
|
||||||
|
|
|
|
||||||
LL | macro_rules! barstar {
|
LL | macro_rules! barstar {
|
||||||
| -------------------- when calling this macro
|
| -------------------- when calling this macro
|
||||||
...
|
...
|
||||||
LL | barstar!(a); //~ERROR unexpected end of macro invocation
|
LL | barstar!(a); //~ERROR unexpected end of macro invocation
|
||||||
| ^ unexpected end of macro invocation
|
| ^ missing tokens in macro arguments
|
||||||
|
|
||||||
error: no rules expected the token `?`
|
error: no rules expected the token `?`
|
||||||
--> $DIR/macro-at-most-once-rep-2018.rs:49:15
|
--> $DIR/macro-at-most-once-rep-2018.rs:49:15
|
||||||
@ -92,7 +92,7 @@ LL | macro_rules! barstar {
|
|||||||
| -------------------- when calling this macro
|
| -------------------- when calling this macro
|
||||||
...
|
...
|
||||||
LL | barstar!(a?); //~ ERROR no rules expected the token `?`
|
LL | barstar!(a?); //~ ERROR no rules expected the token `?`
|
||||||
| ^ no rules expected the token `?`
|
| ^ no rules expected this token in macro call
|
||||||
|
|
||||||
error: no rules expected the token `?`
|
error: no rules expected the token `?`
|
||||||
--> $DIR/macro-at-most-once-rep-2018.rs:50:15
|
--> $DIR/macro-at-most-once-rep-2018.rs:50:15
|
||||||
@ -101,7 +101,7 @@ LL | macro_rules! barstar {
|
|||||||
| -------------------- when calling this macro
|
| -------------------- when calling this macro
|
||||||
...
|
...
|
||||||
LL | barstar!(a?a); //~ ERROR no rules expected the token `?`
|
LL | barstar!(a?a); //~ ERROR no rules expected the token `?`
|
||||||
| ^ no rules expected the token `?`
|
| ^ no rules expected this token in macro call
|
||||||
|
|
||||||
error: aborting due to 12 previous errors
|
error: aborting due to 12 previous errors
|
||||||
|
|
||||||
|
@ -1,8 +1,11 @@
|
|||||||
error: expected expression, found `<eof>`
|
error: macro expansion ends with an incomplete expression: expected expression
|
||||||
--> $DIR/macro-in-expression-context-2.rs:5:16
|
--> $DIR/macro-in-expression-context-2.rs:5:16
|
||||||
|
|
|
|
||||||
|
LL | macro_rules! empty { () => () }
|
||||||
|
| -- in this macro arm
|
||||||
|
...
|
||||||
LL | _ => { empty!() }
|
LL | _ => { empty!() }
|
||||||
| ^^^^^^^^
|
| ^^^^^^^^ expected expression
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@ LL | macro_rules! m { ($x:lifetime) => { } }
|
|||||||
| -------------- when calling this macro
|
| -------------- when calling this macro
|
||||||
...
|
...
|
||||||
LL | m!(a);
|
LL | m!(a);
|
||||||
| ^ no rules expected the token `a`
|
| ^ no rules expected this token in macro call
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@ LL | macro_rules! foo {
|
|||||||
| ---------------- when calling this macro
|
| ---------------- when calling this macro
|
||||||
...
|
...
|
||||||
LL | foo!(a b);
|
LL | foo!(a b);
|
||||||
| -^ no rules expected the token `b`
|
| -^ no rules expected this token in macro call
|
||||||
| |
|
| |
|
||||||
| help: missing comma here
|
| help: missing comma here
|
||||||
|
|
||||||
@ -22,7 +22,7 @@ LL | macro_rules! foo {
|
|||||||
| ---------------- when calling this macro
|
| ---------------- when calling this macro
|
||||||
...
|
...
|
||||||
LL | foo!(a, b, c, d e);
|
LL | foo!(a, b, c, d e);
|
||||||
| -^ no rules expected the token `e`
|
| -^ no rules expected this token in macro call
|
||||||
| |
|
| |
|
||||||
| help: missing comma here
|
| help: missing comma here
|
||||||
|
|
||||||
@ -33,7 +33,7 @@ LL | macro_rules! foo {
|
|||||||
| ---------------- when calling this macro
|
| ---------------- when calling this macro
|
||||||
...
|
...
|
||||||
LL | foo!(a, b, c d, e);
|
LL | foo!(a, b, c d, e);
|
||||||
| -^ no rules expected the token `d`
|
| -^ no rules expected this token in macro call
|
||||||
| |
|
| |
|
||||||
| help: missing comma here
|
| help: missing comma here
|
||||||
|
|
||||||
@ -44,7 +44,7 @@ LL | macro_rules! foo {
|
|||||||
| ---------------- when calling this macro
|
| ---------------- when calling this macro
|
||||||
...
|
...
|
||||||
LL | foo!(a, b, c d e);
|
LL | foo!(a, b, c d e);
|
||||||
| ^ no rules expected the token `d`
|
| ^ no rules expected this token in macro call
|
||||||
|
|
||||||
error: aborting due to 5 previous errors
|
error: aborting due to 5 previous errors
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ error: no rules expected the token `enum E { }`
|
|||||||
--> $DIR/nonterminal-matching.rs:29:10
|
--> $DIR/nonterminal-matching.rs:29:10
|
||||||
|
|
|
|
||||||
LL | n!(a $nt_item b); //~ ERROR no rules expected the token `enum E { }`
|
LL | n!(a $nt_item b); //~ ERROR no rules expected the token `enum E { }`
|
||||||
| ^^^^^^^^ no rules expected the token `enum E { }`
|
| ^^^^^^^^ no rules expected this token in macro call
|
||||||
...
|
...
|
||||||
LL | complex_nonterminal!(enum E {});
|
LL | complex_nonterminal!(enum E {});
|
||||||
| -------------------------------- in this macro invocation
|
| -------------------------------- in this macro invocation
|
||||||
|
@ -5,7 +5,7 @@ LL | macro_rules! my_faulty_macro {
|
|||||||
| ---------------------------- when calling this macro
|
| ---------------------------- when calling this macro
|
||||||
LL | () => {
|
LL | () => {
|
||||||
LL | my_faulty_macro!(bcd); //~ ERROR no rules
|
LL | my_faulty_macro!(bcd); //~ ERROR no rules
|
||||||
| ^^^ no rules expected the token `bcd`
|
| ^^^ no rules expected this token in macro call
|
||||||
...
|
...
|
||||||
LL | my_faulty_macro!();
|
LL | my_faulty_macro!();
|
||||||
| ------------------- in this macro invocation
|
| ------------------- in this macro invocation
|
||||||
|
@ -5,7 +5,7 @@ LL | macro_rules! outer {
|
|||||||
| ------------------ when calling this macro
|
| ------------------ when calling this macro
|
||||||
...
|
...
|
||||||
LL | //! Inner
|
LL | //! Inner
|
||||||
| ^^^^^^^^^ no rules expected the token `!`
|
| ^^^^^^^^^ no rules expected this token in macro call
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@ LL | macro_rules! inner {
|
|||||||
| ------------------ when calling this macro
|
| ------------------ when calling this macro
|
||||||
...
|
...
|
||||||
LL | /// Outer
|
LL | /// Outer
|
||||||
| ^ no rules expected the token `[`
|
| ^ no rules expected this token in macro call
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@ LL | macro_rules! identity {
|
|||||||
| --------------------- when calling this macro
|
| --------------------- when calling this macro
|
||||||
...
|
...
|
||||||
LL | let identity!(_) = 10; //~ ERROR no rules expected the token `_`
|
LL | let identity!(_) = 10; //~ ERROR no rules expected the token `_`
|
||||||
| ^ no rules expected the token `_`
|
| ^ no rules expected this token in macro call
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ error: no rules expected the token `,`
|
|||||||
--> $DIR/vec-macro-with-comma-only.rs:12:10
|
--> $DIR/vec-macro-with-comma-only.rs:12:10
|
||||||
|
|
|
|
||||||
LL | vec![,]; //~ ERROR no rules expected the token `,`
|
LL | vec![,]; //~ ERROR no rules expected the token `,`
|
||||||
| ^ no rules expected the token `,`
|
| ^ no rules expected this token in macro call
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user