]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile/internal/syntax: better error recovery after missing expression
authorRobert Griesemer <gri@golang.org>
Thu, 1 Aug 2019 18:45:21 +0000 (11:45 -0700)
committerRobert Griesemer <gri@golang.org>
Tue, 27 Aug 2019 15:46:41 +0000 (15:46 +0000)
Don't skip closing parentheses of any kind after a missing
expression. They are likely part of the lexical construct
enclosing the expression.

Fixes #33386.

Change-Id: Ic0abc2037ec339a345ec357ccc724b7ad2a64c00
Reviewed-on: https://go-review.googlesource.com/c/go/+/188502
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/compile/internal/syntax/parser.go
test/fixedbugs/issue33386.go [new file with mode: 0644]

index d4e9bf2f9651540c4eed125c7ce69876209b6242..6ad1e5b9a5f6a5fd42996ebbacfb5fb6139e0f8d 100644 (file)
@@ -869,7 +869,7 @@ func (p *parser) operand(keep_parens bool) Expr {
        default:
                x := p.bad()
                p.syntaxError("expecting expression")
-               p.advance()
+               p.advance(_Rparen, _Rbrack, _Rbrace)
                return x
        }
 
@@ -1840,6 +1840,9 @@ func (p *parser) header(keyword token) (init SimpleStmt, cond Expr, post SimpleS
                } else {
                        // asking for a '{' rather than a ';' here leads to a better error message
                        p.want(_Lbrace)
+                       if p.tok != _Lbrace {
+                               p.advance(_Lbrace, _Rbrace) // for better synchronization (e.g., issue #22581)
+                       }
                }
                if keyword == _For {
                        if p.tok != _Semi {
diff --git a/test/fixedbugs/issue33386.go b/test/fixedbugs/issue33386.go
new file mode 100644 (file)
index 0000000..afc27e6
--- /dev/null
@@ -0,0 +1,29 @@
+// errorcheck
+
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Verify that we don't get spurious follow-on errors
+// after a missing expression. Specifically, the parser
+// shouldn't skip over closing parentheses of any kind.
+
+package p
+
+func _() {
+       go func() { // no error here about goroutine
+               send <-
+       }() // ERROR "expecting expression"
+}
+
+func _() {
+       defer func() { // no error here about deferred function
+               1 +
+       }() // ERROR "expecting expression"
+}
+
+func _() {
+       _ = (1 +)             // ERROR "expecting expression"
+       _ = a[2 +]            // ERROR "expecting expression"
+       _ = []int{1, 2, 3 + } // ERROR "expecting expression"
+}