cmd/compile/internal/ir: prune down possible Ntype nodes

Ident, ParenExpr, SelectorExpr, and StarExpr used to need to be
allowed as Ntypes for the old -G=0 type checker to represent some type
expressions before type checking, but now they're only ever used to
represent value expressions.

Change-Id: Idd4901ae6149ecc81acf1c52de3bc914d9e73418
Reviewed-on: https://go-review.googlesource.com/c/go/+/403844
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: David Chase <drchase@google.com>
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
This commit is contained in:
Matthew Dempsky 2022-05-03 12:58:54 -07:00
parent 3abe8fe00b
commit cf66a82b0b
3 changed files with 4 additions and 31 deletions

View File

@ -439,16 +439,6 @@ func NewParenExpr(pos src.XPos, x Node) *ParenExpr {
func (n *ParenExpr) Implicit() bool { return n.flags&miniExprImplicit != 0 } func (n *ParenExpr) Implicit() bool { return n.flags&miniExprImplicit != 0 }
func (n *ParenExpr) SetImplicit(b bool) { n.flags.set(miniExprImplicit, b) } func (n *ParenExpr) SetImplicit(b bool) { n.flags.set(miniExprImplicit, b) }
func (*ParenExpr) CanBeNtype() {}
// SetOTYPE changes n to be an OTYPE node returning t,
// like all the type nodes in type.go.
func (n *ParenExpr) SetOTYPE(t *types.Type) {
n.op = OTYPE
n.typ = t
t.SetNod(n)
}
// A RawOrigExpr represents an arbitrary Go expression as a string value. // A RawOrigExpr represents an arbitrary Go expression as a string value.
// When printed in diagnostics, the string value is written out exactly as-is. // When printed in diagnostics, the string value is written out exactly as-is.
type RawOrigExpr struct { type RawOrigExpr struct {
@ -558,10 +548,6 @@ func (n *SelectorExpr) FuncName() *Name {
return fn return fn
} }
// Before type-checking, bytes.Buffer is a SelectorExpr.
// After type-checking it becomes a Name.
func (*SelectorExpr) CanBeNtype() {}
// A SliceExpr is a slice expression X[Low:High] or X[Low:High:Max]. // A SliceExpr is a slice expression X[Low:High] or X[Low:High:Max].
type SliceExpr struct { type SliceExpr struct {
miniExpr miniExpr
@ -633,17 +619,6 @@ func NewStarExpr(pos src.XPos, x Node) *StarExpr {
func (n *StarExpr) Implicit() bool { return n.flags&miniExprImplicit != 0 } func (n *StarExpr) Implicit() bool { return n.flags&miniExprImplicit != 0 }
func (n *StarExpr) SetImplicit(b bool) { n.flags.set(miniExprImplicit, b) } func (n *StarExpr) SetImplicit(b bool) { n.flags.set(miniExprImplicit, b) }
func (*StarExpr) CanBeNtype() {}
// SetOTYPE changes n to be an OTYPE node returning t,
// like all the type nodes in type.go.
func (n *StarExpr) SetOTYPE(t *types.Type) {
n.op = OTYPE
n.X = nil
n.typ = t
t.SetNod(n)
}
// A TypeAssertionExpr is a selector expression X.(Type). // A TypeAssertionExpr is a selector expression X.(Type).
// Before type-checking, the type is Ntype. // Before type-checking, the type is Ntype.
type TypeAssertExpr struct { type TypeAssertExpr struct {

View File

@ -31,8 +31,6 @@ func NewIdent(pos src.XPos, sym *types.Sym) *Ident {
func (n *Ident) Sym() *types.Sym { return n.sym } func (n *Ident) Sym() *types.Sym { return n.sym }
func (*Ident) CanBeNtype() {}
// Name holds Node fields used only by named nodes (ONAME, OTYPE, some OLITERAL). // Name holds Node fields used only by named nodes (ONAME, OTYPE, some OLITERAL).
type Name struct { type Name struct {
miniExpr miniExpr

View File

@ -821,11 +821,11 @@ func tcStar(n *ir.StarExpr, top int) ir.Node {
n.SetType(nil) n.SetType(nil)
return n return n
} }
// TODO(mdempsky): Remove (along with ctxType above) once I'm
// confident this code path isn't needed any more.
if l.Op() == ir.OTYPE { if l.Op() == ir.OTYPE {
n.SetOTYPE(types.NewPtr(l.Type())) base.Fatalf("unexpected type in deref expression: %v", l)
// Ensure l.Type gets CalcSize'd for the backend. Issue 20174.
types.CheckSize(l.Type())
return n
} }
if !t.IsPtr() { if !t.IsPtr() {