return n
}
-func itabnamesym(t, itype *Type) *Sym {
+func itabname(t, itype *Type) *Node {
if t == nil || (Isptr[t.Etype] && t.Type == nil) || isideal(t) {
Fatalf("itabname %v", t)
}
itabs = append(itabs, itabEntry{t: t, itype: itype, sym: s})
}
- return s.Def.Sym
+
+ n := Nod(OADDR, s.Def, nil)
+ n.Type = Ptrto(s.Def.Type)
+ n.Addable = true
+ n.Ullman = 2
+ n.Typecheck = 1
+ return n
}
// isreflexive reports whether t has a reflexive equality operator.
case OCONVIFACE:
n.Left = walkexpr(n.Left, init)
- // Optimize convT2E as a two-word copy when T is pointer-shaped.
- if isnilinter(n.Type) && isdirectiface(n.Left.Type) {
- l := Nod(OEFACE, typename(n.Left.Type), n.Left)
+ // Optimize convT2E or convT2I as a two-word copy when T is pointer-shaped.
+ if isdirectiface(n.Left.Type) {
+ var t *Node
+ if isnilinter(n.Type) {
+ t = typename(n.Left.Type)
+ } else {
+ t = itabname(n.Left.Type, n.Type)
+ }
+ l := Nod(OEFACE, t, n.Left)
l.Type = n.Type
l.Typecheck = n.Typecheck
n = l
break
}
- if isdirectiface(n.Left.Type) {
- itabnamesym(n.Left.Type, n.Type)
- }
-
var ll []*Node
if !Isinter(n.Left.Type) {
ll = append(ll, typename(n.Left.Type))