]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile/internal/syntax: better recovery after missing closing parentheses
authorgriesemer <gri@golang.org>
Tue, 17 Oct 2017 00:17:40 +0000 (17:17 -0700)
committerRobert Griesemer <gri@golang.org>
Tue, 17 Oct 2017 01:04:56 +0000 (01:04 +0000)
Fine-tune skipping of tokens after missing closing parentheses in lists.

Fixes #22164.

Change-Id: I575d86e21048cd40340a2c08399e8b0deec337cf
Reviewed-on: https://go-review.googlesource.com/71250
Run-TryBot: Robert Griesemer <gri@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/compile/internal/syntax/parser.go
test/fixedbugs/issue22164.go [new file with mode: 0644]

index cda2cf42da31b0bea5dd056a536eccd3d1ff3a5d..3d14b70eba324f1a289ce771c117579f10f688bd 100644 (file)
@@ -377,8 +377,10 @@ func (p *parser) list(open, sep, close token, f func() bool) src.Pos {
                        //            to the expected close token only
                default:
                        p.syntax_error(fmt.Sprintf("expecting %s or %s", tokstring(sep), tokstring(close)))
-                       p.advance(close)
-                       done = true
+                       p.advance(_Rparen, _Rbrack, _Rbrace)
+                       if p.tok != close {
+                               return p.pos()
+                       }
                }
        }
 
diff --git a/test/fixedbugs/issue22164.go b/test/fixedbugs/issue22164.go
new file mode 100644 (file)
index 0000000..fad78e2
--- /dev/null
@@ -0,0 +1,26 @@
+// errorcheck
+
+// Copyright 2017 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.
+
+// Test error recovery after missing closing parentheses in lists.
+
+package p
+
+func f() {
+       x := f(g() // ERROR "unexpected newline"
+       y := 1
+}
+
+func g() {
+}
+
+func h() {
+       x := f(g() // ERROR "unexpected newline"
+}
+
+func i() {
+       x := []int{1, 2, 3 // ERROR "unexpected newline"
+       y := 0
+}
\ No newline at end of file