diff options
| author | Matthew Dempsky <mdempsky@google.com> | 2022-06-21 07:39:23 -0700 |
|---|---|---|
| committer | Matthew Dempsky <mdempsky@google.com> | 2022-06-23 21:54:41 +0000 |
| commit | a3e474f86746924022c92f66bfb465f7ad6ea8a5 (patch) | |
| tree | 530dea7d2e2ca7b19c02fe00c2f276b1e89561d7 /src/cmd/compile/internal/noder | |
| parent | 5f5422a2ddcfcec8282bc2fde0729083eeeb2926 (diff) | |
| download | go-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.go | 27 |
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) } } |
