diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index f839a839853..be7e589f4ad 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -3158,9 +3158,7 @@ impl<'a> Parser<'a> { attrs.extend(iattrs); let hi = self.prev_span; - Ok(self.mk_expr(span_lo.to(hi), - ExprKind::ForLoop(pat, expr, loop_block, opt_ident), - attrs)) + Ok(self.mk_expr(span_lo.to(hi), ExprKind::ForLoop(pat, expr, loop_block, opt_ident), attrs)) } /// Parse a 'while' or 'while let' expression ('while' token already eaten) @@ -4252,13 +4250,11 @@ impl<'a> Parser<'a> { return Err(e); } - Ok(self.parse_block_tail(lo, BlockCheckMode::Default)?) + self.parse_block_tail(lo, BlockCheckMode::Default) } /// Parse a block. Inner attrs are allowed. - fn parse_inner_attrs_and_block(&mut self) - -> PResult<'a, (Vec, P)> - { + fn parse_inner_attrs_and_block(&mut self) -> PResult<'a, (Vec, P)> { maybe_whole!(self, NtBlock, |x| (Vec::new(), x)); let lo = self.span; @@ -4269,9 +4265,7 @@ impl<'a> Parser<'a> { /// Parse the rest of a block expression or function body /// Precondition: already parsed the '{'. - fn parse_block_tail(&mut self, lo: Span, s: BlockCheckMode) - -> PResult<'a, P> - { + fn parse_block_tail(&mut self, lo: Span, s: BlockCheckMode) -> PResult<'a, P> { let mut stmts = vec![]; while !self.eat(&token::CloseDelim(token::Brace)) { @@ -5340,32 +5334,23 @@ impl<'a> Parser<'a> { } fn consume_block(&mut self, delim: token::DelimToken) { - debug!("consuming {:?}", delim); - debug!("self.token {:?}", self.token); let mut brace_depth = 0; if !self.eat(&token::OpenDelim(delim)) { - debug!("didn't eat delim"); return; } loop { if self.eat(&token::OpenDelim(delim)) { - debug!("add depth"); brace_depth += 1; } else if self.eat(&token::CloseDelim(delim)) { - debug!("found closing"); if brace_depth == 0 { - debug!("ending"); return; } else { - debug!("decrease"); brace_depth -= 1; continue; } } else if self.eat(&token::Eof) || self.eat(&token::CloseDelim(token::NoDelim)) { - debug!("eof or nodelim"); return; } else { - debug!("bump"); self.bump(); } } @@ -6297,6 +6282,8 @@ impl<'a> Parser<'a> { // pub S {} // ^^^ `sp` points here let sp = self.prev_span.between(self.span); + let full_sp = self.prev_span.to(self.span); + let ident_sp = self.span; if self.look_ahead(1, |t| *t == token::OpenDelim(token::Brace)) { // possible public struct definition where `struct` was forgotten let ident = self.parse_ident().unwrap(); @@ -6328,6 +6315,16 @@ impl<'a> Parser<'a> { ident, kw_name); err.span_suggestion_short(sp, &suggestion, format!(" {} ", kw)); + } else { + if let Ok(snippet) = self.sess.codemap().span_to_snippet(ident_sp) { + err.span_suggestion( + full_sp, + "if you meant to call a macro, write instead", + format!("{}!", snippet)); + } else { + err.help("if you meant to call a macro, remove the `pub` \ + and add a trailing `!` after the identifier"); + } } return Err(err); } diff --git a/src/test/parse-fail/doc-after-struct-field.rs b/src/test/parse-fail/doc-after-struct-field.rs index 1aa6af5b78f..8babf4daadd 100644 --- a/src/test/parse-fail/doc-after-struct-field.rs +++ b/src/test/parse-fail/doc-after-struct-field.rs @@ -16,5 +16,5 @@ struct X { } fn main() { - let y = X {a = 1}; + let y = X {a: 1}; } diff --git a/src/test/parse-fail/doc-before-struct-rbrace-1.rs b/src/test/parse-fail/doc-before-struct-rbrace-1.rs index 5ba83190c8e..6d9b4b05ad9 100644 --- a/src/test/parse-fail/doc-before-struct-rbrace-1.rs +++ b/src/test/parse-fail/doc-before-struct-rbrace-1.rs @@ -17,5 +17,5 @@ struct X { } fn main() { - let y = X {a = 1}; + let y = X {a: 1}; } diff --git a/src/test/parse-fail/doc-before-struct-rbrace-2.rs b/src/test/parse-fail/doc-before-struct-rbrace-2.rs index 643e4aa17a1..63b2f963799 100644 --- a/src/test/parse-fail/doc-before-struct-rbrace-2.rs +++ b/src/test/parse-fail/doc-before-struct-rbrace-2.rs @@ -16,5 +16,5 @@ struct X { } fn main() { - let y = X {a = 1}; + let y = X {a: 1}; } diff --git a/src/test/parse-fail/issue-22647.rs b/src/test/parse-fail/issue-22647.rs index 1ace57edba3..3da9d1a8712 100644 --- a/src/test/parse-fail/issue-22647.rs +++ b/src/test/parse-fail/issue-22647.rs @@ -16,6 +16,7 @@ fn main() { println!("Y {}",x); return x; }; + //~^ ERROR expected item, found `;` caller(bar_handler); } diff --git a/src/test/parse-fail/issue-22712.rs b/src/test/parse-fail/issue-22712.rs index ed936cdd9a9..84d4a757a07 100644 --- a/src/test/parse-fail/issue-22712.rs +++ b/src/test/parse-fail/issue-22712.rs @@ -14,6 +14,6 @@ struct Foo { fn bar() { let Foo> //~ ERROR expected one of `:`, `;`, `=`, or `@`, found `<` -} +} //~ ERROR expected item, found `}` fn main() {} diff --git a/src/test/parse-fail/issue-24197.rs b/src/test/parse-fail/issue-24197.rs index 37d62182612..b6bc3a29e06 100644 --- a/src/test/parse-fail/issue-24197.rs +++ b/src/test/parse-fail/issue-24197.rs @@ -10,4 +10,4 @@ fn main() { let buf[0] = 0; //~ ERROR expected one of `:`, `;`, `=`, or `@`, found `[` -} +} //~ ERROR expected item, found `}` diff --git a/src/test/parse-fail/mut-patterns.rs b/src/test/parse-fail/mut-patterns.rs index 71d826c67f8..ffb45597552 100644 --- a/src/test/parse-fail/mut-patterns.rs +++ b/src/test/parse-fail/mut-patterns.rs @@ -15,4 +15,5 @@ pub fn main() { struct Foo { x: isize } let mut Foo { x: x } = Foo { x: 3 }; //~ ERROR: expected one of `:`, `;`, `=`, or `@`, found `{` + //~^ ERROR expected item, found `=` } diff --git a/src/test/parse-fail/pat-lt-bracket-5.rs b/src/test/parse-fail/pat-lt-bracket-5.rs index 3345845eee9..95ad006402e 100644 --- a/src/test/parse-fail/pat-lt-bracket-5.rs +++ b/src/test/parse-fail/pat-lt-bracket-5.rs @@ -9,5 +9,5 @@ // except according to those terms. fn main() { - let v[0] = v[1]; //~ error: expected one of `:`, `;`, `=`, or `@`, found `[` -} + let v[0] = v[1]; //~ ERROR expected one of `:`, `;`, `=`, or `@`, found `[` +} //~ ERROR expected item, found `}` diff --git a/src/test/parse-fail/pat-ranges-1.rs b/src/test/parse-fail/pat-ranges-1.rs index 857a3924aec..7a42f453c74 100644 --- a/src/test/parse-fail/pat-ranges-1.rs +++ b/src/test/parse-fail/pat-ranges-1.rs @@ -12,4 +12,4 @@ fn main() { let macropus!() ..= 11 = 12; //~ error: expected one of `:`, `;`, or `=`, found `..=` -} +} //~ ERROR expected item, found `}` diff --git a/src/test/parse-fail/pat-ranges-2.rs b/src/test/parse-fail/pat-ranges-2.rs index 64c749333cf..ad0a3b3b67f 100644 --- a/src/test/parse-fail/pat-ranges-2.rs +++ b/src/test/parse-fail/pat-ranges-2.rs @@ -12,4 +12,4 @@ fn main() { let 10 ..= makropulos!() = 12; //~ error: expected one of `::`, `:`, `;`, or `=`, found `!` -} +} //~ ERROR expected item, found `}` diff --git a/src/test/parse-fail/pat-ranges-3.rs b/src/test/parse-fail/pat-ranges-3.rs index 1327a9fab36..4a9a12bcdd2 100644 --- a/src/test/parse-fail/pat-ranges-3.rs +++ b/src/test/parse-fail/pat-ranges-3.rs @@ -12,4 +12,4 @@ fn main() { let 10 ..= 10 + 3 = 12; //~ expected one of `:`, `;`, or `=`, found `+` -} +} //~ ERROR expected item, found `}` diff --git a/src/test/parse-fail/pat-ranges-4.rs b/src/test/parse-fail/pat-ranges-4.rs index c159c770250..32fdc263b2d 100644 --- a/src/test/parse-fail/pat-ranges-4.rs +++ b/src/test/parse-fail/pat-ranges-4.rs @@ -13,4 +13,4 @@ fn main() { let 10 - 3 ..= 10 = 8; //~^ error: expected one of `...`, `..=`, `..`, `:`, `;`, or `=`, found `-` -} +} //~ ERROR expected item, found `}` diff --git a/src/test/parse-fail/range-3.rs b/src/test/parse-fail/range-3.rs index 95aa71b0cdf..f413ac34087 100644 --- a/src/test/parse-fail/range-3.rs +++ b/src/test/parse-fail/range-3.rs @@ -15,4 +15,4 @@ pub fn main() { let r = 1..2..3; //~^ ERROR expected one of `.`, `;`, `?`, or an operator, found `..` -} +} //~ ERROR expected item, found `}` diff --git a/src/test/parse-fail/range-4.rs b/src/test/parse-fail/range-4.rs index 4500df116a2..0b385129b23 100644 --- a/src/test/parse-fail/range-4.rs +++ b/src/test/parse-fail/range-4.rs @@ -15,4 +15,4 @@ pub fn main() { let r = ..1..2; //~^ ERROR expected one of `.`, `;`, `?`, or an operator, found `..` -} +} //~ ERROR expected item, found `}` diff --git a/src/test/ui/suggestions/pub-ident-fn-2.stderr b/src/test/ui/suggestions/pub-ident-fn-2.stderr index 43b81efbf4c..7d3abceb11b 100644 --- a/src/test/ui/suggestions/pub-ident-fn-2.stderr +++ b/src/test/ui/suggestions/pub-ident-fn-2.stderr @@ -3,7 +3,6 @@ error: missing `fn` for method definition | 11 | pub foo(s: usize) { bar() } | ^ - | help: add `fn` here to parse `foo` as a public method | 11 | pub fn foo(s: usize) { bar() } diff --git a/src/test/ui/suggestions/pub-ident-fn-or-struct-2.stderr b/src/test/ui/suggestions/pub-ident-fn-or-struct-2.stderr index e8636f67e0b..68dea2aec3a 100644 --- a/src/test/ui/suggestions/pub-ident-fn-or-struct-2.stderr +++ b/src/test/ui/suggestions/pub-ident-fn-or-struct-2.stderr @@ -2,7 +2,7 @@ error: missing `fn` or `struct` for method or struct definition --> $DIR/pub-ident-fn-or-struct-2.rs:11:4 | 11 | pub S(); - | ^ + | ---^- help: if you meant to call a macro, write instead: `S!` error: aborting due to previous error diff --git a/src/test/ui/suggestions/pub-ident-fn-or-struct.stderr b/src/test/ui/suggestions/pub-ident-fn-or-struct.stderr index dc391c1113d..0c19f776bd1 100644 --- a/src/test/ui/suggestions/pub-ident-fn-or-struct.stderr +++ b/src/test/ui/suggestions/pub-ident-fn-or-struct.stderr @@ -2,7 +2,7 @@ error: missing `fn` or `struct` for method or struct definition --> $DIR/pub-ident-fn-or-struct.rs:11:4 | 11 | pub S (foo) bar - | ^ + | ---^- help: if you meant to call a macro, write instead: `S!` error: aborting due to previous error diff --git a/src/test/ui/suggestions/pub-ident-fn.stderr b/src/test/ui/suggestions/pub-ident-fn.stderr index 19d3db157c2..d36b9b127e0 100644 --- a/src/test/ui/suggestions/pub-ident-fn.stderr +++ b/src/test/ui/suggestions/pub-ident-fn.stderr @@ -3,7 +3,6 @@ error: missing `fn` for method definition | 11 | pub foo(s: usize) -> bool { true } | ^^^ - | help: add `fn` here to parse `foo` as a public method | 11 | pub fn foo(s: usize) -> bool { true } diff --git a/src/test/ui/suggestions/pub-ident-struct.stderr b/src/test/ui/suggestions/pub-ident-struct.stderr index bae2f6a4f80..36ef3072722 100644 --- a/src/test/ui/suggestions/pub-ident-struct.stderr +++ b/src/test/ui/suggestions/pub-ident-struct.stderr @@ -3,7 +3,6 @@ error: missing `struct` for struct definition | 11 | pub S { | ^ - | help: add `struct` here to parse `S` as a public struct | 11 | pub struct S {