// selinfo.Targs() are the types used to
// instantiate the type of receiver
- targs2 := selinfo.TArgs()
+ targs2 := getTargs(selinfo)
targs := make([]ir.Node, len(targs2))
for i, targ2 := range targs2 {
targs[i] = ir.TypeNode(g.typ(targ2))
return n
}
+// getTargs gets the targs associated with the receiver of a selected method
+func getTargs(selinfo *types2.Selection) []types2.Type {
+ r := selinfo.Recv()
+ if p := types2.AsPointer(r); p != nil {
+ r = p.Elem()
+ }
+ n := types2.AsNamed(r)
+ if n == nil {
+ base.Fatalf("Incorrect type for selinfo %v", selinfo)
+ }
+ return n.TArgs()
+}
+
func (g *irgen) exprList(expr syntax.Expr) []ir.Node {
switch expr := expr.(type) {
case nil:
// Recv returns the type of x in x.f.
func (s *Selection) Recv() Type { return s.recv }
-// Work-around for a compiler issue where an (*instance) escapes.
-// TODO(gri): Is this still needed?
-func (s *Selection) TArgs() []Type {
- r := s.recv
- if p := asPointer(r); p != nil {
- r = p.Elem()
- }
- if n := asNamed(r); n != nil {
- return n.TArgs()
- }
- // The base type (after skipping any pointer) must be a Named type. The
- // bug is that sometimes it can be an instance type (which is supposed to
- // be an internal type only).
- return r.(*instance).targs
-}
-
// Obj returns the object denoted by x.f; a *Var for
// a field selection, and a *Func in all other cases.
func (s *Selection) Obj() Object { return s.obj }