diff --git a/src/cmd/compile/internal/syntax/parser.go b/src/cmd/compile/internal/syntax/parser.go index 121dfb75e5..92eae0a458 100644 --- a/src/cmd/compile/internal/syntax/parser.go +++ b/src/cmd/compile/internal/syntax/parser.go @@ -1680,7 +1680,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" + } +}