aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/noder
diff options
context:
space:
mode:
authorMatthew Dempsky <mdempsky@google.com>2022-06-21 07:39:23 -0700
committerMatthew Dempsky <mdempsky@google.com>2022-06-23 21:54:41 +0000
commita3e474f86746924022c92f66bfb465f7ad6ea8a5 (patch)
tree530dea7d2e2ca7b19c02fe00c2f276b1e89561d7 /src/cmd/compile/internal/noder
parent5f5422a2ddcfcec8282bc2fde0729083eeeb2926 (diff)
downloadgo-a3e474f86746924022c92f66bfb465f7ad6ea8a5.tar.xz
[dev.unified] cmd/compile/internal/noder: implicit conversions for complits
Operands within a composite literal must be implicitly converted to their respective key/element type. Change-Id: Idc12eba1559e9c9ffebd03395cd91473dd5fc2db Reviewed-on: https://go-review.googlesource.com/c/go/+/413364 Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: David Chase <drchase@google.com> Reviewed-by: Keith Randall <khr@golang.org>
Diffstat (limited to 'src/cmd/compile/internal/noder')
-rw-r--r--src/cmd/compile/internal/noder/writer.go27
1 files changed, 21 insertions, 6 deletions
diff --git a/src/cmd/compile/internal/noder/writer.go b/src/cmd/compile/internal/noder/writer.go
index 77a40e526a..e2d2aba072 100644
--- a/src/cmd/compile/internal/noder/writer.go
+++ b/src/cmd/compile/internal/noder/writer.go
@@ -1574,30 +1574,45 @@ func (w *writer) compLit(lit *syntax.CompositeLit) {
if ptr, ok := types2.CoreType(typ).(*types2.Pointer); ok {
typ = ptr.Elem()
}
- str, isStruct := types2.CoreType(typ).(*types2.Struct)
+ var keyType, elemType types2.Type
+ var structType *types2.Struct
+ switch typ := types2.CoreType(typ).(type) {
+ default:
+ w.p.fatalf(lit, "unexpected composite literal type: %v", typ)
+ case *types2.Array:
+ elemType = typ.Elem()
+ case *types2.Map:
+ keyType, elemType = typ.Key(), typ.Elem()
+ case *types2.Slice:
+ elemType = typ.Elem()
+ case *types2.Struct:
+ structType = typ
+ }
w.Len(len(lit.ElemList))
for i, elem := range lit.ElemList {
- if isStruct {
+ elemType := elemType
+ if structType != nil {
if kv, ok := elem.(*syntax.KeyValueExpr); ok {
// use position of expr.Key rather than of elem (which has position of ':')
w.pos(kv.Key)
- w.Len(fieldIndex(w.p.info, str, kv.Key.(*syntax.Name)))
+ i = fieldIndex(w.p.info, structType, kv.Key.(*syntax.Name))
elem = kv.Value
} else {
w.pos(elem)
- w.Len(i)
}
+ elemType = structType.Field(i).Type()
+ w.Len(i)
} else {
if kv, ok := elem.(*syntax.KeyValueExpr); w.Bool(ok) {
// use position of expr.Key rather than of elem (which has position of ':')
w.pos(kv.Key)
- w.expr(kv.Key) // TODO(mdempsky): Implicit conversion to (map) key type.
+ w.implicitExpr(kv.Key, keyType, kv.Key)
elem = kv.Value
}
}
w.pos(elem)
- w.expr(elem) // TODO(mdempsky): Implicit conversion to element type.
+ w.implicitExpr(elem, elemType, elem)
}
}