mirror of
https://github.com/golang/go
synced 2024-11-22 19:24:59 -07:00
[dev.regabi] cmd/compile: limit Implicit method to nodes where it is defined
The general concept of an "implicit" operation is provided by every expr representation, but it really only makes sense for a few of them, and worse the exact definition of what "implicit" means differs from node to node. This CL moves the method to each node implementation, although they all share the same header bit instead of each defining a bool field that would turn into 8 bytes on 64-bit systems. Now we can say precisely which Nodes have a meaningful Implicit method: AddrExpr, CompLitExpr, ConvExpr, ParenExpr, and StarExpr. Passes buildall w/ toolstash -cmp. Change-Id: I7d85cb0507a514cdcb6eed21347f362e5fb57a91 Reviewed-on: https://go-review.googlesource.com/c/go/+/277918 Trust: Russ Cox <rsc@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
parent
7fde0d2b50
commit
f6d2834f8f
@ -52,10 +52,10 @@ type miniExpr struct {
|
||||
|
||||
const (
|
||||
miniExprHasCall = 1 << iota
|
||||
miniExprImplicit
|
||||
miniExprNonNil
|
||||
miniExprTransient
|
||||
miniExprBounded
|
||||
miniExprImplicit // for use by implementations; not supported by every Expr
|
||||
)
|
||||
|
||||
func (*miniExpr) isExpr() {}
|
||||
@ -66,8 +66,6 @@ func (n *miniExpr) Opt() interface{} { return n.opt }
|
||||
func (n *miniExpr) SetOpt(x interface{}) { n.opt = x }
|
||||
func (n *miniExpr) HasCall() bool { return n.flags&miniExprHasCall != 0 }
|
||||
func (n *miniExpr) SetHasCall(b bool) { n.flags.set(miniExprHasCall, b) }
|
||||
func (n *miniExpr) Implicit() bool { return n.flags&miniExprImplicit != 0 }
|
||||
func (n *miniExpr) SetImplicit(b bool) { n.flags.set(miniExprImplicit, b) }
|
||||
func (n *miniExpr) NonNil() bool { return n.flags&miniExprNonNil != 0 }
|
||||
func (n *miniExpr) MarkNonNil() { n.flags |= miniExprNonNil }
|
||||
func (n *miniExpr) Transient() bool { return n.flags&miniExprTransient != 0 }
|
||||
@ -125,6 +123,8 @@ func (n *AddrExpr) Left() Node { return n.X }
|
||||
func (n *AddrExpr) SetLeft(x Node) { n.X = x }
|
||||
func (n *AddrExpr) Right() Node { return n.Alloc }
|
||||
func (n *AddrExpr) SetRight(x Node) { n.Alloc = x }
|
||||
func (n *AddrExpr) Implicit() bool { return n.flags&miniExprImplicit != 0 }
|
||||
func (n *AddrExpr) SetImplicit(b bool) { n.flags.set(miniExprImplicit, b) }
|
||||
|
||||
func (n *AddrExpr) SetOp(op Op) {
|
||||
switch op {
|
||||
@ -308,6 +308,8 @@ func (n *CompLitExpr) SetRight(x Node) { n.Ntype = toNtype(x) }
|
||||
func (n *CompLitExpr) List() Nodes { return n.List_ }
|
||||
func (n *CompLitExpr) PtrList() *Nodes { return &n.List_ }
|
||||
func (n *CompLitExpr) SetList(x Nodes) { n.List_ = x }
|
||||
func (n *CompLitExpr) Implicit() bool { return n.flags&miniExprImplicit != 0 }
|
||||
func (n *CompLitExpr) SetImplicit(b bool) { n.flags.set(miniExprImplicit, b) }
|
||||
|
||||
func (n *CompLitExpr) SetOp(op Op) {
|
||||
switch op {
|
||||
@ -356,6 +358,8 @@ func NewConvExpr(pos src.XPos, op Op, typ *types.Type, x Node) *ConvExpr {
|
||||
|
||||
func (n *ConvExpr) Left() Node { return n.X }
|
||||
func (n *ConvExpr) SetLeft(x Node) { n.X = x }
|
||||
func (n *ConvExpr) Implicit() bool { return n.flags&miniExprImplicit != 0 }
|
||||
func (n *ConvExpr) SetImplicit(b bool) { n.flags.set(miniExprImplicit, b) }
|
||||
|
||||
func (n *ConvExpr) SetOp(op Op) {
|
||||
switch op {
|
||||
@ -585,6 +589,8 @@ func NewParenExpr(pos src.XPos, x Node) *ParenExpr {
|
||||
|
||||
func (n *ParenExpr) Left() Node { return n.X }
|
||||
func (n *ParenExpr) SetLeft(x Node) { n.X = x }
|
||||
func (n *ParenExpr) Implicit() bool { return n.flags&miniExprImplicit != 0 }
|
||||
func (n *ParenExpr) SetImplicit(b bool) { n.flags.set(miniExprImplicit, b) }
|
||||
|
||||
func (*ParenExpr) CanBeNtype() {}
|
||||
|
||||
@ -645,6 +651,8 @@ func (n *SelectorExpr) Sym() *types.Sym { return n.Sel }
|
||||
func (n *SelectorExpr) SetSym(x *types.Sym) { n.Sel = x }
|
||||
func (n *SelectorExpr) Offset() int64 { return n.Offset_ }
|
||||
func (n *SelectorExpr) SetOffset(x int64) { n.Offset_ = x }
|
||||
func (n *SelectorExpr) Implicit() bool { return n.flags&miniExprImplicit != 0 }
|
||||
func (n *SelectorExpr) SetImplicit(b bool) { n.flags.set(miniExprImplicit, b) }
|
||||
|
||||
// Before type-checking, bytes.Buffer is a SelectorExpr.
|
||||
// After type-checking it becomes a Name.
|
||||
@ -785,6 +793,8 @@ func NewStarExpr(pos src.XPos, x Node) *StarExpr {
|
||||
|
||||
func (n *StarExpr) Left() Node { return n.X }
|
||||
func (n *StarExpr) SetLeft(x Node) { n.X = x }
|
||||
func (n *StarExpr) Implicit() bool { return n.flags&miniExprImplicit != 0 }
|
||||
func (n *StarExpr) SetImplicit(b bool) { n.flags.set(miniExprImplicit, b) }
|
||||
|
||||
func (*StarExpr) CanBeNtype() {}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user