]> Cypherpunks repositories - gostls13.git/commitdiff
go/parser: parse an ast.IndexExpr for a[]
authorRob Findley <rfindley@google.com>
Mon, 21 Jun 2021 20:10:14 +0000 (16:10 -0400)
committerRobert Findley <rfindley@google.com>
Tue, 22 Jun 2021 02:37:43 +0000 (02:37 +0000)
To be consistent with Go 1.16, and to preserve as much information in
the AST as possible, parse an ast.IndexExpr with BadExpr Index for the
invalid expression a[].

A go/types test had to be adjusted to account for an additional error
resulting from this change.

We don't have a lot of test coverage for parser error recovery, so
rather than write an ad-hoc test for this issue, add a new go/types test
that checks that the indexed operand is used.

Updates #46403

Change-Id: I21e6ff4179746aaa50e530d4091fded450e69824
Reviewed-on: https://go-review.googlesource.com/c/go/+/329791
Trust: Robert Findley <rfindley@google.com>
Trust: Robert Griesemer <gri@golang.org>
Run-TryBot: Robert Findley <rfindley@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
src/go/parser/parser.go
src/go/types/testdata/examples/functions.go2
src/go/types/testdata/fixedbugs/issue46403.src [new file with mode: 0644]

index 3965641713a19fe89eb9405eb6db8222c1575f15..f10c8650afd0bf15461f712a8694e03bd02f7ab3 100644 (file)
@@ -1302,7 +1302,12 @@ func (p *parser) parseIndexOrSliceOrInstance(x ast.Expr) ast.Expr {
                p.errorExpected(p.pos, "operand")
                rbrack := p.pos
                p.next()
-               return &ast.BadExpr{From: x.Pos(), To: rbrack}
+               return &ast.IndexExpr{
+                       X:      x,
+                       Lbrack: lbrack,
+                       Index:  &ast.BadExpr{From: rbrack, To: rbrack},
+                       Rbrack: rbrack,
+               }
        }
        p.exprLev++
 
index fb74ae7ae25c15f8efb715f5629d1ad294e5c7dd..a0534712025c62f00931b9305fef8d70376274d3 100644 (file)
@@ -210,5 +210,5 @@ func _() {
 func h[] /* ERROR empty type parameter list */ ()
 
 func _() {
-       h[] /* ERROR operand */ ()
+       h /* ERROR cannot index */ [] /* ERROR operand */ ()
 }
diff --git a/src/go/types/testdata/fixedbugs/issue46403.src b/src/go/types/testdata/fixedbugs/issue46403.src
new file mode 100644 (file)
index 0000000..9d47522
--- /dev/null
@@ -0,0 +1,11 @@
+// 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 issue46403
+
+func _() {
+       // a should be used, despite the parser error below.
+       var a []int
+       var _ = a[] // ERROR expected operand
+}