mirror of
https://github.com/golang/go
synced 2024-11-17 16:14:42 -07:00
cmd/compile/internal/syntax: handle missing index like in go/parser
Instead of simply reporting an error but otherwise dropping the index expression from the parse tree when an index is missing (as in: x[]), create an index expression with a "bad expression" as index. This matches the behavior of go/parser and permits the use of the same test case for both parsers. (It would be simpler to adjust the go/parser to match the syntax parser's behavior, but that would break backward-compatibility of the go/parser.) Adjust the affected test files. For #54511. Change-Id: If7668973794604593e869a24b560da92e100b812 Reviewed-on: https://go-review.googlesource.com/c/go/+/424654 Run-TryBot: Robert Griesemer <gri@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Robert Findley <rfindley@google.com> Reviewed-by: Robert Griesemer <gri@google.com>
This commit is contained in:
parent
39ec97da15
commit
9485d4c1bd
@ -1111,20 +1111,19 @@ loop:
|
||||
case _Lbrack:
|
||||
p.next()
|
||||
|
||||
if p.tok == _Rbrack {
|
||||
// invalid empty instance, slice or index expression; accept but complain
|
||||
p.syntaxError("expecting operand")
|
||||
p.next()
|
||||
break
|
||||
}
|
||||
|
||||
var i Expr
|
||||
if p.tok != _Colon {
|
||||
var comma bool
|
||||
if p.tok == _Rbrack {
|
||||
// invalid empty instance, slice or index expression; accept but complain
|
||||
p.syntaxError("expecting operand")
|
||||
i = p.badExpr()
|
||||
} else {
|
||||
i, comma = p.typeList()
|
||||
}
|
||||
if comma || p.tok == _Rbrack {
|
||||
p.want(_Rbrack)
|
||||
// x[i,] or x[i, j, ...]
|
||||
// x[], x[i,] or x[i, j, ...]
|
||||
t := new(IndexExpr)
|
||||
t.pos = pos
|
||||
t.X = x
|
||||
|
@ -211,7 +211,7 @@ func _() {
|
||||
func h[] /* ERROR empty type parameter list */ () {}
|
||||
|
||||
func _() {
|
||||
h[] /* ERROR operand */ ()
|
||||
h[ /* ERROR cannot index */ ] /* ERROR operand */ ()
|
||||
}
|
||||
|
||||
// Parameterized functions must have a function body.
|
||||
|
@ -83,7 +83,7 @@ var x T25 /* ERROR without instantiation */ .m1
|
||||
|
||||
// crash 26
|
||||
type T26 = interface{ F26[ /* ERROR interface method must have no type parameters */ Z any]() }
|
||||
func F26[Z any]() T26 { return F26 /* ERROR without instantiation */ [] /* ERROR operand */ }
|
||||
func F26[Z any]() T26 { return F26[] /* ERROR operand */ }
|
||||
|
||||
// crash 27
|
||||
func e27[T any]() interface{ x27 /* ERROR not a type */ } { panic(0) }
|
||||
|
@ -83,9 +83,6 @@ var x T25 /* ERROR without instantiation */ .m1
|
||||
|
||||
// crash 26
|
||||
type T26 = interface{ F26[ /* ERROR interface method must have no type parameters */ Z any]() }
|
||||
// The error messages on the line below differ from types2 because for backward
|
||||
// compatibility go/parser must produce an IndexExpr with BadExpr index for the
|
||||
// expression F26[].
|
||||
func F26[Z any]() T26 { return F26[] /* ERROR operand */ }
|
||||
|
||||
// crash 27
|
||||
|
Loading…
Reference in New Issue
Block a user