It is always used with global variables, so we can skip analyze it, the
same as what we are doing for ONAME/PEXTERN nodes.
While at it, add a Fatalf check to ensure NewNameOffsetExpr is only
called for global variables.
For #43737
Change-Id: Iac444ed8d583baba5042bea096531301843b1e8f
Reviewed-on: https://go-review.googlesource.com/c/go/+/284118
Trust: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
default:
base.Fatalf("unexpected expr: %v", n)
- case ir.OLITERAL, ir.ONIL, ir.OGETG, ir.OTYPE, ir.OMETHEXPR:
+ case ir.OLITERAL, ir.ONIL, ir.OGETG, ir.OTYPE, ir.OMETHEXPR, ir.ONAMEOFFSET:
// nop
case ir.ONAME:
}
e.flow(k, e.oldLoc(n))
- case ir.ONAMEOFFSET:
- n := n.(*ir.NameOffsetExpr)
- e.expr(k, n.Name_)
-
case ir.OPLUS, ir.ONEG, ir.OBITNOT, ir.ONOT:
n := n.(*ir.UnaryExpr)
e.discard(n.X)
}
k = e.oldLoc(n).asHole()
case ir.ONAMEOFFSET:
- n := n.(*ir.NameOffsetExpr)
- k = e.addr(n.Name_)
+ break
case ir.ODOT:
n := n.(*ir.SelectorExpr)
k = e.addr(n.X)
}
func NewNameOffsetExpr(pos src.XPos, name *Name, offset int64, typ *types.Type) *NameOffsetExpr {
- if name == nil || IsBlank(name) {
- base.FatalfAt(pos, "cannot take offset of nil or blank name: %v", name)
+ if name == nil || IsBlank(name) || !(name.Op() == ONAME && name.Class == PEXTERN) {
+ base.FatalfAt(pos, "cannot take offset of nil, blank name or non-global variable: %v", name)
}
n := &NameOffsetExpr{Name_: name, Offset_: offset}
n.typ = typ