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:
parent
857d55a3f9
commit
ec96795ba2
@ -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()
|
||||
|
||||
|
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user