]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile/internal/syntax: make a parser error "1.7 compliant"
authorRobert Griesemer <gri@golang.org>
Mon, 6 Feb 2017 23:08:28 +0000 (15:08 -0800)
committerRobert Griesemer <gri@golang.org>
Mon, 6 Feb 2017 23:33:07 +0000 (23:33 +0000)
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 <gri@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/compile/internal/syntax/parser.go
test/fixedbugs/issue18915.go [new file with mode: 0644]

index fd16f580fb43b792f3fd10646fc362f8525e901c..bebcbb14de8deed212642ce6b2bce4444029637c 100644 (file)
@@ -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 (file)
index 0000000..a432bbc
--- /dev/null
@@ -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"
+       }
+}