miniExpr
origNode
List Nodes // initialized values
+ RType Node `mknode:"-"` // *runtime._type for OMAPLIT map types
Prealloc *Name
// For OSLICELIT, Len is the backing array length.
// For OMAPLIT, Len is the number of entries that we've removed from List and
}
lit := typecheck.Expr(ir.NewCompLitExpr(pos, ir.OCOMPLIT, typ, elems))
+ switch lit.Op() {
+ case ir.OMAPLIT:
+ lit := lit.(*ir.CompLitExpr)
+ lit.RType = reflectdata.TypePtrAt(pos, typ)
+ }
if typ0.IsPtr() {
lit = typecheck.Expr(typecheck.NodAddrAt(pos, lit))
lit.SetType(typ0)
// map type.
func IndexMapRType(pos src.XPos, n *ir.IndexExpr) ir.Node {
assertOp(n, ir.OINDEXMAP)
- // TODO(mdempsky): Need to propagate RType from OMAPLIT nodes to
- // emitted OINDEXMAP nodes.
- if haveRType(n, n.RType, "RType", false) {
+ if haveRType(n, n.RType, "RType", true) {
return n.RType
}
return mapRType(pos, n.X.Type())
// representing that map type.
func MakeMapRType(pos src.XPos, n *ir.MakeExpr) ir.Node {
assertOp(n, ir.OMAKEMAP)
- // TODO(mdempsky): Need to propagate RType from OMAPLIT nodes to
- // emitted OMAKEMAP nodes.
- if haveRType(n, n.RType, "RType", false) {
+ if haveRType(n, n.RType, "RType", true) {
return n.RType
}
return mapRType(pos, n.Type())
// make the map var
args := []ir.Node{ir.TypeNode(n.Type()), ir.NewInt(n.Len + int64(len(n.List)))}
a := typecheck.Expr(ir.NewCallExpr(base.Pos, ir.OMAKE, nil, args)).(*ir.MakeExpr)
+ a.RType = n.RType
a.SetEsc(n.Esc())
appendWalkStmt(init, ir.NewAssignStmt(base.Pos, m, a))
// typechecker rewrites OINDEX to OINDEXMAP
lhs := typecheck.AssignExpr(ir.NewIndexExpr(base.Pos, m, kidx)).(*ir.IndexExpr)
base.AssertfAt(lhs.Op() == ir.OINDEXMAP, lhs.Pos(), "want OINDEXMAP, have %+v", lhs)
+ lhs.RType = n.RType
zero := ir.NewAssignStmt(base.Pos, i, ir.NewInt(0))
cond := ir.NewBinaryExpr(base.Pos, ir.OLT, i, ir.NewInt(tk.NumElem()))
// typechecker rewrites OINDEX to OINDEXMAP
lhs := typecheck.AssignExpr(ir.NewIndexExpr(base.Pos, m, tmpkey)).(*ir.IndexExpr)
base.AssertfAt(lhs.Op() == ir.OINDEXMAP, lhs.Pos(), "want OINDEXMAP, have %+v", lhs)
+ lhs.RType = n.RType
var a ir.Node = ir.NewAssignStmt(base.Pos, lhs, tmpelem)
a = typecheck.Stmt(a)
for _, r := range dynamics {
lhs := typecheck.AssignExpr(ir.NewIndexExpr(base.Pos, m, r.Key)).(*ir.IndexExpr)
base.AssertfAt(lhs.Op() == ir.OINDEXMAP, lhs.Pos(), "want OINDEXMAP, have %+v", lhs)
+ lhs.RType = n.RType
as := ir.NewAssignStmt(base.Pos, lhs, r.Value)
typecheck.Stmt(as)