From ec96795ba20209263a0bbb17a073a9c028e74437 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Mon, 8 Sep 2014 14:54:00 -0700 Subject: [PATCH] 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 --- src/go/parser/parser.go | 2 ++ src/go/parser/short_test.go | 1 + 2 files changed, 3 insertions(+) diff --git a/src/go/parser/parser.go b/src/go/parser/parser.go index 9c62076f25..4a005d8ffa 100644 --- a/src/go/parser/parser.go +++ b/src/go/parser/parser.go @@ -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() diff --git a/src/go/parser/short_test.go b/src/go/parser/short_test.go index f861086ddb..05e44de28a 100644 --- a/src/go/parser/short_test.go +++ b/src/go/parser/short_test.go @@ -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) {