aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Griesemer <gri@golang.org>2010-04-27 11:57:17 -0700
committerRobert Griesemer <gri@golang.org>2010-04-27 11:57:17 -0700
commit48ccf8247e312098592ac1c07499238652ddb9d4 (patch)
tree48affdec02c9607ea3b3afc3f7a72bcc2c8479f4
parent2bfc2d777232bd8e3220fac71ba5585c39f71eb1 (diff)
downloadgo-48ccf8247e312098592ac1c07499238652ddb9d4.tar.gz
go-48ccf8247e312098592ac1c07499238652ddb9d4.zip
go/parser: don't require parens around composite literals inside a composite literal
within an if, for, or switch control clause R=rsc CC=golang-dev https://golang.org/cl/943046
-rw-r--r--src/pkg/go/parser/parser.go2
-rw-r--r--src/pkg/go/parser/parser_test.go3
2 files changed, 5 insertions, 0 deletions
diff --git a/src/pkg/go/parser/parser.go b/src/pkg/go/parser/parser.go
index 6831a53de2..52504994e6 100644
--- a/src/pkg/go/parser/parser.go
+++ b/src/pkg/go/parser/parser.go
@@ -1105,9 +1105,11 @@ func (p *parser) parseCompositeLit(typ ast.Expr) ast.Expr {
lbrace := p.expect(token.LBRACE)
var elts []ast.Expr
+ p.exprLev++
if p.tok != token.RBRACE {
elts = p.parseElementList()
}
+ p.exprLev--
rbrace := p.expect(token.RBRACE)
return &ast.CompositeLit{typ, lbrace, elts, rbrace}
}
diff --git a/src/pkg/go/parser/parser_test.go b/src/pkg/go/parser/parser_test.go
index 75ebd8cec7..01327a41d7 100644
--- a/src/pkg/go/parser/parser_test.go
+++ b/src/pkg/go/parser/parser_test.go
@@ -38,6 +38,9 @@ var validPrograms = []interface{}{
`package main; func f(func() func() func())` + "\n",
`package main; func f(...)` + "\n",
`package main; func f(float, ...int)` + "\n",
+ `package main; type T []int; var a []bool; func f() { if a[T{42}[0]] {} }` + "\n",
+ `package main; type T []int; func g(int) bool { return true }; func f() { if g(T{42}[0]) {} }` + "\n",
+ `package main; type T []int; func f() { for _ = range []int{T{42}[0]} {} }` + "\n",
}