diff options
| author | Robert Griesemer <gri@google.com> | 2026-03-16 14:01:37 -0700 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2026-03-19 17:16:38 -0700 |
| commit | 30bfe53dd7485e211247a6d5c2f29a6aea0719a9 (patch) | |
| tree | b278c0e91629d25820f59316cefb8ba254c4a64e /src/cmd | |
| parent | 9ec1d8f335bb76a07e9724fb332a4c2572d0fc3b (diff) | |
| download | go-30bfe53dd7485e211247a6d5c2f29a6aea0719a9.tar.xz | |
cmd/compile: enable promoted field selectors as keys in struct literals
Switch the generated UIR version from V2 to V3.
Adjust cmd/compile/internal/types to accept promoted field selectors
in composite literals.
Fixes #9859.
Change-Id: Ie314e28567cfa6cf4c9e962a07b32dd05b06bf5e
Reviewed-on: https://go-review.googlesource.com/c/go/+/755740
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: Robert Griesemer <gri@google.com>
Reviewed-by: Mark Freeman <markfreeman@google.com>
Reviewed-by: Keith Randall <khr@golang.org>
Diffstat (limited to 'src/cmd')
| -rw-r--r-- | src/cmd/compile/internal/noder/unified.go | 4 | ||||
| -rw-r--r-- | src/cmd/compile/internal/typecheck/expr.go | 18 | ||||
| -rw-r--r-- | src/cmd/compile/internal/walk/complit.go | 2 |
3 files changed, 18 insertions, 6 deletions
diff --git a/src/cmd/compile/internal/noder/unified.go b/src/cmd/compile/internal/noder/unified.go index 6cb52fb31b..14f19e3d1f 100644 --- a/src/cmd/compile/internal/noder/unified.go +++ b/src/cmd/compile/internal/noder/unified.go @@ -25,8 +25,8 @@ import ( ) // uirVersion is the unified IR version to use for encoding/decoding. -// Use V2 as the encoded version for aliastypeparams. -const uirVersion = pkgbits.V2 +// Use V3 for promoted struct field support in composite literals. +const uirVersion = pkgbits.V3 // localPkgReader holds the package reader used for reading the local // package. It exists so the unified IR linker can refer back to it diff --git a/src/cmd/compile/internal/typecheck/expr.go b/src/cmd/compile/internal/typecheck/expr.go index 53c291291f..10b7c82353 100644 --- a/src/cmd/compile/internal/typecheck/expr.go +++ b/src/cmd/compile/internal/typecheck/expr.go @@ -312,6 +312,19 @@ func tcStructLitKey(typ *types.Type, kv *ir.KeyExpr) *ir.StructKeyExpr { return ir.NewStructKeyExpr(kv.Pos(), f, kv.Value) } + var f *types.Field + if p, ambig := dotpath(sym, typ, &f, false); p != nil { + if ambig { + base.Errorf("ambiguous promoted field '%v' in struct literal of type %v", sym, typ) + return nil + } + if f.IsMethod() { + base.Errorf("cannot use method '%v' in struct literal of type %v", sym, typ) + return nil + } + return ir.NewStructKeyExpr(kv.Pos(), f, kv.Value) + } + if ci := Lookdot1(nil, sym, typ, typ.Fields(), 2); ci != nil { // Case-insensitive lookup. if visible(ci.Sym) { base.Errorf("unknown field '%v' in struct literal of type %v (but does have %v)", sym, typ, ci.Sym) @@ -323,7 +336,6 @@ func tcStructLitKey(typ *types.Type, kv *ir.KeyExpr) *ir.StructKeyExpr { return nil } - var f *types.Field p, _ := dotpath(sym, typ, &f, true) if p == nil || f.IsMethod() { base.Errorf("unknown field '%v' in struct literal of type %v", sym, typ) @@ -335,8 +347,8 @@ func tcStructLitKey(typ *types.Type, kv *ir.KeyExpr) *ir.StructKeyExpr { for ei := len(p) - 1; ei >= 0; ei-- { ep = append(ep, p[ei].field.Sym.Name) } - ep = append(ep, sym.Name) - base.Errorf("cannot use promoted field %v in struct literal of type %v", strings.Join(ep, "."), typ) + ep = append(ep, f.Sym.Name) + base.Errorf("unknown field '%v' in struct literal of type %v (but does have %v)", sym, typ, strings.Join(ep, ".")) return nil } diff --git a/src/cmd/compile/internal/walk/complit.go b/src/cmd/compile/internal/walk/complit.go index cfb78f2ade..053b124a91 100644 --- a/src/cmd/compile/internal/walk/complit.go +++ b/src/cmd/compile/internal/walk/complit.go @@ -226,7 +226,7 @@ func fixedlit(ctxt initContext, kind initKind, n *ir.CompLitExpr, var_ ir.Node, return ir.BlankNode, r.Value } ir.SetPos(r) - return ir.NewSelectorExpr(base.Pos, ir.ODOT, var_, r.Sym()), r.Value + return ir.NewSelectorExpr(base.Pos, ir.OXDOT, var_, r.Sym()), r.Value } default: base.Fatalf("fixedlit bad op: %v", n.Op()) |
