// This runs *after* the condition check, so we know
// advancing the pointer is safe and won't go past the
// end of the allocation.
- tmp = nod(OADD, hp, nodintconst(t.Elem().Width))
-
- tmp.Type = hp.Type
- tmp.SetTypecheck(1)
- tmp.Right.Type = types.Types[types.Tptr]
- tmp.Right.SetTypecheck(1)
- a = nod(OAS, hp, tmp)
+ a = nod(OAS, hp, addptr(hp, t.Elem().Width))
a = typecheck(a, Etop)
n.List.Set1(a)
n = walkstmt(n)
return true
}
+
+// addptr returns (*T)(uintptr(p) + n).
+func addptr(p *Node, n int64) *Node {
+ t := p.Type
+
+ p = nod(OCONVNOP, p, nil)
+ p.Type = types.Types[TUINTPTR]
+
+ p = nod(OADD, p, nodintconst(n))
+
+ p = nod(OCONVNOP, p, nil)
+ p.Type = t
+
+ return p
+}
opAndType{OADD, TUINT16}: ssa.OpAdd16,
opAndType{OADD, TINT32}: ssa.OpAdd32,
opAndType{OADD, TUINT32}: ssa.OpAdd32,
- opAndType{OADD, TPTR32}: ssa.OpAdd32,
opAndType{OADD, TINT64}: ssa.OpAdd64,
opAndType{OADD, TUINT64}: ssa.OpAdd64,
- opAndType{OADD, TPTR64}: ssa.OpAdd64,
opAndType{OADD, TFLOAT32}: ssa.OpAdd32F,
opAndType{OADD, TFLOAT64}: ssa.OpAdd64F,