]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile/internal/syntax: better error message for index syntax error
authorRobert Griesemer <gri@golang.org>
Sun, 15 Aug 2021 18:46:33 +0000 (11:46 -0700)
committerRobert Griesemer <gri@golang.org>
Sun, 15 Aug 2021 19:08:56 +0000 (19:08 +0000)
Fixes #47704.

Change-Id: I1de9fd00baaa4b534c23f011ade54120f5153a9d
Reviewed-on: https://go-review.googlesource.com/c/go/+/342369
Trust: Robert Griesemer <gri@golang.org>
Run-TryBot: Robert Griesemer <gri@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Robert Findley <rfindley@google.com>
src/cmd/compile/internal/syntax/parser.go
src/cmd/compile/internal/syntax/testdata/issue47704.src [new file with mode: 0644]

index acffd8488551688b342405b05e4191683cd9e830..29f5c88d0f2bf1ec8319371d77b29e6051021e7f 100644 (file)
@@ -1049,7 +1049,11 @@ loop:
                        }
 
                        // x[i:...
-                       p.want(_Colon)
+                       // For better error message, don't use p.want(_Colon) here (issue #47704).
+                       if !p.got(_Colon) {
+                               p.syntaxError("expecting : or ]")
+                               p.advance(_Colon, _Rbrack)
+                       }
                        p.xnest++
                        t := new(SliceExpr)
                        t.pos = pos
diff --git a/src/cmd/compile/internal/syntax/testdata/issue47704.src b/src/cmd/compile/internal/syntax/testdata/issue47704.src
new file mode 100644 (file)
index 0000000..0156af7
--- /dev/null
@@ -0,0 +1,18 @@
+// Copyright 2021 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
+
+// error messages for parser in non-generic mode
+func _() {
+       _ = m[]   // ERROR expecting operand
+       _ = m[x,] // ERROR unexpected comma, expecting \: or \]
+       _ = m[x /* ERROR unexpected a */ a b c d]
+}
+
+// test case from the issue
+func f(m map[int]int) int {
+       return m[0 // ERROR expecting \: or \]
+               ]
+}