// The function, method, or closure in which local variable or param is declared.
Curfn *Func
- // Unique number for OTYPE names within a function.
- // TODO(mdempsky): Remove completely.
- Typegen int32
-
Ntype Ntype
Heapaddr *Name // temp holding heap address of param
_64bit uintptr // size on 64bit platforms
}{
{Func{}, 184, 320},
- {Name{}, 120, 216},
+ {Name{}, 116, 208},
}
for _, tt := range tests {
if ir.CurFunc != nil && ctxt != ir.PFUNC && n.Op() == ir.ONAME {
ir.CurFunc.Dcl = append(ir.CurFunc.Dcl, n)
}
- if n.Op() == ir.OTYPE {
- declare_typegen++
- n.Typegen = int32(declare_typegen)
- }
types.Pushdcl(s)
n.Curfn = ir.CurFunc
}
}
}
-// declare individual names - var, typ, const
-
-var declare_typegen int
-
func fakeRecvField() *types.Field {
return types.NewField(src.NoXPos, nil, types.FakeRecvType())
}
mapqueue = nil
}
+// typegen tracks the number of function-scoped defined types that
+// have been declared. It's used to generate unique linker symbols for
+// their runtime type descriptors.
+var typegen int32
+
func typecheckdeftype(n *ir.Name) {
if base.EnableTrace && base.Flag.LowerT {
defer tracePrint("typecheckdeftype", n)(nil)
}
t := types.NewNamed(n)
- t.Vargen = n.Typegen
+ if n.Curfn != nil {
+ typegen++
+ t.Vargen = typegen
+ }
+
if n.Pragma()&ir.NotInHeap != 0 {
t.SetNotInHeap(true)
}