From 0b2cb89196967030ae005076f0166ad7d6024083 Mon Sep 17 00:00:00 2001 From: griesemer Date: Mon, 16 Oct 2017 17:17:40 -0700 Subject: [PATCH] cmd/compile/internal/syntax: better recovery after missing closing parentheses 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 Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/syntax/parser.go | 6 ++++-- test/fixedbugs/issue22164.go | 26 +++++++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 test/fixedbugs/issue22164.go diff --git a/src/cmd/compile/internal/syntax/parser.go b/src/cmd/compile/internal/syntax/parser.go index cda2cf42da3..3d14b70eba3 100644 --- a/src/cmd/compile/internal/syntax/parser.go +++ b/src/cmd/compile/internal/syntax/parser.go @@ -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 index 00000000000..fad78e23e81 --- /dev/null +++ b/test/fixedbugs/issue22164.go @@ -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