Skip to content

Added help for eof message inside macro invocation #33963

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions src/libsyntax/parse/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2440,6 +2440,13 @@ impl<'a> Parser<'a> {
err.cancel();
let msg = format!("expected expression, found {}",
self.this_token_descr());
if self.token == token::Token::Eof {
let help = format!("{} in this context refers \
to the end of the macro invocation",
self.this_token_descr());
return Err(self.span_fatal_help(
self.span, &msg, &help));
}
Copy link
Contributor

@LeoTestard LeoTestard May 31, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You cannot know here that you are parsing the arguments of a macro invocation. I suspect that the following code:

static foo: u32 =

will trigger your error message. Which is obviously not what you want.

Besides, your code only handles the case where the macro parsing reaches EOF while trying to parse an expr. Thing is, macros can parse a lot of different fragments of Rust syntax and match arbitrary Rust tokens. So there are a lot of other places where you should handle this as well. As far as I know, it's not possible to handle them all because for those who use the Rust parser (like expr), you cannot know if you are parsing a macro invocation or not.

Maybe the easier solution would be to introduce a special token to indicate end of macro invocation that would behave like EOF except for error messages but that would be a lot of changes just to add an help message.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe the easier solution would be to introduce a special token to indicate end of macro invocation that would behave like EOF except for error messages but that would be a lot of changes just to add an help message.

This seems like a good idea to me, too.

return Err(self.fatal(&msg));
}
}
Expand Down
16 changes: 16 additions & 0 deletions src/test/parse-fail/macro-eof-message.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.


fn main() {
let message = "test";
println!("{}", message/); //~ ERROR expected expression, found `<eof>`
//~^ HELP `<eof>` in this context refers to the end of the macro invocation
}