From: Todd Neal Date: Sat, 22 Aug 2015 02:38:41 +0000 (-0500) Subject: [dev.ssa] cmd/compile/internal: mark len(map), len/cap(chan) unimplemented X-Git-Tag: go1.7beta1~1623^2^2~255 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=0ffd9c8cadae38a9334dcbb9dc7876f499deb474;p=gostls13.git [dev.ssa] cmd/compile/internal: mark len(map), len/cap(chan) unimplemented Mark these as unimplemented so we don't generate bad code. Change-Id: I101190c40a753faaa82193ac37e2978b20a96e4e Reviewed-on: https://go-review.googlesource.com/13748 Reviewed-by: Josh Bleecher Snyder --- diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index 6d3359ad0e..a7349a8f1f 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -1349,6 +1349,16 @@ func (s *state) expr(n *Node) *ssa.Value { return s.newValue1(op, Types[TINT], s.expr(n.Left)) case n.Left.Type.IsString(): // string; not reachable for OCAP return s.newValue1(ssa.OpStringLen, Types[TINT], s.expr(n.Left)) + case n.Left.Type.IsMap(): + s.Unimplementedf("unhandled len(map)") + return nil + case n.Left.Type.IsChan(): + if n.Op == OCAP { + s.Unimplementedf("unhandled cap(chan)") + } else { + s.Unimplementedf("unhandled len(chan)") + } + return nil default: // array return s.constInt(Types[TINT], n.Left.Type.Bound) } diff --git a/src/cmd/compile/internal/gc/type.go b/src/cmd/compile/internal/gc/type.go index bcad025ba6..697152bebd 100644 --- a/src/cmd/compile/internal/gc/type.go +++ b/src/cmd/compile/internal/gc/type.go @@ -64,6 +64,14 @@ func (t *Type) IsString() bool { return t.Etype == TSTRING } +func (t *Type) IsMap() bool { + return t.Etype == TMAP +} + +func (t *Type) IsChan() bool { + return t.Etype == TCHAN +} + func (t *Type) IsSlice() bool { return t.Etype == TARRAY && t.Bound < 0 }