]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile/internal/syntax: better syntax errors for typos in if/switch/for headers
authorgriesemer <gri@golang.org>
Mon, 6 Nov 2017 23:01:33 +0000 (15:01 -0800)
committerRobert Griesemer <gri@golang.org>
Mon, 6 Nov 2017 23:17:24 +0000 (23:17 +0000)
Be more pessimistic when parsing if/switch/for headers for better error
messages when things go wrong.

Fixes #22581.

Change-Id: Ibb99925291ff53f35021bc0a59a4c9a7f695a194
Reviewed-on: https://go-review.googlesource.com/76290
Run-TryBot: Robert Griesemer <gri@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/compile/internal/syntax/parser.go
test/fixedbugs/issue22581.go [new file with mode: 0644]

index 8e47d8e723c1fed4eee6c50019633ee861578678..7047266a7049fd410c28dafd699f12d7206e5221 100644 (file)
@@ -1766,10 +1766,10 @@ func (p *parser) header(keyword token) (init SimpleStmt, cond Expr, post SimpleS
                pos src.Pos
                lit string // valid if pos.IsKnown()
        }
-       if p.tok == _Semi {
+       if p.tok != _Lbrace {
                semi.pos = p.pos()
                semi.lit = p.lit
-               p.next()
+               p.want(_Semi)
                if keyword == _For {
                        if p.tok != _Semi {
                                if p.tok == _Lbrace {
diff --git a/test/fixedbugs/issue22581.go b/test/fixedbugs/issue22581.go
new file mode 100644 (file)
index 0000000..2b637f2
--- /dev/null
@@ -0,0 +1,27 @@
+// 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 p
+
+func f() {
+       if i := g()); i == j { // ERROR "unexpected \)"
+       }
+
+       if i == g()] { // ERROR "unexpected \]"
+       }
+
+       switch i := g()); i { // ERROR "unexpected \)"
+       }
+
+       switch g()] { // ERROR "unexpected \]"
+       }
+
+       for i := g()); i < y; { // ERROR "unexpected \)"
+       }
+
+       for g()] { // ERROR "unexpected \]"
+       }
+}