From: Rob Findley Date: Tue, 23 Mar 2021 02:27:25 +0000 (-0400) Subject: go/parser: resolve the type name when parsing a composite lit value X-Git-Tag: go1.17beta1~915 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=c3ec79bca953627a51e5eb32adb5039d1e488997;p=gostls13.git go/parser: resolve the type name when parsing a composite lit value parsePrimaryExpr has to be careful to resolve identifiers used in composite expressions when parsing in LHS mode. It missed the literal type name. Fixes #45136 Change-Id: I3e12f91e3ef5fdb43faa436cdf1240eb3293fe1a Reviewed-on: https://go-review.googlesource.com/c/go/+/304451 Trust: Robert Findley Run-TryBot: Robert Findley TryBot-Result: Go Bot Reviewed-by: Robert Griesemer --- diff --git a/src/go/parser/parser.go b/src/go/parser/parser.go index b86d6bad46..be87d3f9ee 100644 --- a/src/go/parser/parser.go +++ b/src/go/parser/parser.go @@ -1804,6 +1804,11 @@ func (p *parser) parsePrimaryExpr(lhs bool) (x ast.Expr) { p.error(t.Pos(), "cannot parenthesize type in composite literal") // already progressed, no need to advance } + if lhs { + // An error has already been reported above, but try to resolve the 'T' + // in (T){...} anyway. + p.resolve(t) + } x = p.parseLiteralValue(x) default: return diff --git a/src/go/parser/testdata/resolution/issue45136.src b/src/go/parser/testdata/resolution/issue45136.src index 5e507fabe5..671001f5a3 100644 --- a/src/go/parser/testdata/resolution/issue45136.src +++ b/src/go/parser/testdata/resolution/issue45136.src @@ -12,17 +12,15 @@ func _ /* =@blank */ () { var foo /* =@foo */ = "foo" obj /* @obj */ ["foo"] obj /* @obj */ .run() - - // TODO(#45136): the next two statements are missing objects. - obj{ + obj /* @obj */ { name: foo /* @foo */, } - obj{ + obj /* @obj */ { name: "bar", }.run() - var _ /* @=blank4 */ = File{key: obj /* @obj */{}} - var _ /* @=blank3 */ = File{obj{}} + var _ /* @=blank4 */ = File{key: obj /* @obj */ {}} + var _ /* @=blank3 */ = File{obj /* @obj */ {}} []obj /* @obj */ {foo /* @foo */} x /* =@x1 */ := obj /* @obj */{}