From 3b68a647696ebfb61d199155f5f1faa5740e5c55 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Mon, 6 Feb 2017 15:08:28 -0800 Subject: [PATCH] cmd/compile/internal/syntax: make a parser error "1.7 compliant" For code such as if a := 10 { ... the 1.7 compiler reported a := 10 used as value while the 1.8 compiler reported invalid condition, tag, or type switch guard Changed the error message to match the 1.7 compiler. Fixes #18915. Change-Id: I01308862e461922e717f9f8295a9db53d5a914eb Reviewed-on: https://go-review.googlesource.com/36470 Run-TryBot: Robert Griesemer Reviewed-by: Matthew Dempsky TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/syntax/parser.go | 7 ++++++- test/fixedbugs/issue18915.go | 21 +++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 test/fixedbugs/issue18915.go diff --git a/src/cmd/compile/internal/syntax/parser.go b/src/cmd/compile/internal/syntax/parser.go index fd16f580fb..bebcbb14de 100644 --- a/src/cmd/compile/internal/syntax/parser.go +++ b/src/cmd/compile/internal/syntax/parser.go @@ -1746,7 +1746,12 @@ func (p *parser) header(forStmt bool) (init SimpleStmt, cond Expr, post SimpleSt case *ExprStmt: cond = s.X default: - p.error("invalid condition, tag, or type switch guard") + // Not obviously a syntax error but by making it one, we get + // automatic filtering of multiple syntax error messages per + // line in the compiler. This avoids the follow-up error + // "missing condition in if statement" for an if statement + // (minimal fix for #18915). + p.syntax_error(fmt.Sprintf("%s used as value", String(s))) } p.xnest = outer diff --git a/test/fixedbugs/issue18915.go b/test/fixedbugs/issue18915.go new file mode 100644 index 0000000000..a432bbc17c --- /dev/null +++ b/test/fixedbugs/issue18915.go @@ -0,0 +1,21 @@ +// 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. + +// Make sure error message for invalid conditions +// or tags are consistent with earlier Go versions. + +package p + +func _() { + if a := 10 { // ERROR "a := 10 used as value" + } + + for b := 10 { // ERROR "b := 10 used as value" + } + + switch c := 10 { // ERROR "c := 10 used as value" + } +}