From: Robert Griesemer Date: Sat, 14 Nov 2015 05:21:39 +0000 (-0800) Subject: cmd/compile/internal/gc: consume at least one token in case of syntax error X-Git-Tag: go1.6beta1~454 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=ac658a83c28ab3e68e9f21f21c9b0f63d13ca19c;p=gostls13.git cmd/compile/internal/gc: consume at least one token in case of syntax error Fixes #13248. TBR: iant Change-Id: Ic8b10704f945e6daef04bb38a00e249854b4ef19 Reviewed-on: https://go-review.googlesource.com/16930 Reviewed-by: Robert Griesemer --- diff --git a/src/cmd/compile/internal/gc/parser.go b/src/cmd/compile/internal/gc/parser.go index d5084fcd47..c8a682680d 100644 --- a/src/cmd/compile/internal/gc/parser.go +++ b/src/cmd/compile/internal/gc/parser.go @@ -141,17 +141,21 @@ func (p *parser) syntax_error(msg string) { Yyerror("syntax error: unexpected " + tok + msg) } -// Advance consumes tokens until it finds one in the stoplist. -// If the stoplist is empty, the next token is consumed. +// Advance consumes tokens until it finds a token of the stoplist. +// If the stoplist is empty or no advance was necessary, the next +// token is consumed. func (p *parser) advance(stoplist ...int32) { if len(stoplist) == 0 { p.next() return } - for p.tok != EOF { + for n := 0; p.tok != EOF; n++ { for _, stop := range stoplist { if p.tok == stop { + if n == 0 { + p.next() // consume at least one token + } return } } @@ -1409,8 +1413,8 @@ func (p *parser) operand(keep_parens bool) *Node { return nil default: - p.syntax_error("in operand") - p.advance(';', '}') + p.syntax_error("expecting expression") + p.advance() return nil } }