]> Cypherpunks repositories - gostls13.git/commitdiff
go/parser: resolve the type name when parsing a composite lit value
authorRob Findley <rfindley@google.com>
Tue, 23 Mar 2021 02:27:25 +0000 (22:27 -0400)
committerRobert Findley <rfindley@google.com>
Tue, 30 Mar 2021 23:55:57 +0000 (23:55 +0000)
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 <rfindley@google.com>
Run-TryBot: Robert Findley <rfindley@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
src/go/parser/parser.go
src/go/parser/testdata/resolution/issue45136.src

index b86d6bad46c4f6f7f34eb91f825ce44e5f566068..be87d3f9ee4bee38306879e1bc59996e84c428a7 100644 (file)
@@ -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
index 5e507fabe5a45bd10f7e9f9719601edaea816af8..671001f5a3b330c579ffefe1f1fc6b82708925d6 100644 (file)
@@ -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 */{}