aboutsummaryrefslogtreecommitdiff
path: root/src/cmd
diff options
context:
space:
mode:
authorRobert Griesemer <gri@google.com>2026-03-16 14:01:37 -0700
committerGopher Robot <gobot@golang.org>2026-03-19 17:16:38 -0700
commit30bfe53dd7485e211247a6d5c2f29a6aea0719a9 (patch)
treeb278c0e91629d25820f59316cefb8ba254c4a64e /src/cmd
parent9ec1d8f335bb76a07e9724fb332a4c2572d0fc3b (diff)
downloadgo-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.go4
-rw-r--r--src/cmd/compile/internal/typecheck/expr.go18
-rw-r--r--src/cmd/compile/internal/walk/complit.go2
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())