1
0
mirror of https://github.com/golang/go synced 2024-11-19 20:54:39 -07:00

go/parser: fix (pathological) corner case

Inside a control clause (if ... {}), composite
literals starting with a type name must be parenthesized.
A composite literal used in the array length expression
of an array composite literal is already parenthesized.
Not a valid program, but syntactically is should
be accepted.

LGTM=adonovan
R=adonovan
CC=golang-codereviews
https://golang.org/cl/142760043
This commit is contained in:
Robert Griesemer 2014-09-08 14:54:00 -07:00
parent 857d55a3f9
commit ec96795ba2
2 changed files with 3 additions and 0 deletions

View File

@ -641,6 +641,7 @@ func (p *parser) parseArrayType() ast.Expr {
}
lbrack := p.expect(token.LBRACK)
p.exprLev++
var len ast.Expr
// always permit ellipsis for more fault-tolerant parsing
if p.tok == token.ELLIPSIS {
@ -649,6 +650,7 @@ func (p *parser) parseArrayType() ast.Expr {
} else if p.tok != token.RBRACK {
len = p.parseRhs()
}
p.exprLev--
p.expect(token.RBRACK)
elt := p.parseType()

View File

@ -39,6 +39,7 @@ var valids = []string{
`package p; func ((*T),) m() {}`,
`package p; func (*(T),) m() {}`,
`package p; func _(x []int) { for range x {} }`,
`package p; func _() { if [T{}.n]int{} {} }`,
}
func TestValid(t *testing.T) {