From 3c22e5ca271ca4ad17b34d965e6a9baf7b5cf94d Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Wed, 8 Feb 2017 17:56:41 -0800 Subject: [PATCH] cmd/compile/internal/parser: improved syntax error for incorrect if/for/switch header Starting the error message with "expecting" rather than "missing" causes the syntax error mechanism to add additional helpful info (it recognizes "expecting" but not "missing"). Fixes #17328. Change-Id: I8482ca5e5a6a6b22e0ed0d831b7328e264156334 Reviewed-on: https://go-review.googlesource.com/36637 Run-TryBot: Robert Griesemer Reviewed-by: Matthew Dempsky TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/syntax/parser.go | 2 +- test/fixedbugs/issue17328.go | 13 +++++++++++++ test/syntax/semi1.go | 2 +- test/syntax/semi3.go | 2 +- test/syntax/semi4.go | 4 ++-- 5 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 test/fixedbugs/issue17328.go diff --git a/src/cmd/compile/internal/syntax/parser.go b/src/cmd/compile/internal/syntax/parser.go index f016a6adbe..c1faa27894 100644 --- a/src/cmd/compile/internal/syntax/parser.go +++ b/src/cmd/compile/internal/syntax/parser.go @@ -1690,7 +1690,7 @@ func (p *parser) stmtBody(context string) []Stmt { } if !p.got(_Lbrace) { - p.syntax_error("missing { after " + context) + p.syntax_error("expecting { after " + context) p.advance(_Name, _Rbrace) } diff --git a/test/fixedbugs/issue17328.go b/test/fixedbugs/issue17328.go new file mode 100644 index 0000000000..abe4daa353 --- /dev/null +++ b/test/fixedbugs/issue17328.go @@ -0,0 +1,13 @@ +// 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. + +package main + +func main() { + i := 0 + for ; ; i++) { // ERROR "unexpected \), expecting { after for clause" + } +} diff --git a/test/syntax/semi1.go b/test/syntax/semi1.go index c755445b42..8eed05c1ca 100644 --- a/test/syntax/semi1.go +++ b/test/syntax/semi1.go @@ -7,7 +7,7 @@ package main func main() { - if x; y // ERROR "missing .*{.* after if clause|undefined" + if x; y // ERROR "expected .*{.* after if clause|undefined" { z // GCCGO_ERROR "undefined" diff --git a/test/syntax/semi3.go b/test/syntax/semi3.go index d625d08350..d064ce631c 100644 --- a/test/syntax/semi3.go +++ b/test/syntax/semi3.go @@ -7,7 +7,7 @@ package main func main() { - for x; y; z // ERROR "missing .*{.* after for clause|undefined" + for x; y; z // ERROR "expected .*{.* after for clause|undefined" { z // GCCGO_ERROR "undefined" diff --git a/test/syntax/semi4.go b/test/syntax/semi4.go index 6f5592ef0e..0b5e677680 100644 --- a/test/syntax/semi4.go +++ b/test/syntax/semi4.go @@ -13,5 +13,5 @@ package main func main() { for x // GCCGO_ERROR "undefined" - { // ERROR "missing .*{.* after for clause|missing operand" - z // ERROR "undefined|missing { after for clause" + { // ERROR "expecting .*{.* after for clause|missing operand" + z // ERROR "undefined|expecting { after for clause"