[dev.regabi] cmd/compile: first pass at abstracting Type

Passes toolstash/buildall.

[git-generate]
cd src/cmd/compile/internal/ssa
rf '
ex . ../ir ../gc {
  import "cmd/compile/internal/types"
  var t *types.Type
  t.Etype -> t.Kind()
  t.Sym -> t.GetSym()
  t.Orig -> t.Underlying()
}
'

cd ../types
rf '
mv EType Kind
mv IRNode Object

mv Type.Etype Type.kind
mv Type.Sym Type.sym
mv Type.Orig Type.underlying
mv Type.Cache Type.cache

mv Type.GetSym Type.Sym

mv Bytetype ByteType
mv Runetype RuneType
mv Errortype ErrorType
'

cd ../gc
sed -i 's/Bytetype/ByteType/; s/Runetype/RuneType/' mkbuiltin.go

git codereview gofmt
go install cmd/compile/internal/...
go test cmd/compile -u || go test cmd/compile

Change-Id: Ibecb2d7100d3318a49238eb4a78d70acb49eedca
Reviewed-on: https://go-review.googlesource.com/c/go/+/274437
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Russ Cox <rsc@golang.org>
Trust: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
Matthew Dempsky 2020-12-01 03:25:29 -08:00
parent 6ca23a45fe
commit 5ffa275f3c
36 changed files with 398 additions and 398 deletions

View File

@ -127,10 +127,10 @@ var knownFormats = map[string]string{
"cmd/compile/internal/syntax.position %s": "", "cmd/compile/internal/syntax.position %s": "",
"cmd/compile/internal/syntax.token %q": "", "cmd/compile/internal/syntax.token %q": "",
"cmd/compile/internal/syntax.token %s": "", "cmd/compile/internal/syntax.token %s": "",
"cmd/compile/internal/types.EType %d": "", "cmd/compile/internal/types.Kind %d": "",
"cmd/compile/internal/types.EType %s": "", "cmd/compile/internal/types.Kind %s": "",
"cmd/compile/internal/types.EType %v": "", "cmd/compile/internal/types.Kind %v": "",
"cmd/compile/internal/types.IRNode %v": "", "cmd/compile/internal/types.Object %v": "",
"cmd/internal/obj.ABI %v": "", "cmd/internal/obj.ABI %v": "",
"error %v": "", "error %v": "",
"float64 %.2f": "", "float64 %.2f": "",

View File

@ -68,7 +68,7 @@ func IncomparableField(t *types.Type) *types.Field {
// EqCanPanic reports whether == on type t could panic (has an interface somewhere). // EqCanPanic reports whether == on type t could panic (has an interface somewhere).
// t must be comparable. // t must be comparable.
func EqCanPanic(t *types.Type) bool { func EqCanPanic(t *types.Type) bool {
switch t.Etype { switch t.Kind() {
default: default:
return false return false
case types.TINTER: case types.TINTER:
@ -120,7 +120,7 @@ func algtype1(t *types.Type) (AlgKind, *types.Type) {
return ANOEQ, t return ANOEQ, t
} }
switch t.Etype { switch t.Kind() {
case types.TANY, types.TFORW: case types.TANY, types.TFORW:
// will be defined later. // will be defined later.
return ANOEQ, t return ANOEQ, t
@ -274,7 +274,7 @@ func genhash(t *types.Type) *obj.LSym {
// (And the closure generated by genhash will also get // (And the closure generated by genhash will also get
// dead-code eliminated, as we call the subtype hashers // dead-code eliminated, as we call the subtype hashers
// directly.) // directly.)
switch t.Etype { switch t.Kind() {
case types.TARRAY: case types.TARRAY:
genhash(t.Elem()) genhash(t.Elem())
case types.TSTRUCT: case types.TSTRUCT:
@ -303,7 +303,7 @@ func genhash(t *types.Type) *obj.LSym {
np := ir.AsNode(tfn.Type().Params().Field(0).Nname) np := ir.AsNode(tfn.Type().Params().Field(0).Nname)
nh := ir.AsNode(tfn.Type().Params().Field(1).Nname) nh := ir.AsNode(tfn.Type().Params().Field(1).Nname)
switch t.Etype { switch t.Kind() {
case types.TARRAY: case types.TARRAY:
// An array of pure memory would be handled by the // An array of pure memory would be handled by the
// standard algorithm, so the element type must not be // standard algorithm, so the element type must not be
@ -536,7 +536,7 @@ func geneq(t *types.Type) *obj.LSym {
// We reach here only for types that have equality but // We reach here only for types that have equality but
// cannot be handled by the standard algorithms, // cannot be handled by the standard algorithms,
// so t must be either an array or a struct. // so t must be either an array or a struct.
switch t.Etype { switch t.Kind() {
default: default:
base.Fatalf("geneq %v", t) base.Fatalf("geneq %v", t)
@ -613,7 +613,7 @@ func geneq(t *types.Type) *obj.LSym {
} }
} }
switch t.Elem().Etype { switch t.Elem().Kind() {
case types.TSTRING: case types.TSTRING:
// Do two loops. First, check that all the lengths match (cheap). // Do two loops. First, check that all the lengths match (cheap).
// Second, check that all the contents match (expensive). // Second, check that all the contents match (expensive).

View File

@ -185,7 +185,7 @@ func findTypeLoop(t *types.Type, path *[]*types.Type) bool {
// We implement a simple DFS loop-finding algorithm. This // We implement a simple DFS loop-finding algorithm. This
// could be faster, but type cycles are rare. // could be faster, but type cycles are rare.
if t.Sym != nil { if t.Sym() != nil {
// Declared type. Check for loops and otherwise // Declared type. Check for loops and otherwise
// recurse on the type expression used in the type // recurse on the type expression used in the type
// declaration. // declaration.
@ -193,7 +193,7 @@ func findTypeLoop(t *types.Type, path *[]*types.Type) bool {
// Type imported from package, so it can't be part of // Type imported from package, so it can't be part of
// a type loop (otherwise that package should have // a type loop (otherwise that package should have
// failed to compile). // failed to compile).
if t.Sym.Pkg != ir.LocalPkg { if t.Sym().Pkg != ir.LocalPkg {
return false return false
} }
@ -212,7 +212,7 @@ func findTypeLoop(t *types.Type, path *[]*types.Type) bool {
} else { } else {
// Anonymous type. Recurse on contained types. // Anonymous type. Recurse on contained types.
switch t.Etype { switch t.Kind() {
case types.TARRAY: case types.TARRAY:
if findTypeLoop(t.Elem(), path) { if findTypeLoop(t.Elem(), path) {
return true return true
@ -321,15 +321,15 @@ func dowidth(t *types.Type) {
t.Width = -2 t.Width = -2
t.Align = 0 // 0 means use t.Width, below t.Align = 0 // 0 means use t.Width, below
et := t.Etype et := t.Kind()
switch et { switch et {
case types.TFUNC, types.TCHAN, types.TMAP, types.TSTRING: case types.TFUNC, types.TCHAN, types.TMAP, types.TSTRING:
break break
// simtype == 0 during bootstrap // simtype == 0 during bootstrap
default: default:
if simtype[t.Etype] != 0 { if simtype[t.Kind()] != 0 {
et = simtype[t.Etype] et = simtype[t.Kind()]
} }
} }

View File

@ -35,7 +35,7 @@ func (p *exporter) markType(t *types.Type) {
// only their unexpanded method set (i.e., exclusive of // only their unexpanded method set (i.e., exclusive of
// interface embeddings), and the switch statement below // interface embeddings), and the switch statement below
// handles their full method set. // handles their full method set.
if t.Sym != nil && t.Etype != types.TINTER { if t.Sym() != nil && t.Kind() != types.TINTER {
for _, m := range t.Methods().Slice() { for _, m := range t.Methods().Slice() {
if types.IsExported(m.Sym.Name) { if types.IsExported(m.Sym.Name) {
p.markObject(ir.AsNode(m.Nname)) p.markObject(ir.AsNode(m.Nname))
@ -52,7 +52,7 @@ func (p *exporter) markType(t *types.Type) {
// Notably, we don't mark function parameter types, because // Notably, we don't mark function parameter types, because
// the user already needs some way to construct values of // the user already needs some way to construct values of
// those types. // those types.
switch t.Etype { switch t.Kind() {
case types.TPTR, types.TARRAY, types.TSLICE: case types.TPTR, types.TARRAY, types.TSLICE:
p.markType(t.Elem()) p.markType(t.Elem())
@ -153,11 +153,11 @@ func predeclared() []*types.Type {
types.Types[types.TSTRING], types.Types[types.TSTRING],
// basic type aliases // basic type aliases
types.Bytetype, types.ByteType,
types.Runetype, types.RuneType,
// error // error
types.Errortype, types.ErrorType,
// untyped types // untyped types
types.UntypedBool, types.UntypedBool,

View File

@ -206,7 +206,7 @@ var runtimeDecls = [...]struct {
func runtimeTypes() []*types.Type { func runtimeTypes() []*types.Type {
var typs [131]*types.Type var typs [131]*types.Type
typs[0] = types.Bytetype typs[0] = types.ByteType
typs[1] = types.NewPtr(typs[0]) typs[1] = types.NewPtr(typs[0])
typs[2] = types.Types[types.TANY] typs[2] = types.Types[types.TANY]
typs[3] = types.NewPtr(typs[2]) typs[3] = types.NewPtr(typs[2])
@ -252,7 +252,7 @@ func runtimeTypes() []*types.Type {
typs[43] = functype(nil, []*ir.Field{anonfield(typs[42]), anonfield(typs[22])}, []*ir.Field{anonfield(typs[28])}) typs[43] = functype(nil, []*ir.Field{anonfield(typs[42]), anonfield(typs[22])}, []*ir.Field{anonfield(typs[28])})
typs[44] = functype(nil, []*ir.Field{anonfield(typs[33]), anonfield(typs[1]), anonfield(typs[15])}, []*ir.Field{anonfield(typs[28])}) typs[44] = functype(nil, []*ir.Field{anonfield(typs[33]), anonfield(typs[1]), anonfield(typs[15])}, []*ir.Field{anonfield(typs[28])})
typs[45] = functype(nil, []*ir.Field{anonfield(typs[1]), anonfield(typs[15])}, []*ir.Field{anonfield(typs[28])}) typs[45] = functype(nil, []*ir.Field{anonfield(typs[1]), anonfield(typs[15])}, []*ir.Field{anonfield(typs[28])})
typs[46] = types.Runetype typs[46] = types.RuneType
typs[47] = types.NewSlice(typs[46]) typs[47] = types.NewSlice(typs[46])
typs[48] = functype(nil, []*ir.Field{anonfield(typs[33]), anonfield(typs[47])}, []*ir.Field{anonfield(typs[28])}) typs[48] = functype(nil, []*ir.Field{anonfield(typs[33]), anonfield(typs[47])}, []*ir.Field{anonfield(typs[28])})
typs[49] = types.NewSlice(typs[0]) typs[49] = types.NewSlice(typs[0])

View File

@ -127,7 +127,7 @@ func convlit1(n ir.Node, t *types.Type, explicit bool, context func() string) ir
} }
// Nil is technically not a constant, so handle it specially. // Nil is technically not a constant, so handle it specially.
if n.Type().Etype == types.TNIL { if n.Type().Kind() == types.TNIL {
if n.Op() != ir.ONIL { if n.Op() != ir.ONIL {
base.Fatalf("unexpected op: %v (%v)", n, n.Op()) base.Fatalf("unexpected op: %v (%v)", n, n.Op())
} }
@ -147,7 +147,7 @@ func convlit1(n ir.Node, t *types.Type, explicit bool, context func() string) ir
return n return n
} }
if t == nil || !ir.OKForConst[t.Etype] { if t == nil || !ir.OKForConst[t.Kind()] {
t = defaultType(n.Type()) t = defaultType(n.Type())
} }
@ -245,7 +245,7 @@ func operandType(op ir.Op, t *types.Type) *types.Type {
return complexForFloat(t) return complexForFloat(t)
} }
default: default:
if okfor[op][t.Etype] { if okfor[op][t.Kind()] {
return t return t
} }
} }
@ -499,12 +499,12 @@ func evalConst(n ir.Node) ir.Node {
} }
case ir.OCONV, ir.ORUNESTR: case ir.OCONV, ir.ORUNESTR:
if ir.OKForConst[n.Type().Etype] && nl.Op() == ir.OLITERAL { if ir.OKForConst[n.Type().Kind()] && nl.Op() == ir.OLITERAL {
return origConst(n, convertVal(nl.Val(), n.Type(), true)) return origConst(n, convertVal(nl.Val(), n.Type(), true))
} }
case ir.OCONVNOP: case ir.OCONVNOP:
if ir.OKForConst[n.Type().Etype] && nl.Op() == ir.OLITERAL { if ir.OKForConst[n.Type().Kind()] && nl.Op() == ir.OLITERAL {
// set so n.Orig gets OCONV instead of OCONVNOP // set so n.Orig gets OCONV instead of OCONVNOP
n.SetOp(ir.OCONV) n.SetOp(ir.OCONV)
return origConst(n, nl.Val()) return origConst(n, nl.Val())
@ -555,7 +555,7 @@ func evalConst(n ir.Node) ir.Node {
return n return n
case ir.OCAP, ir.OLEN: case ir.OCAP, ir.OLEN:
switch nl.Type().Etype { switch nl.Type().Kind() {
case types.TSTRING: case types.TSTRING:
if ir.IsConst(nl, constant.String) { if ir.IsConst(nl, constant.String) {
return origIntConst(n, int64(len(nl.StringVal()))) return origIntConst(n, int64(len(nl.StringVal())))
@ -729,7 +729,7 @@ func mixUntyped(t1, t2 *types.Type) *types.Type {
} }
func defaultType(t *types.Type) *types.Type { func defaultType(t *types.Type) *types.Type {
if !t.IsUntyped() || t.Etype == types.TNIL { if !t.IsUntyped() || t.Kind() == types.TNIL {
return t return t
} }
@ -741,7 +741,7 @@ func defaultType(t *types.Type) *types.Type {
case types.UntypedInt: case types.UntypedInt:
return types.Types[types.TINT] return types.Types[types.TINT]
case types.UntypedRune: case types.UntypedRune:
return types.Runetype return types.RuneType
case types.UntypedFloat: case types.UntypedFloat:
return types.Types[types.TFLOAT64] return types.Types[types.TFLOAT64]
case types.UntypedComplex: case types.UntypedComplex:
@ -769,7 +769,7 @@ func indexconst(n ir.Node) int64 {
if n.Op() != ir.OLITERAL { if n.Op() != ir.OLITERAL {
return -1 return -1
} }
if !n.Type().IsInteger() && n.Type().Etype != types.TIDEAL { if !n.Type().IsInteger() && n.Type().Kind() != types.TIDEAL {
return -1 return -1
} }
@ -885,9 +885,9 @@ func (s *constSet) add(pos src.XPos, n ir.Node, what, where string) {
typ := n.Type() typ := n.Type()
switch typ { switch typ {
case types.Bytetype: case types.ByteType:
typ = types.Types[types.TUINT8] typ = types.Types[types.TUINT8]
case types.Runetype: case types.RuneType:
typ = types.Types[types.TINT32] typ = types.Types[types.TINT32]
} }
k := constSetKey{typ, ir.ConstValue(n)} k := constSetKey{typ, ir.ConstValue(n)}

View File

@ -445,7 +445,7 @@ func funcarg(n *ir.Field, ctxt ir.Class) {
// This happens during import, where the hidden_fndcl rule has // This happens during import, where the hidden_fndcl rule has
// used functype directly to parse the function's type. // used functype directly to parse the function's type.
func funcargs2(t *types.Type) { func funcargs2(t *types.Type) {
if t.Etype != types.TFUNC { if t.Kind() != types.TFUNC {
base.Fatalf("funcargs2 %v", t) base.Fatalf("funcargs2 %v", t)
} }
@ -496,7 +496,7 @@ func checkembeddedtype(t *types.Type) {
return return
} }
if t.Sym == nil && t.IsPtr() { if t.Sym() == nil && t.IsPtr() {
t = t.Elem() t = t.Elem()
if t.IsInterface() { if t.IsInterface() {
base.Errorf("embedded type cannot be a pointer to interface") base.Errorf("embedded type cannot be a pointer to interface")
@ -505,7 +505,7 @@ func checkembeddedtype(t *types.Type) {
if t.IsPtr() || t.IsUnsafePtr() { if t.IsPtr() || t.IsUnsafePtr() {
base.Errorf("embedded type cannot be a pointer") base.Errorf("embedded type cannot be a pointer")
} else if t.Etype == types.TFORW && !t.ForwardType().Embedlineno.IsKnown() { } else if t.Kind() == types.TFORW && !t.ForwardType().Embedlineno.IsKnown() {
t.ForwardType().Embedlineno = base.Pos t.ForwardType().Embedlineno = base.Pos
} }
} }
@ -719,12 +719,12 @@ func methodSymSuffix(recv *types.Type, msym *types.Sym, suffix string) *types.Sy
base.Fatalf("blank method name") base.Fatalf("blank method name")
} }
rsym := recv.Sym rsym := recv.Sym()
if recv.IsPtr() { if recv.IsPtr() {
if rsym != nil { if rsym != nil {
base.Fatalf("declared pointer receiver type: %v", recv) base.Fatalf("declared pointer receiver type: %v", recv)
} }
rsym = recv.Elem().Sym rsym = recv.Elem().Sym()
} }
// Find the package the receiver type appeared in. For // Find the package the receiver type appeared in. For
@ -777,11 +777,11 @@ func addmethod(n *ir.Func, msym *types.Sym, t *types.Type, local, nointerface bo
} }
mt := methtype(rf.Type) mt := methtype(rf.Type)
if mt == nil || mt.Sym == nil { if mt == nil || mt.Sym() == nil {
pa := rf.Type pa := rf.Type
t := pa t := pa
if t != nil && t.IsPtr() { if t != nil && t.IsPtr() {
if t.Sym != nil { if t.Sym() != nil {
base.Errorf("invalid receiver type %v (%v is a pointer type)", pa, t) base.Errorf("invalid receiver type %v (%v is a pointer type)", pa, t)
return nil return nil
} }
@ -791,7 +791,7 @@ func addmethod(n *ir.Func, msym *types.Sym, t *types.Type, local, nointerface bo
switch { switch {
case t == nil || t.Broke(): case t == nil || t.Broke():
// rely on typecheck having complained before // rely on typecheck having complained before
case t.Sym == nil: case t.Sym() == nil:
base.Errorf("invalid receiver type %v (%v is not a defined type)", pa, t) base.Errorf("invalid receiver type %v (%v is not a defined type)", pa, t)
case t.IsPtr(): case t.IsPtr():
base.Errorf("invalid receiver type %v (%v is a pointer type)", pa, t) base.Errorf("invalid receiver type %v (%v is a pointer type)", pa, t)
@ -805,7 +805,7 @@ func addmethod(n *ir.Func, msym *types.Sym, t *types.Type, local, nointerface bo
return nil return nil
} }
if local && mt.Sym.Pkg != ir.LocalPkg { if local && mt.Sym().Pkg != ir.LocalPkg {
base.Errorf("cannot define new methods on non-local type %v", mt) base.Errorf("cannot define new methods on non-local type %v", mt)
return nil return nil
} }

View File

@ -151,13 +151,13 @@ func embedKindApprox(typ ir.Node) int {
// embedKind determines the kind of embedding variable. // embedKind determines the kind of embedding variable.
func embedKind(typ *types.Type) int { func embedKind(typ *types.Type) int {
if typ.Sym != nil && typ.Sym.Name == "FS" && (typ.Sym.Pkg.Path == "embed" || (typ.Sym.Pkg == ir.LocalPkg && base.Ctxt.Pkgpath == "embed")) { if typ.Sym() != nil && typ.Sym().Name == "FS" && (typ.Sym().Pkg.Path == "embed" || (typ.Sym().Pkg == ir.LocalPkg && base.Ctxt.Pkgpath == "embed")) {
return embedFiles return embedFiles
} }
if typ == types.Types[types.TSTRING] { if typ == types.Types[types.TSTRING] {
return embedString return embedString
} }
if typ.Sym == nil && typ.IsSlice() && typ.Elem() == types.Bytetype { if typ.Sym() == nil && typ.IsSlice() && typ.Elem() == types.ByteType {
return embedBytes return embedBytes
} }
return embedUnknown return embedUnknown

View File

@ -659,7 +659,7 @@ func (e *Escape) exprSkipInit(k EscHole, n ir.Node) {
// unsafeValue evaluates a uintptr-typed arithmetic expression looking // unsafeValue evaluates a uintptr-typed arithmetic expression looking
// for conversions from an unsafe.Pointer. // for conversions from an unsafe.Pointer.
func (e *Escape) unsafeValue(k EscHole, n ir.Node) { func (e *Escape) unsafeValue(k EscHole, n ir.Node) {
if n.Type().Etype != types.TUINTPTR { if n.Type().Kind() != types.TUINTPTR {
base.Fatalf("unexpected type %v for %v", n.Type(), n) base.Fatalf("unexpected type %v for %v", n.Type(), n)
} }

View File

@ -102,7 +102,7 @@ var gopkg *types.Pkg // pseudo-package for method symbols on anonymous receiver
var zerosize int64 var zerosize int64
var simtype [types.NTYPE]types.EType var simtype [types.NTYPE]types.Kind
var ( var (
isInt [types.NTYPE]bool isInt [types.NTYPE]bool

View File

@ -473,15 +473,15 @@ func (p *iexporter) doDecl(n ir.Node) {
w.tag('T') w.tag('T')
w.pos(n.Pos()) w.pos(n.Pos())
underlying := n.Type().Orig underlying := n.Type().Underlying()
if underlying == types.Errortype.Orig { if underlying == types.ErrorType.Underlying() {
// For "type T error", use error as the // For "type T error", use error as the
// underlying type instead of error's own // underlying type instead of error's own
// underlying anonymous interface. This // underlying anonymous interface. This
// ensures consistency with how importers may // ensures consistency with how importers may
// declare error (e.g., go/types uses nil Pkg // declare error (e.g., go/types uses nil Pkg
// for predeclared objects). // for predeclared objects).
underlying = types.Errortype underlying = types.ErrorType
} }
w.typ(underlying) w.typ(underlying)
@ -634,8 +634,8 @@ func (w *exportWriter) startType(k itag) {
} }
func (w *exportWriter) doTyp(t *types.Type) { func (w *exportWriter) doTyp(t *types.Type) {
if t.Sym != nil { if t.Sym() != nil {
if t.Sym.Pkg == ir.BuiltinPkg || t.Sym.Pkg == unsafepkg { if t.Sym().Pkg == ir.BuiltinPkg || t.Sym().Pkg == unsafepkg {
base.Fatalf("builtin type missing from typIndex: %v", t) base.Fatalf("builtin type missing from typIndex: %v", t)
} }
@ -644,7 +644,7 @@ func (w *exportWriter) doTyp(t *types.Type) {
return return
} }
switch t.Etype { switch t.Kind() {
case types.TPTR: case types.TPTR:
w.startType(pointerType) w.startType(pointerType)
w.typ(t.Elem()) w.typ(t.Elem())
@ -762,7 +762,7 @@ func constTypeOf(typ *types.Type) constant.Kind {
return constant.Complex return constant.Complex
} }
switch typ.Etype { switch typ.Kind() {
case types.TBOOL: case types.TBOOL:
return constant.Bool return constant.Bool
case types.TSTRING: case types.TSTRING:
@ -809,7 +809,7 @@ func intSize(typ *types.Type) (signed bool, maxBytes uint) {
return true, Mpprec / 8 return true, Mpprec / 8
} }
switch typ.Etype { switch typ.Kind() {
case types.TFLOAT32, types.TCOMPLEX64: case types.TFLOAT32, types.TCOMPLEX64:
return true, 3 return true, 3
case types.TFLOAT64, types.TCOMPLEX128: case types.TFLOAT64, types.TCOMPLEX128:
@ -821,7 +821,7 @@ func intSize(typ *types.Type) (signed bool, maxBytes uint) {
// The go/types API doesn't expose sizes to importers, so they // The go/types API doesn't expose sizes to importers, so they
// don't know how big these types are. // don't know how big these types are.
switch typ.Etype { switch typ.Kind() {
case types.TINT, types.TUINT, types.TUINTPTR: case types.TINT, types.TUINT, types.TUINTPTR:
maxBytes = 8 maxBytes = 8
} }

View File

@ -61,10 +61,10 @@ func fnpkg(fn *ir.Name) *types.Pkg {
if rcvr.IsPtr() { if rcvr.IsPtr() {
rcvr = rcvr.Elem() rcvr = rcvr.Elem()
} }
if rcvr.Sym == nil { if rcvr.Sym() == nil {
base.Fatalf("receiver with no sym: [%v] %L (%v)", fn.Sym(), fn, rcvr) base.Fatalf("receiver with no sym: [%v] %L (%v)", fn.Sym(), fn, rcvr)
} }
return rcvr.Sym.Pkg return rcvr.Sym().Pkg
} }
// non-method // non-method

View File

@ -143,9 +143,9 @@ func (i *typeInterner) mktype(t ast.Expr) string {
case *ast.Ident: case *ast.Ident:
switch t.Name { switch t.Name {
case "byte": case "byte":
return "types.Bytetype" return "types.ByteType"
case "rune": case "rune":
return "types.Runetype" return "types.RuneType"
} }
return fmt.Sprintf("types.Types[types.T%s]", strings.ToUpper(t.Name)) return fmt.Sprintf("types.Types[types.T%s]", strings.ToUpper(t.Name))
case *ast.SelectorExpr: case *ast.SelectorExpr:

View File

@ -218,7 +218,7 @@ func addptabs() {
if s.Pkg.Name != "main" { if s.Pkg.Name != "main" {
continue continue
} }
if n.Type().Etype == types.TFUNC && n.Class() == ir.PFUNC { if n.Type().Kind() == types.TFUNC && n.Class() == ir.PFUNC {
// function // function
ptabs = append(ptabs, ptabEntry{s: s, t: ir.AsNode(s.Def).Type()}) ptabs = append(ptabs, ptabEntry{s: s, t: ir.AsNode(s.Def).Type()})
} else { } else {
@ -602,7 +602,7 @@ func litsym(n, c ir.Node, wid int) {
case constant.Float: case constant.Float:
f, _ := constant.Float64Val(u) f, _ := constant.Float64Val(u)
switch n.Type().Etype { switch n.Type().Kind() {
case types.TFLOAT32: case types.TFLOAT32:
s.WriteFloat32(base.Ctxt, n.Offset(), float32(f)) s.WriteFloat32(base.Ctxt, n.Offset(), float32(f))
case types.TFLOAT64: case types.TFLOAT64:
@ -612,7 +612,7 @@ func litsym(n, c ir.Node, wid int) {
case constant.Complex: case constant.Complex:
re, _ := constant.Float64Val(constant.Real(u)) re, _ := constant.Float64Val(constant.Real(u))
im, _ := constant.Float64Val(constant.Imag(u)) im, _ := constant.Float64Val(constant.Imag(u))
switch n.Type().Etype { switch n.Type().Kind() {
case types.TCOMPLEX64: case types.TCOMPLEX64:
s.WriteFloat32(base.Ctxt, n.Offset(), float32(re)) s.WriteFloat32(base.Ctxt, n.Offset(), float32(re))
s.WriteFloat32(base.Ctxt, n.Offset()+4, float32(im)) s.WriteFloat32(base.Ctxt, n.Offset()+4, float32(im))

View File

@ -784,7 +784,7 @@ func (o *Order) stmt(n ir.Node) {
n.SetRight(o.expr(n.Right(), nil)) n.SetRight(o.expr(n.Right(), nil))
orderBody := true orderBody := true
switch n.Type().Etype { switch n.Type().Kind() {
default: default:
base.Fatalf("order.stmt range %v", n.Type()) base.Fatalf("order.stmt range %v", n.Type())

View File

@ -416,7 +416,7 @@ func onebitwalktype1(t *types.Type, off int64, bv bvec) {
return return
} }
switch t.Etype { switch t.Kind() {
case types.TPTR, types.TUNSAFEPTR, types.TFUNC, types.TCHAN, types.TMAP: case types.TPTR, types.TUNSAFEPTR, types.TFUNC, types.TCHAN, types.TMAP:
if off&int64(Widthptr-1) != 0 { if off&int64(Widthptr-1) != 0 {
base.Fatalf("onebitwalktype1: invalid alignment, %v", t) base.Fatalf("onebitwalktype1: invalid alignment, %v", t)
@ -1300,7 +1300,7 @@ func liveness(e *ssafn, f *ssa.Func, pp *Progs) LivenessMap {
// to fully initialize t. // to fully initialize t.
func isfat(t *types.Type) bool { func isfat(t *types.Type) bool {
if t != nil { if t != nil {
switch t.Etype { switch t.Kind() {
case types.TSLICE, types.TSTRING, case types.TSLICE, types.TSTRING,
types.TINTER: // maybe remove later types.TINTER: // maybe remove later
return true return true

View File

@ -61,7 +61,7 @@ func typecheckrangeExpr(n ir.Node) {
var t1, t2 *types.Type var t1, t2 *types.Type
toomany := false toomany := false
switch t.Etype { switch t.Kind() {
default: default:
base.ErrorfAt(n.Pos(), "cannot range over %L", n.Right()) base.ErrorfAt(n.Pos(), "cannot range over %L", n.Right())
return return
@ -88,7 +88,7 @@ func typecheckrangeExpr(n ir.Node) {
case types.TSTRING: case types.TSTRING:
t1 = types.Types[types.TINT] t1 = types.Types[types.TINT]
t2 = types.Runetype t2 = types.RuneType
} }
if n.List().Len() > 2 || toomany { if n.List().Len() > 2 || toomany {
@ -208,7 +208,7 @@ func walkrange(nrange ir.Node) ir.Node {
var body []ir.Node var body []ir.Node
var init []ir.Node var init []ir.Node
switch t.Etype { switch t.Kind() {
default: default:
base.Fatalf("walkrange") base.Fatalf("walkrange")
@ -375,7 +375,7 @@ func walkrange(nrange ir.Node) ir.Node {
hv1 := temp(types.Types[types.TINT]) hv1 := temp(types.Types[types.TINT])
hv1t := temp(types.Types[types.TINT]) hv1t := temp(types.Types[types.TINT])
hv2 := temp(types.Runetype) hv2 := temp(types.RuneType)
// hv1 := 0 // hv1 := 0
init = append(init, ir.Nod(ir.OAS, hv1, nil)) init = append(init, ir.Nod(ir.OAS, hv1, nil))
@ -391,7 +391,7 @@ func walkrange(nrange ir.Node) ir.Node {
// hv2 := rune(ha[hv1]) // hv2 := rune(ha[hv1])
nind := ir.Nod(ir.OINDEX, ha, hv1) nind := ir.Nod(ir.OINDEX, ha, hv1)
nind.SetBounded(true) nind.SetBounded(true)
body = append(body, ir.Nod(ir.OAS, hv2, conv(nind, types.Runetype))) body = append(body, ir.Nod(ir.OAS, hv2, conv(nind, types.RuneType)))
// if hv2 < utf8.RuneSelf // if hv2 < utf8.RuneSelf
nif := ir.Nod(ir.OIF, nil, nil) nif := ir.Nod(ir.OIF, nil, nil)
@ -467,7 +467,7 @@ func isMapClear(n ir.Node) bool {
return false return false
} }
if n.Op() != ir.ORANGE || n.Type().Etype != types.TMAP || n.List().Len() != 1 { if n.Op() != ir.ORANGE || n.Type().Kind() != types.TMAP || n.List().Len() != 1 {
return false return false
} }

View File

@ -68,7 +68,7 @@ func imethodSize() int { return 4 + 4 } // Sizeof(runtime.imeth
func commonSize() int { return 4*Widthptr + 8 + 8 } // Sizeof(runtime._type{}) func commonSize() int { return 4*Widthptr + 8 + 8 } // Sizeof(runtime._type{})
func uncommonSize(t *types.Type) int { // Sizeof(runtime.uncommontype{}) func uncommonSize(t *types.Type) int { // Sizeof(runtime.uncommontype{})
if t.Sym == nil && len(methods(t)) == 0 { if t.Sym() == nil && len(methods(t)) == 0 {
return 0 return 0
} }
return 4 + 2 + 2 + 4 + 4 return 4 + 2 + 2 + 4 + 4
@ -448,7 +448,7 @@ func methods(t *types.Type) []*Sig {
func imethods(t *types.Type) []*Sig { func imethods(t *types.Type) []*Sig {
var methods []*Sig var methods []*Sig
for _, f := range t.Fields().Slice() { for _, f := range t.Fields().Slice() {
if f.Type.Etype != types.TFUNC || f.Sym == nil { if f.Type.Kind() != types.TFUNC || f.Sym == nil {
continue continue
} }
if f.Sym.IsBlank() { if f.Sym.IsBlank() {
@ -640,7 +640,7 @@ func dname(name, tag string, pkg *types.Pkg, exported bool) *obj.LSym {
// backing array of the []method field is written (by dextratypeData). // backing array of the []method field is written (by dextratypeData).
func dextratype(lsym *obj.LSym, ot int, t *types.Type, dataAdd int) int { func dextratype(lsym *obj.LSym, ot int, t *types.Type, dataAdd int) int {
m := methods(t) m := methods(t)
if t.Sym == nil && len(m) == 0 { if t.Sym() == nil && len(m) == 0 {
return ot return ot
} }
noff := int(Rnd(int64(ot), int64(Widthptr))) noff := int(Rnd(int64(ot), int64(Widthptr)))
@ -672,16 +672,16 @@ func dextratype(lsym *obj.LSym, ot int, t *types.Type, dataAdd int) int {
} }
func typePkg(t *types.Type) *types.Pkg { func typePkg(t *types.Type) *types.Pkg {
tsym := t.Sym tsym := t.Sym()
if tsym == nil { if tsym == nil {
switch t.Etype { switch t.Kind() {
case types.TARRAY, types.TSLICE, types.TPTR, types.TCHAN: case types.TARRAY, types.TSLICE, types.TPTR, types.TCHAN:
if t.Elem() != nil { if t.Elem() != nil {
tsym = t.Elem().Sym tsym = t.Elem().Sym()
} }
} }
} }
if tsym != nil && t != types.Types[t.Etype] && t != types.Errortype { if tsym != nil && t != types.Types[t.Kind()] && t != types.ErrorType {
return tsym.Pkg return tsym.Pkg
} }
return nil return nil
@ -753,7 +753,7 @@ func typeptrdata(t *types.Type) int64 {
return 0 return 0
} }
switch t.Etype { switch t.Kind() {
case types.TPTR, case types.TPTR,
types.TUNSAFEPTR, types.TUNSAFEPTR,
types.TFUNC, types.TFUNC,
@ -823,7 +823,7 @@ func dcommontype(lsym *obj.LSym, t *types.Type) int {
var sptr *obj.LSym var sptr *obj.LSym
if !t.IsPtr() || t.IsPtrElem() { if !t.IsPtr() || t.IsPtrElem() {
tptr := types.NewPtr(t) tptr := types.NewPtr(t)
if t.Sym != nil || methods(tptr) != nil { if t.Sym() != nil || methods(tptr) != nil {
sptrWeak = false sptrWeak = false
} }
sptr = dtypesym(tptr) sptr = dtypesym(tptr)
@ -855,7 +855,7 @@ func dcommontype(lsym *obj.LSym, t *types.Type) int {
if uncommonSize(t) != 0 { if uncommonSize(t) != 0 {
tflag |= tflagUncommon tflag |= tflagUncommon
} }
if t.Sym != nil && t.Sym.Name != "" { if t.Sym() != nil && t.Sym().Name != "" {
tflag |= tflagNamed tflag |= tflagNamed
} }
if IsRegularMemory(t) { if IsRegularMemory(t) {
@ -872,12 +872,12 @@ func dcommontype(lsym *obj.LSym, t *types.Type) int {
if !strings.HasPrefix(p, "*") { if !strings.HasPrefix(p, "*") {
p = "*" + p p = "*" + p
tflag |= tflagExtraStar tflag |= tflagExtraStar
if t.Sym != nil { if t.Sym() != nil {
exported = types.IsExported(t.Sym.Name) exported = types.IsExported(t.Sym().Name)
} }
} else { } else {
if t.Elem() != nil && t.Elem().Sym != nil { if t.Elem() != nil && t.Elem().Sym() != nil {
exported = types.IsExported(t.Elem().Sym.Name) exported = types.IsExported(t.Elem().Sym().Name)
} }
} }
@ -895,7 +895,7 @@ func dcommontype(lsym *obj.LSym, t *types.Type) int {
ot = duint8(lsym, ot, t.Align) // align ot = duint8(lsym, ot, t.Align) // align
ot = duint8(lsym, ot, t.Align) // fieldAlign ot = duint8(lsym, ot, t.Align) // fieldAlign
i = kinds[t.Etype] i = kinds[t.Kind()]
if isdirectiface(t) { if isdirectiface(t) {
i |= objabi.KindDirectIface i |= objabi.KindDirectIface
} }
@ -1029,7 +1029,7 @@ func itabname(t, itype *types.Type) ir.Node {
// isreflexive reports whether t has a reflexive equality operator. // isreflexive reports whether t has a reflexive equality operator.
// That is, if x==x for all x of type t. // That is, if x==x for all x of type t.
func isreflexive(t *types.Type) bool { func isreflexive(t *types.Type) bool {
switch t.Etype { switch t.Kind() {
case types.TBOOL, case types.TBOOL,
types.TINT, types.TINT,
types.TUINT, types.TUINT,
@ -1075,7 +1075,7 @@ func isreflexive(t *types.Type) bool {
// needkeyupdate reports whether map updates with t as a key // needkeyupdate reports whether map updates with t as a key
// need the key to be updated. // need the key to be updated.
func needkeyupdate(t *types.Type) bool { func needkeyupdate(t *types.Type) bool {
switch t.Etype { switch t.Kind() {
case types.TBOOL, types.TINT, types.TUINT, types.TINT8, types.TUINT8, types.TINT16, types.TUINT16, types.TINT32, types.TUINT32, case types.TBOOL, types.TINT, types.TUINT, types.TINT8, types.TUINT8, types.TINT16, types.TUINT16, types.TINT32, types.TUINT32,
types.TINT64, types.TUINT64, types.TUINTPTR, types.TPTR, types.TUNSAFEPTR, types.TCHAN: types.TINT64, types.TUINT64, types.TUINTPTR, types.TPTR, types.TUNSAFEPTR, types.TCHAN:
return false return false
@ -1104,7 +1104,7 @@ func needkeyupdate(t *types.Type) bool {
// hashMightPanic reports whether the hash of a map key of type t might panic. // hashMightPanic reports whether the hash of a map key of type t might panic.
func hashMightPanic(t *types.Type) bool { func hashMightPanic(t *types.Type) bool {
switch t.Etype { switch t.Kind() {
case types.TINTER: case types.TINTER:
return true return true
@ -1128,8 +1128,8 @@ func hashMightPanic(t *types.Type) bool {
// They've been separate internally to make error messages // They've been separate internally to make error messages
// better, but we have to merge them in the reflect tables. // better, but we have to merge them in the reflect tables.
func formalType(t *types.Type) *types.Type { func formalType(t *types.Type) *types.Type {
if t == types.Bytetype || t == types.Runetype { if t == types.ByteType || t == types.RuneType {
return types.Types[t.Etype] return types.Types[t.Kind()]
} }
return t return t
} }
@ -1152,19 +1152,19 @@ func dtypesym(t *types.Type) *obj.LSym {
// emit the type structures for int, float, etc. // emit the type structures for int, float, etc.
tbase := t tbase := t
if t.IsPtr() && t.Sym == nil && t.Elem().Sym != nil { if t.IsPtr() && t.Sym() == nil && t.Elem().Sym() != nil {
tbase = t.Elem() tbase = t.Elem()
} }
dupok := 0 dupok := 0
if tbase.Sym == nil { if tbase.Sym() == nil {
dupok = obj.DUPOK dupok = obj.DUPOK
} }
if base.Ctxt.Pkgpath != "runtime" || (tbase != types.Types[tbase.Etype] && tbase != types.Bytetype && tbase != types.Runetype && tbase != types.Errortype) { // int, float, etc if base.Ctxt.Pkgpath != "runtime" || (tbase != types.Types[tbase.Kind()] && tbase != types.ByteType && tbase != types.RuneType && tbase != types.ErrorType) { // int, float, etc
// named types from other files are defined only by those files // named types from other files are defined only by those files
if tbase.Sym != nil && tbase.Sym.Pkg != ir.LocalPkg { if tbase.Sym() != nil && tbase.Sym().Pkg != ir.LocalPkg {
if i, ok := typeSymIdx[tbase]; ok { if i, ok := typeSymIdx[tbase]; ok {
lsym.Pkg = tbase.Sym.Pkg.Prefix lsym.Pkg = tbase.Sym().Pkg.Prefix
if t != tbase { if t != tbase {
lsym.SymIdx = int32(i[1]) lsym.SymIdx = int32(i[1])
} else { } else {
@ -1175,13 +1175,13 @@ func dtypesym(t *types.Type) *obj.LSym {
return lsym return lsym
} }
// TODO(mdempsky): Investigate whether this can happen. // TODO(mdempsky): Investigate whether this can happen.
if tbase.Etype == types.TFORW { if tbase.Kind() == types.TFORW {
return lsym return lsym
} }
} }
ot := 0 ot := 0
switch t.Etype { switch t.Kind() {
default: default:
ot = dcommontype(lsym, t) ot = dcommontype(lsym, t)
ot = dextratype(lsym, ot, t, 0) ot = dextratype(lsym, ot, t, 0)
@ -1262,8 +1262,8 @@ func dtypesym(t *types.Type) *obj.LSym {
ot = dcommontype(lsym, t) ot = dcommontype(lsym, t)
var tpkg *types.Pkg var tpkg *types.Pkg
if t.Sym != nil && t != types.Types[t.Etype] && t != types.Errortype { if t.Sym() != nil && t != types.Types[t.Kind()] && t != types.ErrorType {
tpkg = t.Sym.Pkg tpkg = t.Sym().Pkg
} }
ot = dgopkgpath(lsym, ot, tpkg) ot = dgopkgpath(lsym, ot, tpkg)
@ -1328,7 +1328,7 @@ func dtypesym(t *types.Type) *obj.LSym {
ot = dextratype(lsym, ot, t, 0) ot = dextratype(lsym, ot, t, 0)
case types.TPTR: case types.TPTR:
if t.Elem().Etype == types.TANY { if t.Elem().Kind() == types.TANY {
// ../../../../runtime/type.go:/UnsafePointerType // ../../../../runtime/type.go:/UnsafePointerType
ot = dcommontype(lsym, t) ot = dcommontype(lsym, t)
ot = dextratype(lsym, ot, t, 0) ot = dextratype(lsym, ot, t, 0)
@ -1397,13 +1397,13 @@ func dtypesym(t *types.Type) *obj.LSym {
// When buildmode=shared, all types are in typelinks so the // When buildmode=shared, all types are in typelinks so the
// runtime can deduplicate type pointers. // runtime can deduplicate type pointers.
keep := base.Ctxt.Flag_dynlink keep := base.Ctxt.Flag_dynlink
if !keep && t.Sym == nil { if !keep && t.Sym() == nil {
// For an unnamed type, we only need the link if the type can // For an unnamed type, we only need the link if the type can
// be created at run time by reflect.PtrTo and similar // be created at run time by reflect.PtrTo and similar
// functions. If the type exists in the program, those // functions. If the type exists in the program, those
// functions must return the existing type structure rather // functions must return the existing type structure rather
// than creating a new one. // than creating a new one.
switch t.Etype { switch t.Kind() {
case types.TPTR, types.TARRAY, types.TCHAN, types.TFUNC, types.TMAP, types.TSLICE, types.TSTRUCT: case types.TPTR, types.TARRAY, types.TCHAN, types.TFUNC, types.TMAP, types.TSLICE, types.TSTRUCT:
keep = true keep = true
} }
@ -1541,7 +1541,7 @@ func dumpsignats() {
for _, ts := range signats { for _, ts := range signats {
t := ts.t t := ts.t
dtypesym(t) dtypesym(t)
if t.Sym != nil { if t.Sym() != nil {
dtypesym(types.NewPtr(t)) dtypesym(types.NewPtr(t))
} }
} }
@ -1616,7 +1616,7 @@ func dumpbasictypes() {
// another possible choice would be package main, // another possible choice would be package main,
// but using runtime means fewer copies in object files. // but using runtime means fewer copies in object files.
if base.Ctxt.Pkgpath == "runtime" { if base.Ctxt.Pkgpath == "runtime" {
for i := types.EType(1); i <= types.TBOOL; i++ { for i := types.Kind(1); i <= types.TBOOL; i++ {
dtypesym(types.NewPtr(types.Types[i])) dtypesym(types.NewPtr(types.Types[i]))
} }
dtypesym(types.NewPtr(types.Types[types.TSTRING])) dtypesym(types.NewPtr(types.Types[types.TSTRING]))
@ -1624,9 +1624,9 @@ func dumpbasictypes() {
// emit type structs for error and func(error) string. // emit type structs for error and func(error) string.
// The latter is the type of an auto-generated wrapper. // The latter is the type of an auto-generated wrapper.
dtypesym(types.NewPtr(types.Errortype)) dtypesym(types.NewPtr(types.ErrorType))
dtypesym(functype(nil, []*ir.Field{anonfield(types.Errortype)}, []*ir.Field{anonfield(types.Types[types.TSTRING])})) dtypesym(functype(nil, []*ir.Field{anonfield(types.ErrorType)}, []*ir.Field{anonfield(types.Types[types.TSTRING])}))
// add paths for runtime and main, which 6l imports implicitly. // add paths for runtime and main, which 6l imports implicitly.
dimportpath(Runtimepkg) dimportpath(Runtimepkg)
@ -1665,7 +1665,7 @@ func (a typesByString) Less(i, j int) bool {
// will be equal for the above checks, but different in DWARF output. // will be equal for the above checks, but different in DWARF output.
// Sort by source position to ensure deterministic order. // Sort by source position to ensure deterministic order.
// See issues 27013 and 30202. // See issues 27013 and 30202.
if a[i].t.Etype == types.TINTER && a[i].t.Methods().Len() > 0 { if a[i].t.Kind() == types.TINTER && a[i].t.Methods().Len() > 0 {
return a[i].t.Methods().Index(0).Pos.Before(a[j].t.Methods().Index(0).Pos) return a[i].t.Methods().Index(0).Pos.Before(a[j].t.Methods().Index(0).Pos)
} }
return false return false
@ -1821,7 +1821,7 @@ func (p *GCProg) emit(t *types.Type, offset int64) {
p.w.Ptr(offset / int64(Widthptr)) p.w.Ptr(offset / int64(Widthptr))
return return
} }
switch t.Etype { switch t.Kind() {
default: default:
base.Fatalf("GCProg.emit: unexpected type %v", t) base.Fatalf("GCProg.emit: unexpected type %v", t)

View File

@ -54,13 +54,13 @@ func initssaconfig() {
_ = types.NewPtr(types.Types[types.TINTER]) // *interface{} _ = types.NewPtr(types.Types[types.TINTER]) // *interface{}
_ = types.NewPtr(types.NewPtr(types.Types[types.TSTRING])) // **string _ = types.NewPtr(types.NewPtr(types.Types[types.TSTRING])) // **string
_ = types.NewPtr(types.NewSlice(types.Types[types.TINTER])) // *[]interface{} _ = types.NewPtr(types.NewSlice(types.Types[types.TINTER])) // *[]interface{}
_ = types.NewPtr(types.NewPtr(types.Bytetype)) // **byte _ = types.NewPtr(types.NewPtr(types.ByteType)) // **byte
_ = types.NewPtr(types.NewSlice(types.Bytetype)) // *[]byte _ = types.NewPtr(types.NewSlice(types.ByteType)) // *[]byte
_ = types.NewPtr(types.NewSlice(types.Types[types.TSTRING])) // *[]string _ = types.NewPtr(types.NewSlice(types.Types[types.TSTRING])) // *[]string
_ = types.NewPtr(types.NewPtr(types.NewPtr(types.Types[types.TUINT8]))) // ***uint8 _ = types.NewPtr(types.NewPtr(types.NewPtr(types.Types[types.TUINT8]))) // ***uint8
_ = types.NewPtr(types.Types[types.TINT16]) // *int16 _ = types.NewPtr(types.Types[types.TINT16]) // *int16
_ = types.NewPtr(types.Types[types.TINT64]) // *int64 _ = types.NewPtr(types.Types[types.TINT64]) // *int64
_ = types.NewPtr(types.Errortype) // *error _ = types.NewPtr(types.ErrorType) // *error
types.NewPtrCacheEnabled = false types.NewPtrCacheEnabled = false
ssaConfig = ssa.NewConfig(thearch.LinkArch.Name, *types_, base.Ctxt, base.Flag.N == 0) ssaConfig = ssa.NewConfig(thearch.LinkArch.Name, *types_, base.Ctxt, base.Flag.N == 0)
ssaConfig.SoftFloat = thearch.SoftFloat ssaConfig.SoftFloat = thearch.SoftFloat
@ -1591,7 +1591,7 @@ func (s *state) exit() *ssa.Block {
type opAndType struct { type opAndType struct {
op ir.Op op ir.Op
etype types.EType etype types.Kind
} }
var opToSSA = map[opAndType]ssa.Op{ var opToSSA = map[opAndType]ssa.Op{
@ -1766,8 +1766,8 @@ var opToSSA = map[opAndType]ssa.Op{
opAndType{ir.OLE, types.TFLOAT32}: ssa.OpLeq32F, opAndType{ir.OLE, types.TFLOAT32}: ssa.OpLeq32F,
} }
func (s *state) concreteEtype(t *types.Type) types.EType { func (s *state) concreteEtype(t *types.Type) types.Kind {
e := t.Etype e := t.Kind()
switch e { switch e {
default: default:
return e return e
@ -1799,7 +1799,7 @@ func (s *state) ssaOp(op ir.Op, t *types.Type) ssa.Op {
} }
func floatForComplex(t *types.Type) *types.Type { func floatForComplex(t *types.Type) *types.Type {
switch t.Etype { switch t.Kind() {
case types.TCOMPLEX64: case types.TCOMPLEX64:
return types.Types[types.TFLOAT32] return types.Types[types.TFLOAT32]
case types.TCOMPLEX128: case types.TCOMPLEX128:
@ -1810,7 +1810,7 @@ func floatForComplex(t *types.Type) *types.Type {
} }
func complexForFloat(t *types.Type) *types.Type { func complexForFloat(t *types.Type) *types.Type {
switch t.Etype { switch t.Kind() {
case types.TFLOAT32: case types.TFLOAT32:
return types.Types[types.TCOMPLEX64] return types.Types[types.TCOMPLEX64]
case types.TFLOAT64: case types.TFLOAT64:
@ -1822,19 +1822,19 @@ func complexForFloat(t *types.Type) *types.Type {
type opAndTwoTypes struct { type opAndTwoTypes struct {
op ir.Op op ir.Op
etype1 types.EType etype1 types.Kind
etype2 types.EType etype2 types.Kind
} }
type twoTypes struct { type twoTypes struct {
etype1 types.EType etype1 types.Kind
etype2 types.EType etype2 types.Kind
} }
type twoOpsAndType struct { type twoOpsAndType struct {
op1 ssa.Op op1 ssa.Op
op2 ssa.Op op2 ssa.Op
intermediateType types.EType intermediateType types.Kind
} }
var fpConvOpToSSA = map[twoTypes]twoOpsAndType{ var fpConvOpToSSA = map[twoTypes]twoOpsAndType{
@ -2115,12 +2115,12 @@ func (s *state) expr(n ir.Node) *ssa.Value {
v := s.newValue1(ssa.OpCopy, to, x) // ensure that v has the right type v := s.newValue1(ssa.OpCopy, to, x) // ensure that v has the right type
// CONVNOP closure // CONVNOP closure
if to.Etype == types.TFUNC && from.IsPtrShaped() { if to.Kind() == types.TFUNC && from.IsPtrShaped() {
return v return v
} }
// named <--> unnamed type or typed <--> untyped const // named <--> unnamed type or typed <--> untyped const
if from.Etype == to.Etype { if from.Kind() == to.Kind() {
return v return v
} }
@ -2130,7 +2130,7 @@ func (s *state) expr(n ir.Node) *ssa.Value {
} }
// map <--> *hmap // map <--> *hmap
if to.Etype == types.TMAP && from.IsPtr() && if to.Kind() == types.TMAP && from.IsPtr() &&
to.MapType().Hmap == from.Elem() { to.MapType().Hmap == from.Elem() {
return v return v
} }
@ -2141,8 +2141,8 @@ func (s *state) expr(n ir.Node) *ssa.Value {
s.Fatalf("CONVNOP width mismatch %v (%d) -> %v (%d)\n", from, from.Width, to, to.Width) s.Fatalf("CONVNOP width mismatch %v (%d) -> %v (%d)\n", from, from.Width, to, to.Width)
return nil return nil
} }
if etypesign(from.Etype) != etypesign(to.Etype) { if etypesign(from.Kind()) != etypesign(to.Kind()) {
s.Fatalf("CONVNOP sign mismatch %v (%s) -> %v (%s)\n", from, from.Etype, to, to.Etype) s.Fatalf("CONVNOP sign mismatch %v (%s) -> %v (%s)\n", from, from.Kind(), to, to.Kind())
return nil return nil
} }
@ -2153,7 +2153,7 @@ func (s *state) expr(n ir.Node) *ssa.Value {
return v return v
} }
if etypesign(from.Etype) == 0 { if etypesign(from.Kind()) == 0 {
s.Fatalf("CONVNOP unrecognized non-integer %v -> %v\n", from, to) s.Fatalf("CONVNOP unrecognized non-integer %v -> %v\n", from, to)
return nil return nil
} }
@ -2329,7 +2329,7 @@ func (s *state) expr(n ir.Node) *ssa.Value {
s.newValueOrSfCall1(op, ttp, s.newValue1(ssa.OpComplexImag, ftp, x))) s.newValueOrSfCall1(op, ttp, s.newValue1(ssa.OpComplexImag, ftp, x)))
} }
s.Fatalf("unhandled OCONV %s -> %s", n.Left().Type().Etype, n.Type().Etype) s.Fatalf("unhandled OCONV %s -> %s", n.Left().Type().Kind(), n.Type().Kind())
return nil return nil
case ir.ODOTTYPE: case ir.ODOTTYPE:
@ -3172,7 +3172,7 @@ const (
type sfRtCallDef struct { type sfRtCallDef struct {
rtfn *obj.LSym rtfn *obj.LSym
rtype types.EType rtype types.Kind
} }
var softFloatOps map[ssa.Op]sfRtCallDef var softFloatOps map[ssa.Op]sfRtCallDef
@ -3467,9 +3467,9 @@ func init() {
}, },
sys.AMD64, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X) sys.AMD64, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
type atomicOpEmitter func(s *state, n ir.Node, args []*ssa.Value, op ssa.Op, typ types.EType) type atomicOpEmitter func(s *state, n ir.Node, args []*ssa.Value, op ssa.Op, typ types.Kind)
makeAtomicGuardedIntrinsicARM64 := func(op0, op1 ssa.Op, typ, rtyp types.EType, emit atomicOpEmitter) intrinsicBuilder { makeAtomicGuardedIntrinsicARM64 := func(op0, op1 ssa.Op, typ, rtyp types.Kind, emit atomicOpEmitter) intrinsicBuilder {
return func(s *state, n ir.Node, args []*ssa.Value) *ssa.Value { return func(s *state, n ir.Node, args []*ssa.Value) *ssa.Value {
// Target Atomic feature is identified by dynamic detection // Target Atomic feature is identified by dynamic detection
@ -3505,7 +3505,7 @@ func init() {
} }
} }
atomicXchgXaddEmitterARM64 := func(s *state, n ir.Node, args []*ssa.Value, op ssa.Op, typ types.EType) { atomicXchgXaddEmitterARM64 := func(s *state, n ir.Node, args []*ssa.Value, op ssa.Op, typ types.Kind) {
v := s.newValue3(op, types.NewTuple(types.Types[typ], types.TypeMem), args[0], args[1], s.mem()) v := s.newValue3(op, types.NewTuple(types.Types[typ], types.TypeMem), args[0], args[1], s.mem())
s.vars[memVar] = s.newValue1(ssa.OpSelect1, types.TypeMem, v) s.vars[memVar] = s.newValue1(ssa.OpSelect1, types.TypeMem, v)
s.vars[n] = s.newValue1(ssa.OpSelect0, types.Types[typ], v) s.vars[n] = s.newValue1(ssa.OpSelect0, types.Types[typ], v)
@ -3561,7 +3561,7 @@ func init() {
}, },
sys.PPC64) sys.PPC64)
atomicCasEmitterARM64 := func(s *state, n ir.Node, args []*ssa.Value, op ssa.Op, typ types.EType) { atomicCasEmitterARM64 := func(s *state, n ir.Node, args []*ssa.Value, op ssa.Op, typ types.Kind) {
v := s.newValue4(op, types.NewTuple(types.Types[types.TBOOL], types.TypeMem), args[0], args[1], args[2], s.mem()) v := s.newValue4(op, types.NewTuple(types.Types[types.TBOOL], types.TypeMem), args[0], args[1], args[2], s.mem())
s.vars[memVar] = s.newValue1(ssa.OpSelect1, types.TypeMem, v) s.vars[memVar] = s.newValue1(ssa.OpSelect1, types.TypeMem, v)
s.vars[n] = s.newValue1(ssa.OpSelect0, types.Types[typ], v) s.vars[n] = s.newValue1(ssa.OpSelect0, types.Types[typ], v)
@ -3599,7 +3599,7 @@ func init() {
}, },
sys.AMD64, sys.MIPS, sys.PPC64, sys.S390X) sys.AMD64, sys.MIPS, sys.PPC64, sys.S390X)
atomicAndOrEmitterARM64 := func(s *state, n ir.Node, args []*ssa.Value, op ssa.Op, typ types.EType) { atomicAndOrEmitterARM64 := func(s *state, n ir.Node, args []*ssa.Value, op ssa.Op, typ types.Kind) {
s.vars[memVar] = s.newValue3(op, types.TypeMem, args[0], args[1], s.mem()) s.vars[memVar] = s.newValue3(op, types.TypeMem, args[0], args[1], s.mem())
} }
@ -4810,7 +4810,7 @@ func (s *state) getClosureAndRcvr(fn ir.Node) (*ssa.Value, *ssa.Value) {
// etypesign returns the signed-ness of e, for integer/pointer etypes. // etypesign returns the signed-ness of e, for integer/pointer etypes.
// -1 means signed, +1 means unsigned, 0 means non-integer/non-pointer. // -1 means signed, +1 means unsigned, 0 means non-integer/non-pointer.
func etypesign(e types.EType) int8 { func etypesign(e types.Kind) int8 {
switch e { switch e {
case types.TINT8, types.TINT16, types.TINT32, types.TINT64, types.TINT: case types.TINT8, types.TINT16, types.TINT32, types.TINT64, types.TINT:
return -1 return -1
@ -4980,7 +4980,7 @@ func canSSAType(t *types.Type) bool {
// Too big and we'll introduce too much register pressure. // Too big and we'll introduce too much register pressure.
return false return false
} }
switch t.Etype { switch t.Kind() {
case types.TARRAY: case types.TARRAY:
// We can't do larger arrays because dynamic indexing is // We can't do larger arrays because dynamic indexing is
// not supported on SSA variables. // not supported on SSA variables.

View File

@ -181,7 +181,7 @@ func nodstr(s string) ir.Node {
return ir.NewLiteral(constant.MakeString(s)) return ir.NewLiteral(constant.MakeString(s))
} }
func isptrto(t *types.Type, et types.EType) bool { func isptrto(t *types.Type, et types.Kind) bool {
if t == nil { if t == nil {
return false return false
} }
@ -192,7 +192,7 @@ func isptrto(t *types.Type, et types.EType) bool {
if t == nil { if t == nil {
return false return false
} }
if t.Etype != et { if t.Kind() != et {
return false return false
} }
return true return true
@ -208,7 +208,7 @@ func methtype(t *types.Type) *types.Type {
// Strip away pointer if it's there. // Strip away pointer if it's there.
if t.IsPtr() { if t.IsPtr() {
if t.Sym != nil { if t.Sym() != nil {
return nil return nil
} }
t = t.Elem() t = t.Elem()
@ -218,15 +218,15 @@ func methtype(t *types.Type) *types.Type {
} }
// Must be a named type or anonymous struct. // Must be a named type or anonymous struct.
if t.Sym == nil && !t.IsStruct() { if t.Sym() == nil && !t.IsStruct() {
return nil return nil
} }
// Check types. // Check types.
if issimple[t.Etype] { if issimple[t.Kind()] {
return t return t
} }
switch t.Etype { switch t.Kind() {
case types.TARRAY, types.TCHAN, types.TFUNC, types.TMAP, types.TSLICE, types.TSTRING, types.TSTRUCT: case types.TARRAY, types.TCHAN, types.TFUNC, types.TMAP, types.TSLICE, types.TSTRING, types.TSTRUCT:
return t return t
} }
@ -241,7 +241,7 @@ func assignop(src, dst *types.Type) (ir.Op, string) {
if src == dst { if src == dst {
return ir.OCONVNOP, "" return ir.OCONVNOP, ""
} }
if src == nil || dst == nil || src.Etype == types.TFORW || dst.Etype == types.TFORW || src.Orig == nil || dst.Orig == nil { if src == nil || dst == nil || src.Kind() == types.TFORW || dst.Kind() == types.TFORW || src.Underlying() == nil || dst.Underlying() == nil {
return ir.OXXX, "" return ir.OXXX, ""
} }
@ -257,13 +257,13 @@ func assignop(src, dst *types.Type) (ir.Op, string) {
// we want to recompute the itab. Recomputing the itab ensures // we want to recompute the itab. Recomputing the itab ensures
// that itabs are unique (thus an interface with a compile-time // that itabs are unique (thus an interface with a compile-time
// type I has an itab with interface type I). // type I has an itab with interface type I).
if types.Identical(src.Orig, dst.Orig) { if types.Identical(src.Underlying(), dst.Underlying()) {
if src.IsEmptyInterface() { if src.IsEmptyInterface() {
// Conversion between two empty interfaces // Conversion between two empty interfaces
// requires no code. // requires no code.
return ir.OCONVNOP, "" return ir.OCONVNOP, ""
} }
if (src.Sym == nil || dst.Sym == nil) && !src.IsInterface() { if (src.Sym() == nil || dst.Sym() == nil) && !src.IsInterface() {
// Conversion between two types, at least one unnamed, // Conversion between two types, at least one unnamed,
// needs no conversion. The exception is nonempty interfaces // needs no conversion. The exception is nonempty interfaces
// which need to have their itab updated. // which need to have their itab updated.
@ -272,7 +272,7 @@ func assignop(src, dst *types.Type) (ir.Op, string) {
} }
// 3. dst is an interface type and src implements dst. // 3. dst is an interface type and src implements dst.
if dst.IsInterface() && src.Etype != types.TNIL { if dst.IsInterface() && src.Kind() != types.TNIL {
var missing, have *types.Field var missing, have *types.Field
var ptr int var ptr int
if implements(src, dst, &missing, &have, &ptr) { if implements(src, dst, &missing, &have, &ptr) {
@ -309,7 +309,7 @@ func assignop(src, dst *types.Type) (ir.Op, string) {
return ir.OXXX, why return ir.OXXX, why
} }
if src.IsInterface() && dst.Etype != types.TBLANK { if src.IsInterface() && dst.Kind() != types.TBLANK {
var missing, have *types.Field var missing, have *types.Field
var ptr int var ptr int
var why string var why string
@ -323,14 +323,14 @@ func assignop(src, dst *types.Type) (ir.Op, string) {
// src and dst have identical element types, and // src and dst have identical element types, and
// either src or dst is not a named type. // either src or dst is not a named type.
if src.IsChan() && src.ChanDir() == types.Cboth && dst.IsChan() { if src.IsChan() && src.ChanDir() == types.Cboth && dst.IsChan() {
if types.Identical(src.Elem(), dst.Elem()) && (src.Sym == nil || dst.Sym == nil) { if types.Identical(src.Elem(), dst.Elem()) && (src.Sym() == nil || dst.Sym() == nil) {
return ir.OCONVNOP, "" return ir.OCONVNOP, ""
} }
} }
// 5. src is the predeclared identifier nil and dst is a nillable type. // 5. src is the predeclared identifier nil and dst is a nillable type.
if src.Etype == types.TNIL { if src.Kind() == types.TNIL {
switch dst.Etype { switch dst.Kind() {
case types.TPTR, case types.TPTR,
types.TFUNC, types.TFUNC,
types.TMAP, types.TMAP,
@ -344,7 +344,7 @@ func assignop(src, dst *types.Type) (ir.Op, string) {
// 6. rule about untyped constants - already converted by defaultlit. // 6. rule about untyped constants - already converted by defaultlit.
// 7. Any typed value can be assigned to the blank identifier. // 7. Any typed value can be assigned to the blank identifier.
if dst.Etype == types.TBLANK { if dst.Kind() == types.TBLANK {
return ir.OCONVNOP, "" return ir.OCONVNOP, ""
} }
@ -373,7 +373,7 @@ func convertop(srcConstant bool, src, dst *types.Type) (ir.Op, string) {
return ir.OXXX, why return ir.OXXX, why
} }
// (b) Disallow string to []T where T is go:notinheap. // (b) Disallow string to []T where T is go:notinheap.
if src.IsString() && dst.IsSlice() && dst.Elem().NotInHeap() && (dst.Elem().Etype == types.Bytetype.Etype || dst.Elem().Etype == types.Runetype.Etype) { if src.IsString() && dst.IsSlice() && dst.Elem().NotInHeap() && (dst.Elem().Kind() == types.ByteType.Kind() || dst.Elem().Kind() == types.RuneType.Kind()) {
why := fmt.Sprintf(":\n\t%v is incomplete (or unallocatable)", dst.Elem()) why := fmt.Sprintf(":\n\t%v is incomplete (or unallocatable)", dst.Elem())
return ir.OXXX, why return ir.OXXX, why
} }
@ -393,21 +393,21 @@ func convertop(srcConstant bool, src, dst *types.Type) (ir.Op, string) {
} }
// 2. Ignoring struct tags, src and dst have identical underlying types. // 2. Ignoring struct tags, src and dst have identical underlying types.
if types.IdenticalIgnoreTags(src.Orig, dst.Orig) { if types.IdenticalIgnoreTags(src.Underlying(), dst.Underlying()) {
return ir.OCONVNOP, "" return ir.OCONVNOP, ""
} }
// 3. src and dst are unnamed pointer types and, ignoring struct tags, // 3. src and dst are unnamed pointer types and, ignoring struct tags,
// their base types have identical underlying types. // their base types have identical underlying types.
if src.IsPtr() && dst.IsPtr() && src.Sym == nil && dst.Sym == nil { if src.IsPtr() && dst.IsPtr() && src.Sym() == nil && dst.Sym() == nil {
if types.IdenticalIgnoreTags(src.Elem().Orig, dst.Elem().Orig) { if types.IdenticalIgnoreTags(src.Elem().Underlying(), dst.Elem().Underlying()) {
return ir.OCONVNOP, "" return ir.OCONVNOP, ""
} }
} }
// 4. src and dst are both integer or floating point types. // 4. src and dst are both integer or floating point types.
if (src.IsInteger() || src.IsFloat()) && (dst.IsInteger() || dst.IsFloat()) { if (src.IsInteger() || src.IsFloat()) && (dst.IsInteger() || dst.IsFloat()) {
if simtype[src.Etype] == simtype[dst.Etype] { if simtype[src.Kind()] == simtype[dst.Kind()] {
return ir.OCONVNOP, "" return ir.OCONVNOP, ""
} }
return ir.OCONV, "" return ir.OCONV, ""
@ -415,7 +415,7 @@ func convertop(srcConstant bool, src, dst *types.Type) (ir.Op, string) {
// 5. src and dst are both complex types. // 5. src and dst are both complex types.
if src.IsComplex() && dst.IsComplex() { if src.IsComplex() && dst.IsComplex() {
if simtype[src.Etype] == simtype[dst.Etype] { if simtype[src.Kind()] == simtype[dst.Kind()] {
return ir.OCONVNOP, "" return ir.OCONVNOP, ""
} }
return ir.OCONV, "" return ir.OCONV, ""
@ -435,10 +435,10 @@ func convertop(srcConstant bool, src, dst *types.Type) (ir.Op, string) {
} }
if src.IsSlice() && dst.IsString() { if src.IsSlice() && dst.IsString() {
if src.Elem().Etype == types.Bytetype.Etype { if src.Elem().Kind() == types.ByteType.Kind() {
return ir.OBYTES2STR, "" return ir.OBYTES2STR, ""
} }
if src.Elem().Etype == types.Runetype.Etype { if src.Elem().Kind() == types.RuneType.Kind() {
return ir.ORUNES2STR, "" return ir.ORUNES2STR, ""
} }
} }
@ -446,10 +446,10 @@ func convertop(srcConstant bool, src, dst *types.Type) (ir.Op, string) {
// 7. src is a string and dst is []byte or []rune. // 7. src is a string and dst is []byte or []rune.
// String to slice. // String to slice.
if src.IsString() && dst.IsSlice() { if src.IsString() && dst.IsSlice() {
if dst.Elem().Etype == types.Bytetype.Etype { if dst.Elem().Kind() == types.ByteType.Kind() {
return ir.OSTR2BYTES, "" return ir.OSTR2BYTES, ""
} }
if dst.Elem().Etype == types.Runetype.Etype { if dst.Elem().Kind() == types.RuneType.Kind() {
return ir.OSTR2RUNES, "" return ir.OSTR2RUNES, ""
} }
} }
@ -467,7 +467,7 @@ func convertop(srcConstant bool, src, dst *types.Type) (ir.Op, string) {
// src is map and dst is a pointer to corresponding hmap. // src is map and dst is a pointer to corresponding hmap.
// This rule is needed for the implementation detail that // This rule is needed for the implementation detail that
// go gc maps are implemented as a pointer to a hmap struct. // go gc maps are implemented as a pointer to a hmap struct.
if src.Etype == types.TMAP && dst.IsPtr() && if src.Kind() == types.TMAP && dst.IsPtr() &&
src.MapType().Hmap == dst.Elem() { src.MapType().Hmap == dst.Elem() {
return ir.OCONVNOP, "" return ir.OCONVNOP, ""
} }
@ -485,7 +485,7 @@ func assignconvfn(n ir.Node, t *types.Type, context func() string) ir.Node {
return n return n
} }
if t.Etype == types.TBLANK && n.Type().Etype == types.TNIL { if t.Kind() == types.TBLANK && n.Type().Kind() == types.TNIL {
base.Errorf("use of untyped nil") base.Errorf("use of untyped nil")
} }
@ -493,7 +493,7 @@ func assignconvfn(n ir.Node, t *types.Type, context func() string) ir.Node {
if n.Type() == nil { if n.Type() == nil {
return n return n
} }
if t.Etype == types.TBLANK { if t.Kind() == types.TBLANK {
return n return n
} }
@ -600,15 +600,15 @@ func calcHasCall(n ir.Node) bool {
// When using soft-float, these ops might be rewritten to function calls // When using soft-float, these ops might be rewritten to function calls
// so we ensure they are evaluated first. // so we ensure they are evaluated first.
case ir.OADD, ir.OSUB, ir.ONEG, ir.OMUL: case ir.OADD, ir.OSUB, ir.ONEG, ir.OMUL:
if thearch.SoftFloat && (isFloat[n.Type().Etype] || isComplex[n.Type().Etype]) { if thearch.SoftFloat && (isFloat[n.Type().Kind()] || isComplex[n.Type().Kind()]) {
return true return true
} }
case ir.OLT, ir.OEQ, ir.ONE, ir.OLE, ir.OGE, ir.OGT: case ir.OLT, ir.OEQ, ir.ONE, ir.OLE, ir.OGE, ir.OGT:
if thearch.SoftFloat && (isFloat[n.Left().Type().Etype] || isComplex[n.Left().Type().Etype]) { if thearch.SoftFloat && (isFloat[n.Left().Type().Kind()] || isComplex[n.Left().Type().Kind()]) {
return true return true
} }
case ir.OCONV: case ir.OCONV:
if thearch.SoftFloat && ((isFloat[n.Type().Etype] || isComplex[n.Type().Etype]) || (isFloat[n.Left().Type().Etype] || isComplex[n.Left().Type().Etype])) { if thearch.SoftFloat && ((isFloat[n.Type().Kind()] || isComplex[n.Type().Kind()]) || (isFloat[n.Left().Type().Kind()] || isComplex[n.Left().Type().Kind()])) {
return true return true
} }
} }
@ -802,7 +802,7 @@ func lookdot0(s *types.Sym, t *types.Type, save **types.Field, ignorecase bool)
} }
u = t u = t
if t.Sym != nil && t.IsPtr() && !t.Elem().IsPtr() { if t.Sym() != nil && t.IsPtr() && !t.Elem().IsPtr() {
// If t is a defined pointer type, then x.m is shorthand for (*x).m. // If t is a defined pointer type, then x.m is shorthand for (*x).m.
u = t.Elem() u = t.Elem()
} }
@ -1110,13 +1110,13 @@ func genwrapper(rcvr *types.Type, method *types.Field, newnam *types.Sym) {
// Only generate (*T).M wrappers for T.M in T's own package. // Only generate (*T).M wrappers for T.M in T's own package.
if rcvr.IsPtr() && rcvr.Elem() == method.Type.Recv().Type && if rcvr.IsPtr() && rcvr.Elem() == method.Type.Recv().Type &&
rcvr.Elem().Sym != nil && rcvr.Elem().Sym.Pkg != ir.LocalPkg { rcvr.Elem().Sym() != nil && rcvr.Elem().Sym().Pkg != ir.LocalPkg {
return return
} }
// Only generate I.M wrappers for I in I's own package // Only generate I.M wrappers for I in I's own package
// but keep doing it for error.Error (was issue #29304). // but keep doing it for error.Error (was issue #29304).
if rcvr.IsInterface() && rcvr.Sym != nil && rcvr.Sym.Pkg != ir.LocalPkg && rcvr != types.Errortype { if rcvr.IsInterface() && rcvr.Sym() != nil && rcvr.Sym().Pkg != ir.LocalPkg && rcvr != types.ErrorType {
return return
} }
@ -1193,7 +1193,7 @@ func genwrapper(rcvr *types.Type, method *types.Field, newnam *types.Sym) {
// Inline calls within (*T).M wrappers. This is safe because we only // Inline calls within (*T).M wrappers. This is safe because we only
// generate those wrappers within the same compilation unit as (T).M. // generate those wrappers within the same compilation unit as (T).M.
// TODO(mdempsky): Investigate why we can't enable this more generally. // TODO(mdempsky): Investigate why we can't enable this more generally.
if rcvr.IsPtr() && rcvr.Elem() == method.Type.Recv().Type && rcvr.Elem().Sym != nil { if rcvr.IsPtr() && rcvr.Elem() == method.Type.Recv().Type && rcvr.Elem().Sym() != nil {
inlcalls(fn) inlcalls(fn)
} }
escapeFuncs([]*ir.Func{fn}, false) escapeFuncs([]*ir.Func{fn}, false)
@ -1433,7 +1433,7 @@ func isdirectiface(t *types.Type) bool {
return false return false
} }
switch t.Etype { switch t.Kind() {
case types.TPTR: case types.TPTR:
// Pointers to notinheap types must be stored indirectly. See issue 42076. // Pointers to notinheap types must be stored indirectly. See issue 42076.
return !t.Elem().NotInHeap() return !t.Elem().NotInHeap()

View File

@ -157,7 +157,7 @@ func typecheckExprSwitch(n ir.Node) {
switch { switch {
case t.IsMap(): case t.IsMap():
nilonly = "map" nilonly = "map"
case t.Etype == types.TFUNC: case t.Kind() == types.TFUNC:
nilonly = "func" nilonly = "func"
case t.IsSlice(): case t.IsSlice():
nilonly = "slice" nilonly = "slice"
@ -332,7 +332,7 @@ type exprClause struct {
func (s *exprSwitch) Add(pos src.XPos, expr, jmp ir.Node) { func (s *exprSwitch) Add(pos src.XPos, expr, jmp ir.Node) {
c := exprClause{pos: pos, lo: expr, hi: expr, jmp: jmp} c := exprClause{pos: pos, lo: expr, hi: expr, jmp: jmp}
if okforcmp[s.exprname.Type().Etype] && expr.Op() == ir.OLITERAL { if okforcmp[s.exprname.Type().Kind()] && expr.Op() == ir.OLITERAL {
s.clauses = append(s.clauses, c) s.clauses = append(s.clauses, c)
return return
} }

View File

@ -156,7 +156,7 @@ func typekind(t *types.Type) string {
if t.IsUntyped() { if t.IsUntyped() {
return fmt.Sprintf("%v", t) return fmt.Sprintf("%v", t)
} }
et := t.Etype et := t.Kind()
if int(et) < len(_typekind) { if int(et) < len(_typekind) {
s := _typekind[et] s := _typekind[et]
if s != "" { if s != "" {
@ -329,7 +329,7 @@ func typecheck(n ir.Node, top int) (res ir.Node) {
// The result of indexlit MUST be assigned back to n, e.g. // The result of indexlit MUST be assigned back to n, e.g.
// n.Left = indexlit(n.Left) // n.Left = indexlit(n.Left)
func indexlit(n ir.Node) ir.Node { func indexlit(n ir.Node) ir.Node {
if n != nil && n.Type() != nil && n.Type().Etype == types.TIDEAL { if n != nil && n.Type() != nil && n.Type().Kind() == types.TIDEAL {
return defaultlit(n, types.Types[types.TINT]) return defaultlit(n, types.Types[types.TINT])
} }
return n return n
@ -583,7 +583,7 @@ func typecheck1(n ir.Node, top int) (res ir.Node) {
n.SetType(nil) n.SetType(nil)
return n return n
} }
if n.Implicit() && !okforarith[l.Type().Etype] { if n.Implicit() && !okforarith[l.Type().Kind()] {
base.Errorf("invalid operation: %v (non-numeric type %v)", n, l.Type()) base.Errorf("invalid operation: %v (non-numeric type %v)", n, l.Type())
n.SetType(nil) n.SetType(nil)
return n return n
@ -617,7 +617,7 @@ func typecheck1(n ir.Node, top int) (res ir.Node) {
return n return n
} }
t = l.Type() t = l.Type()
if t != nil && t.Etype != types.TIDEAL && !t.IsInteger() { if t != nil && t.Kind() != types.TIDEAL && !t.IsInteger() {
base.Errorf("invalid operation: %v (shift of type %v)", n, t) base.Errorf("invalid operation: %v (shift of type %v)", n, t)
n.SetType(nil) n.SetType(nil)
return n return n
@ -659,15 +659,15 @@ func typecheck1(n ir.Node, top int) (res ir.Node) {
return n return n
} }
t := l.Type() t := l.Type()
if t.Etype == types.TIDEAL { if t.Kind() == types.TIDEAL {
t = r.Type() t = r.Type()
} }
et := t.Etype et := t.Kind()
if et == types.TIDEAL { if et == types.TIDEAL {
et = types.TINT et = types.TINT
} }
aop := ir.OXXX aop := ir.OXXX
if iscmp[n.Op()] && t.Etype != types.TIDEAL && !types.Identical(l.Type(), r.Type()) { if iscmp[n.Op()] && t.Kind() != types.TIDEAL && !types.Identical(l.Type(), r.Type()) {
// comparison is okay as long as one side is // comparison is okay as long as one side is
// assignable to the other. convert so they have // assignable to the other. convert so they have
// the same type. // the same type.
@ -676,7 +676,7 @@ func typecheck1(n ir.Node, top int) (res ir.Node) {
// in that case, check comparability of the concrete type. // in that case, check comparability of the concrete type.
// The conversion allocates, so only do it if the concrete type is huge. // The conversion allocates, so only do it if the concrete type is huge.
converted := false converted := false
if r.Type().Etype != types.TBLANK { if r.Type().Kind() != types.TBLANK {
aop, _ = assignop(l.Type(), r.Type()) aop, _ = assignop(l.Type(), r.Type())
if aop != ir.OXXX { if aop != ir.OXXX {
if r.Type().IsInterface() && !l.Type().IsInterface() && !IsComparable(l.Type()) { if r.Type().IsInterface() && !l.Type().IsInterface() && !IsComparable(l.Type()) {
@ -698,7 +698,7 @@ func typecheck1(n ir.Node, top int) (res ir.Node) {
} }
} }
if !converted && l.Type().Etype != types.TBLANK { if !converted && l.Type().Kind() != types.TBLANK {
aop, _ = assignop(r.Type(), l.Type()) aop, _ = assignop(r.Type(), l.Type())
if aop != ir.OXXX { if aop != ir.OXXX {
if l.Type().IsInterface() && !r.Type().IsInterface() && !IsComparable(r.Type()) { if l.Type().IsInterface() && !r.Type().IsInterface() && !IsComparable(r.Type()) {
@ -719,10 +719,10 @@ func typecheck1(n ir.Node, top int) (res ir.Node) {
} }
} }
et = t.Etype et = t.Kind()
} }
if t.Etype != types.TIDEAL && !types.Identical(l.Type(), r.Type()) { if t.Kind() != types.TIDEAL && !types.Identical(l.Type(), r.Type()) {
l, r = defaultlit2(l, r, true) l, r = defaultlit2(l, r, true)
if l.Type() == nil || r.Type() == nil { if l.Type() == nil || r.Type() == nil {
n.SetType(nil) n.SetType(nil)
@ -735,10 +735,10 @@ func typecheck1(n ir.Node, top int) (res ir.Node) {
} }
} }
if t.Etype == types.TIDEAL { if t.Kind() == types.TIDEAL {
t = mixUntyped(l.Type(), r.Type()) t = mixUntyped(l.Type(), r.Type())
} }
if dt := defaultType(t); !okfor[op][dt.Etype] { if dt := defaultType(t); !okfor[op][dt.Kind()] {
base.Errorf("invalid operation: %v (operator %v not defined on %s)", n, op, typekind(t)) base.Errorf("invalid operation: %v (operator %v not defined on %s)", n, op, typekind(t))
n.SetType(nil) n.SetType(nil)
return n return n
@ -764,7 +764,7 @@ func typecheck1(n ir.Node, top int) (res ir.Node) {
return n return n
} }
if l.Type().Etype == types.TFUNC && !ir.IsNil(l) && !ir.IsNil(r) { if l.Type().Kind() == types.TFUNC && !ir.IsNil(l) && !ir.IsNil(r) {
base.Errorf("invalid operation: %v (func can only be compared to nil)", n) base.Errorf("invalid operation: %v (func can only be compared to nil)", n)
n.SetType(nil) n.SetType(nil)
return n return n
@ -825,7 +825,7 @@ func typecheck1(n ir.Node, top int) (res ir.Node) {
n.SetType(nil) n.SetType(nil)
return n return n
} }
if !okfor[n.Op()][defaultType(t).Etype] { if !okfor[n.Op()][defaultType(t).Kind()] {
base.Errorf("invalid operation: %v (operator %v not defined on %s)", n, n.Op(), typekind(t)) base.Errorf("invalid operation: %v (operator %v not defined on %s)", n, n.Op(), typekind(t))
n.SetType(nil) n.SetType(nil)
return n return n
@ -1023,7 +1023,7 @@ func typecheck1(n ir.Node, top int) (res ir.Node) {
n.SetType(nil) n.SetType(nil)
return n return n
} }
switch t.Etype { switch t.Kind() {
default: default:
base.Errorf("invalid operation: %v (type %v does not support indexing)", n, t) base.Errorf("invalid operation: %v (type %v does not support indexing)", n, t)
n.SetType(nil) n.SetType(nil)
@ -1032,7 +1032,7 @@ func typecheck1(n ir.Node, top int) (res ir.Node) {
case types.TSTRING, types.TARRAY, types.TSLICE: case types.TSTRING, types.TARRAY, types.TSLICE:
n.SetRight(indexlit(n.Right())) n.SetRight(indexlit(n.Right()))
if t.IsString() { if t.IsString() {
n.SetType(types.Bytetype) n.SetType(types.ByteType)
} else { } else {
n.SetType(t.Elem()) n.SetType(t.Elem())
} }
@ -1191,7 +1191,7 @@ func typecheck1(n ir.Node, top int) (res ir.Node) {
n.SetLeft(defaultlit(n.Left(), types.Types[types.TINT])) n.SetLeft(defaultlit(n.Left(), types.Types[types.TINT]))
if !n.Left().Type().IsInteger() && n.Type().Etype != types.TIDEAL { if !n.Left().Type().IsInteger() && n.Type().Kind() != types.TIDEAL {
base.Errorf("non-integer len argument in OMAKESLICECOPY") base.Errorf("non-integer len argument in OMAKESLICECOPY")
} }
@ -1383,7 +1383,7 @@ func typecheck1(n ir.Node, top int) (res ir.Node) {
default: default:
n.SetOp(ir.OCALLFUNC) n.SetOp(ir.OCALLFUNC)
if t.Etype != types.TFUNC { if t.Kind() != types.TFUNC {
name := l.String() name := l.String()
if isBuiltinFuncName(name) && l.Name().Defn != nil { if isBuiltinFuncName(name) && l.Name().Defn != nil {
// be more specific when the function // be more specific when the function
@ -1446,9 +1446,9 @@ func typecheck1(n ir.Node, top int) (res ir.Node) {
var ok bool var ok bool
if n.Op() == ir.OLEN { if n.Op() == ir.OLEN {
ok = okforlen[t.Etype] ok = okforlen[t.Kind()]
} else { } else {
ok = okforcap[t.Etype] ok = okforcap[t.Kind()]
} }
if !ok { if !ok {
base.Errorf("invalid argument %L for %v", l, n.Op()) base.Errorf("invalid argument %L for %v", l, n.Op())
@ -1469,7 +1469,7 @@ func typecheck1(n ir.Node, top int) (res ir.Node) {
} }
// Determine result type. // Determine result type.
switch t.Etype { switch t.Kind() {
case types.TIDEAL: case types.TIDEAL:
n.SetType(types.UntypedFloat) n.SetType(types.UntypedFloat)
case types.TCOMPLEX64: case types.TCOMPLEX64:
@ -1505,7 +1505,7 @@ func typecheck1(n ir.Node, top int) (res ir.Node) {
} }
var t *types.Type var t *types.Type
switch l.Type().Etype { switch l.Type().Kind() {
default: default:
base.Errorf("invalid operation: %v (arguments have type %v, expected floating-point)", n, l.Type()) base.Errorf("invalid operation: %v (arguments have type %v, expected floating-point)", n, l.Type())
n.SetType(nil) n.SetType(nil)
@ -1624,7 +1624,7 @@ func typecheck1(n ir.Node, top int) (res ir.Node) {
break break
} }
args.SetSecond(assignconv(args.Second(), t.Orig, "append")) args.SetSecond(assignconv(args.Second(), t.Underlying(), "append"))
break break
} }
@ -1651,7 +1651,7 @@ func typecheck1(n ir.Node, top int) (res ir.Node) {
// copy([]byte, string) // copy([]byte, string)
if n.Left().Type().IsSlice() && n.Right().Type().IsString() { if n.Left().Type().IsSlice() && n.Right().Type().IsString() {
if types.Identical(n.Left().Type().Elem(), types.Bytetype) { if types.Identical(n.Left().Type().Elem(), types.ByteType) {
break break
} }
base.Errorf("arguments to copy have different element types: %L and string", n.Left().Type()) base.Errorf("arguments to copy have different element types: %L and string", n.Left().Type())
@ -1701,8 +1701,8 @@ func typecheck1(n ir.Node, top int) (res ir.Node) {
n.SetOp(op) n.SetOp(op)
switch n.Op() { switch n.Op() {
case ir.OCONVNOP: case ir.OCONVNOP:
if t.Etype == n.Type().Etype { if t.Kind() == n.Type().Kind() {
switch t.Etype { switch t.Kind() {
case types.TFLOAT32, types.TFLOAT64, types.TCOMPLEX64, types.TCOMPLEX128: case types.TFLOAT32, types.TFLOAT64, types.TCOMPLEX64, types.TCOMPLEX128:
// Floating point casts imply rounding and // Floating point casts imply rounding and
// so the conversion must be kept. // so the conversion must be kept.
@ -1741,7 +1741,7 @@ func typecheck1(n ir.Node, top int) (res ir.Node) {
i := 1 i := 1
var nn ir.Node var nn ir.Node
switch t.Etype { switch t.Kind() {
default: default:
base.Errorf("cannot make type %v", t) base.Errorf("cannot make type %v", t)
n.SetType(nil) n.SetType(nil)
@ -2062,7 +2062,7 @@ func typecheck1(n ir.Node, top int) (res ir.Node) {
t := n.Type() t := n.Type()
if t != nil && !t.IsFuncArgStruct() && n.Op() != ir.OTYPE { if t != nil && !t.IsFuncArgStruct() && n.Op() != ir.OTYPE {
switch t.Etype { switch t.Kind() {
case types.TFUNC, // might have TANY; wait until it's called case types.TFUNC, // might have TANY; wait until it's called
types.TANY, types.TFORW, types.TIDEAL, types.TNIL, types.TBLANK: types.TANY, types.TFORW, types.TIDEAL, types.TNIL, types.TBLANK:
break break
@ -2352,7 +2352,7 @@ func typecheckMethodExpr(n ir.Node) (res ir.Node) {
// types declared at package scope. However, we need // types declared at package scope. However, we need
// to make sure to generate wrappers for anonymous // to make sure to generate wrappers for anonymous
// receiver types too. // receiver types too.
if mt.Sym == nil { if mt.Sym() == nil {
addsignat(t) addsignat(t)
} }
} }
@ -2385,7 +2385,7 @@ func typecheckMethodExpr(n ir.Node) (res ir.Node) {
me.SetOpt(m) me.SetOpt(m)
// Issue 25065. Make sure that we emit the symbol for a local method. // Issue 25065. Make sure that we emit the symbol for a local method.
if base.Ctxt.Flag_dynlink && !inimport && (t.Sym == nil || t.Sym.Pkg == ir.LocalPkg) { if base.Ctxt.Flag_dynlink && !inimport && (t.Sym() == nil || t.Sym().Pkg == ir.LocalPkg) {
makefuncsym(me.Sym()) makefuncsym(me.Sym())
} }
@ -2417,7 +2417,7 @@ func lookdot(n ir.Node, t *types.Type, dostrcmp int) *types.Field {
} }
var f2 *types.Field var f2 *types.Field
if n.Left().Type() == t || n.Left().Type().Sym == nil { if n.Left().Type() == t || n.Left().Type().Sym() == nil {
mt := methtype(t) mt := methtype(t)
if mt != nil { if mt != nil {
f2 = lookdot1(n, s, mt, mt.Methods(), dostrcmp) f2 = lookdot1(n, s, mt, mt.Methods(), dostrcmp)
@ -2493,7 +2493,7 @@ func lookdot(n ir.Node, t *types.Type, dostrcmp int) *types.Field {
pll = ll pll = ll
ll = ll.Left() ll = ll.Left()
} }
if pll.Implicit() && ll.Type().IsPtr() && ll.Type().Sym != nil && ir.AsNode(ll.Type().Sym.Def) != nil && ir.AsNode(ll.Type().Sym.Def).Op() == ir.OTYPE { if pll.Implicit() && ll.Type().IsPtr() && ll.Type().Sym() != nil && ir.AsNode(ll.Type().Sym().Def) != nil && ir.AsNode(ll.Type().Sym().Def).Op() == ir.OTYPE {
// It is invalid to automatically dereference a named pointer type when selecting a method. // It is invalid to automatically dereference a named pointer type when selecting a method.
// Make n.Left == ll to clarify error message. // Make n.Left == ll to clarify error message.
n.SetLeft(ll) n.SetLeft(ll)
@ -2681,7 +2681,7 @@ func sigrepr(t *types.Type, isddd bool) string {
return "bool" return "bool"
} }
if t.Etype == types.TIDEAL { if t.Kind() == types.TIDEAL {
// "untyped number" is not commonly used // "untyped number" is not commonly used
// outside of the compiler, so let's use "number". // outside of the compiler, so let's use "number".
// TODO(mdempsky): Revisit this. // TODO(mdempsky): Revisit this.
@ -2724,7 +2724,7 @@ func fielddup(name string, hash map[string]bool) {
// iscomptype reports whether type t is a composite literal type. // iscomptype reports whether type t is a composite literal type.
func iscomptype(t *types.Type) bool { func iscomptype(t *types.Type) bool {
switch t.Etype { switch t.Kind() {
case types.TARRAY, types.TSLICE, types.TSTRUCT, types.TMAP: case types.TARRAY, types.TSLICE, types.TSTRUCT, types.TMAP:
return true return true
default: default:
@ -2801,7 +2801,7 @@ func typecheckcomplit(n ir.Node) (res ir.Node) {
} }
n.SetType(t) n.SetType(t)
switch t.Etype { switch t.Kind() {
default: default:
base.Errorf("invalid composite literal type %v", t) base.Errorf("invalid composite literal type %v", t)
n.SetType(nil) n.SetType(nil)
@ -3154,7 +3154,7 @@ func samesafeexpr(l ir.Node, r ir.Node) bool {
case ir.OCONV: case ir.OCONV:
// Some conversions can't be reused, such as []byte(str). // Some conversions can't be reused, such as []byte(str).
// Allow only numeric-ish types. This is a bit conservative. // Allow only numeric-ish types. This is a bit conservative.
return issimple[l.Type().Etype] && samesafeexpr(l.Left(), r.Left()) return issimple[l.Type().Kind()] && samesafeexpr(l.Left(), r.Left())
case ir.OINDEX, ir.OINDEXMAP, case ir.OINDEX, ir.OINDEXMAP,
ir.OADD, ir.OSUB, ir.OOR, ir.OXOR, ir.OMUL, ir.OLSH, ir.ORSH, ir.OAND, ir.OANDNOT, ir.ODIV, ir.OMOD: ir.OADD, ir.OSUB, ir.OOR, ir.OXOR, ir.OMUL, ir.OLSH, ir.ORSH, ir.OAND, ir.OANDNOT, ir.ODIV, ir.OMOD:
@ -3451,7 +3451,7 @@ func typecheckdeftype(n *ir.Name) {
n.SetDiag(true) n.SetDiag(true)
n.SetType(nil) n.SetType(nil)
} }
if t.Etype == types.TFORW && base.Errors() > errorsBefore { if t.Kind() == types.TFORW && base.Errors() > errorsBefore {
// Something went wrong during type-checking, // Something went wrong during type-checking,
// but it was reported. Silence future errors. // but it was reported. Silence future errors.
t.SetBroke(true) t.SetBroke(true)
@ -3541,7 +3541,7 @@ func typecheckdef(n ir.Node) {
t := n.Type() t := n.Type()
if t != nil { if t != nil {
if !ir.OKForConst[t.Etype] { if !ir.OKForConst[t.Kind()] {
base.ErrorfAt(n.Pos(), "invalid constant type %v", t) base.ErrorfAt(n.Pos(), "invalid constant type %v", t)
goto ret goto ret
} }
@ -3638,7 +3638,7 @@ ret:
func checkmake(t *types.Type, arg string, np *ir.Node) bool { func checkmake(t *types.Type, arg string, np *ir.Node) bool {
n := *np n := *np
if !n.Type().IsInteger() && n.Type().Etype != types.TIDEAL { if !n.Type().IsInteger() && n.Type().Kind() != types.TIDEAL {
base.Errorf("non-integer %s argument in make(%v) - %v", arg, t, n.Type()) base.Errorf("non-integer %s argument in make(%v) - %v", arg, t, n.Type())
return false return false
} }

View File

@ -15,7 +15,7 @@ import (
var basicTypes = [...]struct { var basicTypes = [...]struct {
name string name string
etype types.EType etype types.Kind
}{ }{
{"int8", types.TINT8}, {"int8", types.TINT8},
{"int16", types.TINT16}, {"int16", types.TINT16},
@ -35,9 +35,9 @@ var basicTypes = [...]struct {
var typedefs = [...]struct { var typedefs = [...]struct {
name string name string
etype types.EType etype types.Kind
sameas32 types.EType sameas32 types.Kind
sameas64 types.EType sameas64 types.Kind
}{ }{
{"int", types.TINT, types.TINT32, types.TINT64}, {"int", types.TINT, types.TINT32, types.TINT64},
{"uint", types.TUINT, types.TUINT32, types.TUINT64}, {"uint", types.TUINT, types.TUINT32, types.TUINT64},
@ -99,14 +99,14 @@ func initUniverse() {
// string is same as slice wo the cap // string is same as slice wo the cap
sizeofString = Rnd(sliceLenOffset+int64(Widthptr), int64(Widthptr)) sizeofString = Rnd(sliceLenOffset+int64(Widthptr), int64(Widthptr))
for et := types.EType(0); et < types.NTYPE; et++ { for et := types.Kind(0); et < types.NTYPE; et++ {
simtype[et] = et simtype[et] = et
} }
types.Types[types.TANY] = types.New(types.TANY) types.Types[types.TANY] = types.New(types.TANY)
types.Types[types.TINTER] = types.New(types.TINTER) // empty interface types.Types[types.TINTER] = types.New(types.TINTER) // empty interface
defBasic := func(kind types.EType, pkg *types.Pkg, name string) *types.Type { defBasic := func(kind types.Kind, pkg *types.Pkg, name string) *types.Type {
sym := pkg.Lookup(name) sym := pkg.Lookup(name)
n := ir.NewNameAt(src.NoXPos, sym) n := ir.NewNameAt(src.NoXPos, sym)
n.SetOp(ir.OTYPE) n.SetOp(ir.OTYPE)
@ -140,18 +140,18 @@ func initUniverse() {
// of less informative error messages involving bytes and runes)? // of less informative error messages involving bytes and runes)?
// (Alternatively, we could introduce an OTALIAS node representing // (Alternatively, we could introduce an OTALIAS node representing
// type aliases, albeit at the cost of having to deal with it everywhere). // type aliases, albeit at the cost of having to deal with it everywhere).
types.Bytetype = defBasic(types.TUINT8, ir.BuiltinPkg, "byte") types.ByteType = defBasic(types.TUINT8, ir.BuiltinPkg, "byte")
types.Runetype = defBasic(types.TINT32, ir.BuiltinPkg, "rune") types.RuneType = defBasic(types.TINT32, ir.BuiltinPkg, "rune")
// error type // error type
s := ir.BuiltinPkg.Lookup("error") s := ir.BuiltinPkg.Lookup("error")
n := ir.NewNameAt(src.NoXPos, s) n := ir.NewNameAt(src.NoXPos, s)
n.SetOp(ir.OTYPE) n.SetOp(ir.OTYPE)
types.Errortype = types.NewNamed(n) types.ErrorType = types.NewNamed(n)
types.Errortype.SetUnderlying(makeErrorInterface()) types.ErrorType.SetUnderlying(makeErrorInterface())
n.SetType(types.Errortype) n.SetType(types.ErrorType)
s.Def = n s.Def = n
dowidth(types.Errortype) dowidth(types.ErrorType)
types.Types[types.TUNSAFEPTR] = defBasic(types.TUNSAFEPTR, unsafepkg, "Pointer") types.Types[types.TUNSAFEPTR] = defBasic(types.TUNSAFEPTR, unsafepkg, "Pointer")
@ -218,7 +218,7 @@ func initUniverse() {
isComplex[types.TCOMPLEX128] = true isComplex[types.TCOMPLEX128] = true
// initialize okfor // initialize okfor
for et := types.EType(0); et < types.NTYPE; et++ { for et := types.Kind(0); et < types.NTYPE; et++ {
if isInt[et] || et == types.TIDEAL { if isInt[et] || et == types.TIDEAL {
okforeq[et] = true okforeq[et] = true
okforcmp[et] = true okforcmp[et] = true

View File

@ -423,7 +423,7 @@ func walkexpr(n ir.Node, init *ir.Nodes) ir.Node {
// Eagerly checkwidth all expressions for the back end. // Eagerly checkwidth all expressions for the back end.
if n.Type() != nil && !n.Type().WidthCalculated() { if n.Type() != nil && !n.Type().WidthCalculated() {
switch n.Type().Etype { switch n.Type().Kind() {
case types.TBLANK, types.TNIL, types.TIDEAL: case types.TBLANK, types.TNIL, types.TIDEAL:
default: default:
checkwidth(n.Type()) checkwidth(n.Type())
@ -975,7 +975,7 @@ opswitch:
n.SetRight(walkexpr(n.Right(), init)) n.SetRight(walkexpr(n.Right(), init))
// rewrite complex div into function call. // rewrite complex div into function call.
et := n.Left().Type().Etype et := n.Left().Type().Kind()
if isComplex[et] && n.Op() == ir.ODIV { if isComplex[et] && n.Op() == ir.ODIV {
t := n.Type() t := n.Type()
@ -1638,7 +1638,7 @@ func markUsedIfaceMethod(n ir.Node) {
// name can be derived from the names of the returned types. // name can be derived from the names of the returned types.
// //
// If no such function is necessary, it returns (Txxx, Txxx). // If no such function is necessary, it returns (Txxx, Txxx).
func rtconvfn(src, dst *types.Type) (param, result types.EType) { func rtconvfn(src, dst *types.Type) (param, result types.Kind) {
if thearch.SoftFloat { if thearch.SoftFloat {
return types.Txxx, types.Txxx return types.Txxx, types.Txxx
} }
@ -1646,31 +1646,31 @@ func rtconvfn(src, dst *types.Type) (param, result types.EType) {
switch thearch.LinkArch.Family { switch thearch.LinkArch.Family {
case sys.ARM, sys.MIPS: case sys.ARM, sys.MIPS:
if src.IsFloat() { if src.IsFloat() {
switch dst.Etype { switch dst.Kind() {
case types.TINT64, types.TUINT64: case types.TINT64, types.TUINT64:
return types.TFLOAT64, dst.Etype return types.TFLOAT64, dst.Kind()
} }
} }
if dst.IsFloat() { if dst.IsFloat() {
switch src.Etype { switch src.Kind() {
case types.TINT64, types.TUINT64: case types.TINT64, types.TUINT64:
return src.Etype, types.TFLOAT64 return src.Kind(), types.TFLOAT64
} }
} }
case sys.I386: case sys.I386:
if src.IsFloat() { if src.IsFloat() {
switch dst.Etype { switch dst.Kind() {
case types.TINT64, types.TUINT64: case types.TINT64, types.TUINT64:
return types.TFLOAT64, dst.Etype return types.TFLOAT64, dst.Kind()
case types.TUINT32, types.TUINT, types.TUINTPTR: case types.TUINT32, types.TUINT, types.TUINTPTR:
return types.TFLOAT64, types.TUINT32 return types.TFLOAT64, types.TUINT32
} }
} }
if dst.IsFloat() { if dst.IsFloat() {
switch src.Etype { switch src.Kind() {
case types.TINT64, types.TUINT64: case types.TINT64, types.TUINT64:
return src.Etype, types.TFLOAT64 return src.Kind(), types.TFLOAT64
case types.TUINT32, types.TUINT, types.TUINTPTR: case types.TUINT32, types.TUINT, types.TUINTPTR:
return types.TUINT32, types.TFLOAT64 return types.TUINT32, types.TFLOAT64
} }
@ -1937,7 +1937,7 @@ func walkprint(nn ir.Node, init *ir.Nodes) ir.Node {
for i, n := range nn.List().Slice() { for i, n := range nn.List().Slice() {
if n.Op() == ir.OLITERAL { if n.Op() == ir.OLITERAL {
if n.Type() == types.UntypedRune { if n.Type() == types.UntypedRune {
n = defaultlit(n, types.Runetype) n = defaultlit(n, types.RuneType)
} }
switch n.Val().Kind() { switch n.Val().Kind() {
@ -1949,17 +1949,17 @@ func walkprint(nn ir.Node, init *ir.Nodes) ir.Node {
} }
} }
if n.Op() != ir.OLITERAL && n.Type() != nil && n.Type().Etype == types.TIDEAL { if n.Op() != ir.OLITERAL && n.Type() != nil && n.Type().Kind() == types.TIDEAL {
n = defaultlit(n, types.Types[types.TINT64]) n = defaultlit(n, types.Types[types.TINT64])
} }
n = defaultlit(n, nil) n = defaultlit(n, nil)
nn.List().SetIndex(i, n) nn.List().SetIndex(i, n)
if n.Type() == nil || n.Type().Etype == types.TFORW { if n.Type() == nil || n.Type().Kind() == types.TFORW {
continue continue
} }
var on ir.Node var on ir.Node
switch n.Type().Etype { switch n.Type().Kind() {
case types.TINTER: case types.TINTER:
if n.Type().IsEmptyInterface() { if n.Type().IsEmptyInterface() {
on = syslook("printeface") on = syslook("printeface")
@ -1984,7 +1984,7 @@ func walkprint(nn ir.Node, init *ir.Nodes) ir.Node {
on = syslook("printslice") on = syslook("printslice")
on = substArgTypes(on, n.Type()) // any-1 on = substArgTypes(on, n.Type()) // any-1
case types.TUINT, types.TUINT8, types.TUINT16, types.TUINT32, types.TUINT64, types.TUINTPTR: case types.TUINT, types.TUINT8, types.TUINT16, types.TUINT32, types.TUINT64, types.TUINTPTR:
if isRuntimePkg(n.Type().Sym.Pkg) && n.Type().Sym.Name == "hex" { if isRuntimePkg(n.Type().Sym().Pkg) && n.Type().Sym().Name == "hex" {
on = syslook("printhex") on = syslook("printhex")
} else { } else {
on = syslook("printuint") on = syslook("printuint")
@ -2058,9 +2058,9 @@ func isReflectHeaderDataField(l ir.Node) bool {
var tsym *types.Sym var tsym *types.Sym
switch l.Op() { switch l.Op() {
case ir.ODOT: case ir.ODOT:
tsym = l.Left().Type().Sym tsym = l.Left().Type().Sym()
case ir.ODOTPTR: case ir.ODOTPTR:
tsym = l.Left().Type().Elem().Sym tsym = l.Left().Type().Elem().Sym()
default: default:
return false return false
} }
@ -2484,7 +2484,7 @@ func heapmoves() {
} }
func vmkcall(fn ir.Node, t *types.Type, init *ir.Nodes, va []ir.Node) ir.Node { func vmkcall(fn ir.Node, t *types.Type, init *ir.Nodes, va []ir.Node) ir.Node {
if fn.Type() == nil || fn.Type().Etype != types.TFUNC { if fn.Type() == nil || fn.Type().Kind() != types.TFUNC {
base.Fatalf("mkcall %v %v", fn, fn.Type()) base.Fatalf("mkcall %v %v", fn, fn.Type())
} }
@ -3264,7 +3264,7 @@ func walkcompare(n ir.Node, init *ir.Nodes) ir.Node {
maxcmpsize = 2 * int64(thearch.LinkArch.RegSize) maxcmpsize = 2 * int64(thearch.LinkArch.RegSize)
} }
switch t.Etype { switch t.Kind() {
default: default:
if base.Debug.Libfuzzer != 0 && t.IsInteger() { if base.Debug.Libfuzzer != 0 && t.IsInteger() {
n.SetLeft(cheapexpr(n.Left(), init)) n.SetLeft(cheapexpr(n.Left(), init))
@ -3315,7 +3315,7 @@ func walkcompare(n ir.Node, init *ir.Nodes) ir.Node {
return n return n
case types.TARRAY: case types.TARRAY:
// We can compare several elements at once with 2/4/8 byte integer compares // We can compare several elements at once with 2/4/8 byte integer compares
inline = t.NumElem() <= 1 || (issimple[t.Elem().Etype] && (t.NumElem() <= 4 || t.Elem().Width*t.NumElem() <= maxcmpsize)) inline = t.NumElem() <= 1 || (issimple[t.Elem().Kind()] && (t.NumElem() <= 4 || t.Elem().Width*t.NumElem() <= maxcmpsize))
case types.TSTRUCT: case types.TSTRUCT:
inline = t.NumComponents(types.IgnoreBlankFields) <= 4 inline = t.NumComponents(types.IgnoreBlankFields) <= 4
} }
@ -3697,7 +3697,7 @@ func usemethod(n ir.Node) {
} }
if res1 == nil { if res1 == nil {
if p0.Type.Etype != types.TINT { if p0.Type.Kind() != types.TINT {
return return
} }
} else { } else {
@ -3712,7 +3712,7 @@ func usemethod(n ir.Node) {
// Note: Don't rely on res0.Type.String() since its formatting depends on multiple factors // Note: Don't rely on res0.Type.String() since its formatting depends on multiple factors
// (including global variables such as numImports - was issue #19028). // (including global variables such as numImports - was issue #19028).
// Also need to check for reflect package itself (see Issue #38515). // Also need to check for reflect package itself (see Issue #38515).
if s := res0.Type.Sym; s != nil && s.Name == "Method" && isReflectPkg(s.Pkg) { if s := res0.Type.Sym(); s != nil && s.Name == "Method" && isReflectPkg(s.Pkg) {
Curfn.SetReflectMethod(true) Curfn.SetReflectMethod(true)
// The LSym is initialized at this point. We need to set the attribute on the LSym. // The LSym is initialized at this point. We need to set the attribute on the LSym.
Curfn.LSym.Set(obj.AttrReflectMethod, true) Curfn.LSym.Set(obj.AttrReflectMethod, true)
@ -3756,7 +3756,7 @@ func usefield(n ir.Node) {
if outer.IsPtr() { if outer.IsPtr() {
outer = outer.Elem() outer = outer.Elem()
} }
if outer.Sym == nil { if outer.Sym() == nil {
base.Errorf("tracked field must be in named struct type") base.Errorf("tracked field must be in named struct type")
} }
if !types.IsExported(field.Sym.Name) { if !types.IsExported(field.Sym.Name) {

View File

@ -317,7 +317,7 @@ func (m FmtMode) prepareArgs(args []interface{}) {
args[i] = &fmtSym{arg, m} args[i] = &fmtSym{arg, m}
case Nodes: case Nodes:
args[i] = &fmtNodes{arg, m} args[i] = &fmtNodes{arg, m}
case int32, int64, string, types.EType, constant.Value: case int32, int64, string, types.Kind, constant.Value:
// OK: printing these types doesn't depend on mode // OK: printing these types doesn't depend on mode
default: default:
base.Fatalf("mode.prepareArgs type %T", arg) base.Fatalf("mode.prepareArgs type %T", arg)
@ -590,18 +590,18 @@ func tconv2(b *bytes.Buffer, t *types.Type, flag FmtFlag, mode FmtMode, visited
b.WriteString("<T>") b.WriteString("<T>")
return return
} }
if t.Etype == types.TSSA { if t.Kind() == types.TSSA {
b.WriteString(t.Extra.(string)) b.WriteString(t.Extra.(string))
return return
} }
if t.Etype == types.TTUPLE { if t.Kind() == types.TTUPLE {
b.WriteString(t.FieldType(0).String()) b.WriteString(t.FieldType(0).String())
b.WriteByte(',') b.WriteByte(',')
b.WriteString(t.FieldType(1).String()) b.WriteString(t.FieldType(1).String())
return return
} }
if t.Etype == types.TRESULTS { if t.Kind() == types.TRESULTS {
tys := t.Extra.(*types.Results).Types tys := t.Extra.(*types.Results).Types
for i, et := range tys { for i, et := range tys {
if i > 0 { if i > 0 {
@ -616,51 +616,51 @@ func tconv2(b *bytes.Buffer, t *types.Type, flag FmtFlag, mode FmtMode, visited
if mode == FTypeIdName { if mode == FTypeIdName {
flag |= FmtUnsigned flag |= FmtUnsigned
} }
if t == types.Bytetype || t == types.Runetype { if t == types.ByteType || t == types.RuneType {
// in %-T mode collapse rune and byte with their originals. // in %-T mode collapse rune and byte with their originals.
switch mode { switch mode {
case FTypeIdName, FTypeId: case FTypeIdName, FTypeId:
t = types.Types[t.Etype] t = types.Types[t.Kind()]
default: default:
sconv2(b, t.Sym, FmtShort, mode) sconv2(b, t.Sym(), FmtShort, mode)
return return
} }
} }
if t == types.Errortype { if t == types.ErrorType {
b.WriteString("error") b.WriteString("error")
return return
} }
// Unless the 'L' flag was specified, if the type has a name, just print that name. // Unless the 'L' flag was specified, if the type has a name, just print that name.
if flag&FmtLong == 0 && t.Sym != nil && t != types.Types[t.Etype] { if flag&FmtLong == 0 && t.Sym() != nil && t != types.Types[t.Kind()] {
switch mode { switch mode {
case FTypeId, FTypeIdName: case FTypeId, FTypeIdName:
if flag&FmtShort != 0 { if flag&FmtShort != 0 {
if t.Vargen != 0 { if t.Vargen != 0 {
sconv2(b, t.Sym, FmtShort, mode) sconv2(b, t.Sym(), FmtShort, mode)
fmt.Fprintf(b, "·%d", t.Vargen) fmt.Fprintf(b, "·%d", t.Vargen)
return return
} }
sconv2(b, t.Sym, FmtShort, mode) sconv2(b, t.Sym(), FmtShort, mode)
return return
} }
if mode == FTypeIdName { if mode == FTypeIdName {
sconv2(b, t.Sym, FmtUnsigned, mode) sconv2(b, t.Sym(), FmtUnsigned, mode)
return return
} }
if t.Sym.Pkg == LocalPkg && t.Vargen != 0 { if t.Sym().Pkg == LocalPkg && t.Vargen != 0 {
b.WriteString(mode.Sprintf("%v·%d", t.Sym, t.Vargen)) b.WriteString(mode.Sprintf("%v·%d", t.Sym(), t.Vargen))
return return
} }
} }
sconv2(b, t.Sym, 0, mode) sconv2(b, t.Sym(), 0, mode)
return return
} }
if int(t.Etype) < len(BasicTypeNames) && BasicTypeNames[t.Etype] != "" { if int(t.Kind()) < len(BasicTypeNames) && BasicTypeNames[t.Kind()] != "" {
var name string var name string
switch t { switch t {
case types.UntypedBool: case types.UntypedBool:
@ -676,14 +676,14 @@ func tconv2(b *bytes.Buffer, t *types.Type, flag FmtFlag, mode FmtMode, visited
case types.UntypedComplex: case types.UntypedComplex:
name = "untyped complex" name = "untyped complex"
default: default:
name = BasicTypeNames[t.Etype] name = BasicTypeNames[t.Kind()]
} }
b.WriteString(name) b.WriteString(name)
return return
} }
if mode == FDbg { if mode == FDbg {
b.WriteString(t.Etype.String()) b.WriteString(t.Kind().String())
b.WriteByte('-') b.WriteByte('-')
tconv2(b, t, flag, FErr, visited) tconv2(b, t, flag, FErr, visited)
return return
@ -702,7 +702,7 @@ func tconv2(b *bytes.Buffer, t *types.Type, flag FmtFlag, mode FmtMode, visited
visited[t] = b.Len() visited[t] = b.Len()
defer delete(visited, t) defer delete(visited, t)
switch t.Etype { switch t.Kind() {
case types.TPTR: case types.TPTR:
b.WriteByte('*') b.WriteByte('*')
switch mode { switch mode {
@ -734,7 +734,7 @@ func tconv2(b *bytes.Buffer, t *types.Type, flag FmtFlag, mode FmtMode, visited
tconv2(b, t.Elem(), 0, mode, visited) tconv2(b, t.Elem(), 0, mode, visited)
default: default:
b.WriteString("chan ") b.WriteString("chan ")
if t.Elem() != nil && t.Elem().IsChan() && t.Elem().Sym == nil && t.Elem().ChanDir() == types.Crecv { if t.Elem() != nil && t.Elem().IsChan() && t.Elem().Sym() == nil && t.Elem().ChanDir() == types.Crecv {
b.WriteByte('(') b.WriteByte('(')
tconv2(b, t.Elem(), 0, mode, visited) tconv2(b, t.Elem(), 0, mode, visited)
b.WriteByte(')') b.WriteByte(')')
@ -860,9 +860,9 @@ func tconv2(b *bytes.Buffer, t *types.Type, flag FmtFlag, mode FmtMode, visited
case types.TFORW: case types.TFORW:
b.WriteString("undefined") b.WriteString("undefined")
if t.Sym != nil { if t.Sym() != nil {
b.WriteByte(' ') b.WriteByte(' ')
sconv2(b, t.Sym, 0, mode) sconv2(b, t.Sym(), 0, mode)
} }
case types.TUNSAFEPTR: case types.TUNSAFEPTR:
@ -872,7 +872,7 @@ func tconv2(b *bytes.Buffer, t *types.Type, flag FmtFlag, mode FmtMode, visited
b.WriteString("Txxx") b.WriteString("Txxx")
default: default:
// Don't know how to handle - fall back to detailed prints. // Don't know how to handle - fall back to detailed prints.
b.WriteString(mode.Sprintf("%v <%v>", t.Etype, t.Sym)) b.WriteString(mode.Sprintf("%v <%v>", t.Kind(), t.Sym()))
} }
} }
@ -1446,7 +1446,7 @@ func exprFmt(n Node, s fmt.State, prec int, mode FmtMode) {
OSTR2BYTES, OSTR2BYTES,
OSTR2RUNES, OSTR2RUNES,
ORUNESTR: ORUNESTR:
if n.Type() == nil || n.Type().Sym == nil { if n.Type() == nil || n.Type().Sym() == nil {
mode.Fprintf(s, "(%v)", n.Type()) mode.Fprintf(s, "(%v)", n.Type())
} else { } else {
mode.Fprintf(s, "%v", n.Type()) mode.Fprintf(s, "%v", n.Type())
@ -1564,7 +1564,7 @@ func nodeFmt(n Node, s fmt.State, flag FmtFlag, mode FmtMode) {
} }
if flag&FmtLong != 0 && t != nil { if flag&FmtLong != 0 && t != nil {
if t.Etype == types.TNIL { if t.Kind() == types.TNIL {
fmt.Fprint(s, "nil") fmt.Fprint(s, "nil")
} else if n.Op() == ONAME && n.Name().AutoTemp() { } else if n.Op() == ONAME && n.Name().AutoTemp() {
mode.Fprintf(s, "%v value", t) mode.Fprintf(s, "%v value", t)

View File

@ -647,7 +647,7 @@ const (
GoBuildPragma GoBuildPragma
) )
func AsNode(n types.IRNode) Node { func AsNode(n types.Object) Node {
if n == nil { if n == nil {
return nil return nil
} }

View File

@ -353,7 +353,7 @@ func (n *typeNode) String() string { return fmt.Sprint(n) }
func (n *typeNode) Format(s fmt.State, verb rune) { FmtNode(n, s, verb) } func (n *typeNode) Format(s fmt.State, verb rune) { FmtNode(n, s, verb) }
func (n *typeNode) rawCopy() Node { c := *n; return &c } func (n *typeNode) rawCopy() Node { c := *n; return &c }
func (n *typeNode) Type() *types.Type { return n.typ } func (n *typeNode) Type() *types.Type { return n.typ }
func (n *typeNode) Sym() *types.Sym { return n.typ.Sym } func (n *typeNode) Sym() *types.Sym { return n.typ.Sym() }
func (n *typeNode) CanBeNtype() {} func (n *typeNode) CanBeNtype() {}
// TypeNode returns the Node representing the type t. // TypeNode returns the Node representing the type t.

View File

@ -73,7 +73,7 @@ func AssertValidTypeForConst(t *types.Type, v constant.Value) {
func ValidTypeForConst(t *types.Type, v constant.Value) bool { func ValidTypeForConst(t *types.Type, v constant.Value) bool {
switch v.Kind() { switch v.Kind() {
case constant.Unknown: case constant.Unknown:
return OKForConst[t.Etype] return OKForConst[t.Kind()]
case constant.Bool: case constant.Bool:
return t.IsBoolean() return t.IsBoolean()
case constant.String: case constant.String:

View File

@ -69,7 +69,7 @@ func expandCalls(f *Func) {
// intPairTypes returns the pair of 32-bit int types needed to encode a 64-bit integer type on a target // intPairTypes returns the pair of 32-bit int types needed to encode a 64-bit integer type on a target
// that has no 64-bit integer registers. // that has no 64-bit integer registers.
intPairTypes := func(et types.EType) (tHi, tLo *types.Type) { intPairTypes := func(et types.Kind) (tHi, tLo *types.Type) {
tHi = typ.UInt32 tHi = typ.UInt32
if et == types.TINT64 { if et == types.TINT64 {
tHi = typ.Int32 tHi = typ.Int32
@ -294,7 +294,7 @@ func expandCalls(f *Func) {
case OpStructSelect: case OpStructSelect:
w := selector.Args[0] w := selector.Args[0]
var ls []LocalSlot var ls []LocalSlot
if w.Type.Etype != types.TSTRUCT { // IData artifact if w.Type.Kind() != types.TSTRUCT { // IData artifact
ls = rewriteSelect(leaf, w, offset) ls = rewriteSelect(leaf, w, offset)
} else { } else {
ls = rewriteSelect(leaf, w, offset+w.Type.FieldOff(int(selector.AuxInt))) ls = rewriteSelect(leaf, w, offset+w.Type.FieldOff(int(selector.AuxInt)))
@ -383,7 +383,7 @@ func expandCalls(f *Func) {
decomposeOne func(pos src.XPos, b *Block, base, source, mem *Value, t1 *types.Type, offArg, offStore int64) *Value, decomposeOne func(pos src.XPos, b *Block, base, source, mem *Value, t1 *types.Type, offArg, offStore int64) *Value,
decomposeTwo func(pos src.XPos, b *Block, base, source, mem *Value, t1, t2 *types.Type, offArg, offStore int64) *Value) *Value { decomposeTwo func(pos src.XPos, b *Block, base, source, mem *Value, t1, t2 *types.Type, offArg, offStore int64) *Value) *Value {
u := source.Type u := source.Type
switch u.Etype { switch u.Kind() {
case types.TARRAY: case types.TARRAY:
elem := u.Elem() elem := u.Elem()
for i := int64(0); i < u.NumElem(); i++ { for i := int64(0); i < u.NumElem(); i++ {
@ -403,7 +403,7 @@ func expandCalls(f *Func) {
if t.Width == regSize { if t.Width == regSize {
break break
} }
tHi, tLo := intPairTypes(t.Etype) tHi, tLo := intPairTypes(t.Kind())
mem = decomposeOne(pos, b, base, source, mem, tHi, source.AuxInt+hiOffset, offset+hiOffset) mem = decomposeOne(pos, b, base, source, mem, tHi, source.AuxInt+hiOffset, offset+hiOffset)
pos = pos.WithNotStmt() pos = pos.WithNotStmt()
return decomposeOne(pos, b, base, source, mem, tLo, source.AuxInt+lowOffset, offset+lowOffset) return decomposeOne(pos, b, base, source, mem, tLo, source.AuxInt+lowOffset, offset+lowOffset)
@ -491,7 +491,7 @@ func expandCalls(f *Func) {
return storeArgOrLoad(pos, b, base, source.Args[0], mem, t.Elem(), offset) return storeArgOrLoad(pos, b, base, source.Args[0], mem, t.Elem(), offset)
case OpInt64Make: case OpInt64Make:
tHi, tLo := intPairTypes(t.Etype) tHi, tLo := intPairTypes(t.Kind())
mem = storeArgOrLoad(pos, b, base, source.Args[0], mem, tHi, offset+hiOffset) mem = storeArgOrLoad(pos, b, base, source.Args[0], mem, tHi, offset+hiOffset)
pos = pos.WithNotStmt() pos = pos.WithNotStmt()
return storeArgOrLoad(pos, b, base, source.Args[1], mem, tLo, offset+lowOffset) return storeArgOrLoad(pos, b, base, source.Args[1], mem, tLo, offset+lowOffset)
@ -524,7 +524,7 @@ func expandCalls(f *Func) {
} }
// For nodes that cannot be taken apart -- OpSelectN, other structure selectors. // For nodes that cannot be taken apart -- OpSelectN, other structure selectors.
switch t.Etype { switch t.Kind() {
case types.TARRAY: case types.TARRAY:
elt := t.Elem() elt := t.Elem()
if source.Type != t && t.NumElem() == 1 && elt.Width == t.Width && t.Width == regSize { if source.Type != t && t.NumElem() == 1 && elt.Width == t.Width && t.Width == regSize {
@ -576,7 +576,7 @@ func expandCalls(f *Func) {
if t.Width == regSize { if t.Width == regSize {
break break
} }
tHi, tLo := intPairTypes(t.Etype) tHi, tLo := intPairTypes(t.Kind())
sel := source.Block.NewValue1(pos, OpInt64Hi, tHi, source) sel := source.Block.NewValue1(pos, OpInt64Hi, tHi, source)
mem = storeArgOrLoad(pos, b, base, sel, mem, tHi, offset+hiOffset) mem = storeArgOrLoad(pos, b, base, sel, mem, tHi, offset+hiOffset)
pos = pos.WithNotStmt() pos = pos.WithNotStmt()
@ -873,7 +873,7 @@ func expandCalls(f *Func) {
offset := int64(0) offset := int64(0)
switch v.Op { switch v.Op {
case OpStructSelect: case OpStructSelect:
if w.Type.Etype == types.TSTRUCT { if w.Type.Kind() == types.TSTRUCT {
offset = w.Type.FieldOff(int(v.AuxInt)) offset = w.Type.FieldOff(int(v.AuxInt))
} else { // Immediate interface data artifact, offset is zero. } else { // Immediate interface data artifact, offset is zero.
f.Fatalf("Expand calls interface data problem, func %s, v=%s, w=%s\n", f.Name, v.LongString(), w.LongString()) f.Fatalf("Expand calls interface data problem, func %s, v=%s, w=%s\n", f.Name, v.LongString(), w.LongString())

View File

@ -140,7 +140,7 @@ func init() {
// so this test setup can share it. // so this test setup can share it.
types.Tconv = func(t *types.Type, flag, mode int) string { types.Tconv = func(t *types.Type, flag, mode int) string {
return t.Etype.String() return t.Kind().String()
} }
types.Sconv = func(s *types.Sym, flag, mode int) string { types.Sconv = func(s *types.Sym, flag, mode int) string {
return "sym" return "sym"
@ -149,13 +149,13 @@ func init() {
fmt.Fprintf(s, "sym") fmt.Fprintf(s, "sym")
} }
types.FormatType = func(t *types.Type, s fmt.State, verb rune, mode int) { types.FormatType = func(t *types.Type, s fmt.State, verb rune, mode int) {
fmt.Fprintf(s, "%v", t.Etype) fmt.Fprintf(s, "%v", t.Kind())
} }
types.Dowidth = func(t *types.Type) {} types.Dowidth = func(t *types.Type) {}
for _, typ := range [...]struct { for _, typ := range [...]struct {
width int64 width int64
et types.EType et types.Kind
}{ }{
{1, types.TINT8}, {1, types.TINT8},
{1, types.TUINT8}, {1, types.TUINT8},

View File

@ -783,9 +783,9 @@ func (s *regAllocState) compatRegs(t *types.Type) regMask {
return 0 return 0
} }
if t.IsFloat() || t == types.TypeInt128 { if t.IsFloat() || t == types.TypeInt128 {
if t.Etype == types.TFLOAT32 && s.f.Config.fp32RegMask != 0 { if t.Kind() == types.TFLOAT32 && s.f.Config.fp32RegMask != 0 {
m = s.f.Config.fp32RegMask m = s.f.Config.fp32RegMask
} else if t.Etype == types.TFLOAT64 && s.f.Config.fp64RegMask != 0 { } else if t.Kind() == types.TFLOAT64 && s.f.Config.fp64RegMask != 0 {
m = s.f.Config.fp64RegMask m = s.f.Config.fp64RegMask
} else { } else {
m = s.f.Config.fpRegMask m = s.f.Config.fpRegMask

View File

@ -52,8 +52,8 @@ const _EType_name = "xxxINT8UINT8INT16UINT16INT32UINT32INT64UINT64INTUINTUINTPTR
var _EType_index = [...]uint8{0, 3, 7, 12, 17, 23, 28, 34, 39, 45, 48, 52, 59, 68, 78, 85, 92, 96, 99, 103, 108, 113, 119, 123, 126, 131, 135, 138, 144, 153, 158, 161, 166, 174, 182, 185, 190, 197, 202} var _EType_index = [...]uint8{0, 3, 7, 12, 17, 23, 28, 34, 39, 45, 48, 52, 59, 68, 78, 85, 92, 96, 99, 103, 108, 113, 119, 123, 126, 131, 135, 138, 144, 153, 158, 161, 166, 174, 182, 185, 190, 197, 202}
func (i EType) String() string { func (i Kind) String() string {
if i >= EType(len(_EType_index)-1) { if i >= Kind(len(_EType_index)-1) {
return "EType(" + strconv.FormatInt(int64(i), 10) + ")" return "EType(" + strconv.FormatInt(int64(i), 10) + ")"
} }
return _EType_name[_EType_index[i]:_EType_index[i+1]] return _EType_name[_EType_index[i]:_EType_index[i+1]]

View File

@ -25,17 +25,17 @@ func identical(t1, t2 *Type, cmpTags bool, assumedEqual map[typePair]struct{}) b
if t1 == t2 { if t1 == t2 {
return true return true
} }
if t1 == nil || t2 == nil || t1.Etype != t2.Etype || t1.Broke() || t2.Broke() { if t1 == nil || t2 == nil || t1.kind != t2.kind || t1.Broke() || t2.Broke() {
return false return false
} }
if t1.Sym != nil || t2.Sym != nil { if t1.sym != nil || t2.sym != nil {
// Special case: we keep byte/uint8 and rune/int32 // Special case: we keep byte/uint8 and rune/int32
// separate for error messages. Treat them as equal. // separate for error messages. Treat them as equal.
switch t1.Etype { switch t1.kind {
case TUINT8: case TUINT8:
return (t1 == Types[TUINT8] || t1 == Bytetype) && (t2 == Types[TUINT8] || t2 == Bytetype) return (t1 == Types[TUINT8] || t1 == ByteType) && (t2 == Types[TUINT8] || t2 == ByteType)
case TINT32: case TINT32:
return (t1 == Types[TINT32] || t1 == Runetype) && (t2 == Types[TINT32] || t2 == Runetype) return (t1 == Types[TINT32] || t1 == RuneType) && (t2 == Types[TINT32] || t2 == RuneType)
default: default:
return false return false
} }
@ -52,7 +52,7 @@ func identical(t1, t2 *Type, cmpTags bool, assumedEqual map[typePair]struct{}) b
} }
assumedEqual[typePair{t1, t2}] = struct{}{} assumedEqual[typePair{t1, t2}] = struct{}{}
switch t1.Etype { switch t1.kind {
case TIDEAL: case TIDEAL:
// Historically, cmd/compile used a single "untyped // Historically, cmd/compile used a single "untyped
// number" type, so all untyped number types were // number" type, so all untyped number types were

View File

@ -15,7 +15,7 @@ var Block int32 // current block number
// restored once the block scope ends. // restored once the block scope ends.
type dsym struct { type dsym struct {
sym *Sym // sym == nil indicates stack mark sym *Sym // sym == nil indicates stack mark
def IRNode def Object
block int32 block int32
lastlineno src.XPos // last declaration for diagnostic lastlineno src.XPos // last declaration for diagnostic
} }
@ -79,16 +79,16 @@ func IsDclstackValid() bool {
} }
// PkgDef returns the definition associated with s at package scope. // PkgDef returns the definition associated with s at package scope.
func (s *Sym) PkgDef() IRNode { func (s *Sym) PkgDef() Object {
return *s.pkgDefPtr() return *s.pkgDefPtr()
} }
// SetPkgDef sets the definition associated with s at package scope. // SetPkgDef sets the definition associated with s at package scope.
func (s *Sym) SetPkgDef(n IRNode) { func (s *Sym) SetPkgDef(n Object) {
*s.pkgDefPtr() = n *s.pkgDefPtr() = n
} }
func (s *Sym) pkgDefPtr() *IRNode { func (s *Sym) pkgDefPtr() *Object {
// Look for outermost saved declaration, which must be the // Look for outermost saved declaration, which must be the
// package scope definition, if present. // package scope definition, if present.
for _, d := range dclstack { for _, d := range dclstack {

View File

@ -33,7 +33,7 @@ type Sym struct {
Name string // object name Name string // object name
// saved and restored by dcopy // saved and restored by dcopy
Def IRNode // definition: ONAME OTYPE OPACK or OLITERAL Def Object // definition: ONAME OTYPE OPACK or OLITERAL
Block int32 // blocknumber to catch redeclaration Block int32 // blocknumber to catch redeclaration
Lastlineno src.XPos // last declaration for diagnostic Lastlineno src.XPos // last declaration for diagnostic

View File

@ -14,7 +14,7 @@ import (
// IRNode represents an ir.Node, but without needing to import cmd/compile/internal/ir, // IRNode represents an ir.Node, but without needing to import cmd/compile/internal/ir,
// which would cause an import cycle. The uses in other packages must type assert // which would cause an import cycle. The uses in other packages must type assert
// values of type IRNode to ir.Node or a more specific type. // values of type IRNode to ir.Node or a more specific type.
type IRNode interface { type Object interface {
Pos() src.XPos Pos() src.XPos
Sym() *Sym Sym() *Sym
Type() *Type Type() *Type
@ -23,10 +23,10 @@ type IRNode interface {
//go:generate stringer -type EType -trimprefix T //go:generate stringer -type EType -trimprefix T
// EType describes a kind of type. // EType describes a kind of type.
type EType uint8 type Kind uint8
const ( const (
Txxx EType = iota Txxx Kind = iota
TINT8 TINT8
TUINT8 TUINT8
@ -103,11 +103,11 @@ var Types [NTYPE]*Type
var ( var (
// Predeclared alias types. Kept separate for better error messages. // Predeclared alias types. Kept separate for better error messages.
Bytetype *Type ByteType *Type
Runetype *Type RuneType *Type
// Predeclared error interface type. // Predeclared error interface type.
Errortype *Type ErrorType *Type
// Types to represent untyped string and boolean constants. // Types to represent untyped string and boolean constants.
UntypedString = New(TSTRING) UntypedString = New(TSTRING)
@ -146,19 +146,19 @@ type Type struct {
methods Fields methods Fields
allMethods Fields allMethods Fields
nod IRNode // canonical OTYPE node nod Object // canonical OTYPE node
Orig *Type // original type (type literal or predefined type) underlying *Type // original type (type literal or predefined type)
// Cache of composite types, with this type being the element type. // Cache of composite types, with this type being the element type.
Cache struct { cache struct {
ptr *Type // *T, or nil ptr *Type // *T, or nil
slice *Type // []T, or nil slice *Type // []T, or nil
} }
Sym *Sym // symbol containing name, for named types sym *Sym // symbol containing name, for named types
Vargen int32 // unique name for OTYPE/ONAME Vargen int32 // unique name for OTYPE/ONAME
Etype EType // kind of type kind Kind // kind of type
Align uint8 // the required alignment of this type, in bytes (0 means Width and Align have not yet been computed) Align uint8 // the required alignment of this type, in bytes (0 means Width and Align have not yet been computed)
flags bitset8 flags bitset8
@ -185,16 +185,16 @@ func (t *Type) SetDeferwidth(b bool) { t.flags.set(typeDeferwidth, b) }
func (t *Type) SetRecur(b bool) { t.flags.set(typeRecur, b) } func (t *Type) SetRecur(b bool) { t.flags.set(typeRecur, b) }
// Kind returns the kind of type t. // Kind returns the kind of type t.
func (t *Type) Kind() EType { return t.Etype } func (t *Type) Kind() Kind { return t.kind }
// Sym returns the name of type t. // Sym returns the name of type t.
func (t *Type) GetSym() *Sym { return t.Sym } func (t *Type) Sym() *Sym { return t.sym }
// Underlying returns the underlying type of type t. // Underlying returns the underlying type of type t.
func (t *Type) Underlying() *Type { return t.Orig } func (t *Type) Underlying() *Type { return t.underlying }
// SetNod associates t with syntax node n. // SetNod associates t with syntax node n.
func (t *Type) SetNod(n IRNode) { func (t *Type) SetNod(n Object) {
// t.nod can be non-nil already // t.nod can be non-nil already
// in the case of shared *Types, like []byte or interface{}. // in the case of shared *Types, like []byte or interface{}.
if t.nod == nil { if t.nod == nil {
@ -218,7 +218,7 @@ func (t *Type) Pos() src.XPos {
// cmd/compile itself, but we need to track it because it's exposed by // cmd/compile itself, but we need to track it because it's exposed by
// the go/types API. // the go/types API.
func (t *Type) Pkg() *Pkg { func (t *Type) Pkg() *Pkg {
switch t.Etype { switch t.kind {
case TFUNC: case TFUNC:
return t.Extra.(*Func).pkg return t.Extra.(*Func).pkg
case TSTRUCT: case TSTRUCT:
@ -233,7 +233,7 @@ func (t *Type) Pkg() *Pkg {
// SetPkg sets the package that t appeared in. // SetPkg sets the package that t appeared in.
func (t *Type) SetPkg(pkg *Pkg) { func (t *Type) SetPkg(pkg *Pkg) {
switch t.Etype { switch t.kind {
case TFUNC: case TFUNC:
t.Extra.(*Func).pkg = pkg t.Extra.(*Func).pkg = pkg
case TSTRUCT: case TSTRUCT:
@ -392,7 +392,7 @@ type Field struct {
// For fields that represent function parameters, Nname points // For fields that represent function parameters, Nname points
// to the associated ONAME Node. // to the associated ONAME Node.
Nname IRNode Nname Object
// Offset in bytes of this field or method within its enclosing struct // Offset in bytes of this field or method within its enclosing struct
// or interface Type. // or interface Type.
@ -420,7 +420,7 @@ func (f *Field) End() int64 {
// IsMethod reports whether f represents a method rather than a struct field. // IsMethod reports whether f represents a method rather than a struct field.
func (f *Field) IsMethod() bool { func (f *Field) IsMethod() bool {
return f.Type.Etype == TFUNC && f.Type.Recv() != nil return f.Type.kind == TFUNC && f.Type.Recv() != nil
} }
// Fields is a pointer to a slice of *Field. // Fields is a pointer to a slice of *Field.
@ -475,14 +475,14 @@ func (f *Fields) Append(s ...*Field) {
} }
// New returns a new Type of the specified kind. // New returns a new Type of the specified kind.
func New(et EType) *Type { func New(et Kind) *Type {
t := &Type{ t := &Type{
Etype: et, kind: et,
Width: BADWIDTH, Width: BADWIDTH,
} }
t.Orig = t t.underlying = t
// TODO(josharian): lazily initialize some of these? // TODO(josharian): lazily initialize some of these?
switch t.Etype { switch t.kind {
case TMAP: case TMAP:
t.Extra = new(Map) t.Extra = new(Map)
case TFORW: case TFORW:
@ -522,7 +522,7 @@ func NewArray(elem *Type, bound int64) *Type {
// NewSlice returns the slice Type with element type elem. // NewSlice returns the slice Type with element type elem.
func NewSlice(elem *Type) *Type { func NewSlice(elem *Type) *Type {
if t := elem.Cache.slice; t != nil { if t := elem.cache.slice; t != nil {
if t.Elem() != elem { if t.Elem() != elem {
Fatalf("elem mismatch") Fatalf("elem mismatch")
} }
@ -531,7 +531,7 @@ func NewSlice(elem *Type) *Type {
t := New(TSLICE) t := New(TSLICE)
t.Extra = Slice{Elem: elem} t.Extra = Slice{Elem: elem}
elem.Cache.slice = t elem.cache.slice = t
return t return t
} }
@ -583,7 +583,7 @@ func NewPtr(elem *Type) *Type {
Fatalf("NewPtr: pointer to elem Type is nil") Fatalf("NewPtr: pointer to elem Type is nil")
} }
if t := elem.Cache.ptr; t != nil { if t := elem.cache.ptr; t != nil {
if t.Elem() != elem { if t.Elem() != elem {
Fatalf("NewPtr: elem mismatch") Fatalf("NewPtr: elem mismatch")
} }
@ -595,7 +595,7 @@ func NewPtr(elem *Type) *Type {
t.Width = int64(Widthptr) t.Width = int64(Widthptr)
t.Align = uint8(Widthptr) t.Align = uint8(Widthptr)
if NewPtrCacheEnabled { if NewPtrCacheEnabled {
elem.Cache.ptr = t elem.cache.ptr = t
} }
return t return t
} }
@ -634,7 +634,7 @@ func SubstAny(t *Type, types *[]*Type) *Type {
return nil return nil
} }
switch t.Etype { switch t.kind {
default: default:
// Leave the type unchanged. // Leave the type unchanged.
@ -718,7 +718,7 @@ func (t *Type) copy() *Type {
} }
nt := *t nt := *t
// copy any *T Extra fields, to avoid aliasing // copy any *T Extra fields, to avoid aliasing
switch t.Etype { switch t.kind {
case TMAP: case TMAP:
x := *t.Extra.(*Map) x := *t.Extra.(*Map)
nt.Extra = &x nt.Extra = &x
@ -744,8 +744,8 @@ func (t *Type) copy() *Type {
Fatalf("ssa types cannot be copied") Fatalf("ssa types cannot be copied")
} }
// TODO(mdempsky): Find out why this is necessary and explain. // TODO(mdempsky): Find out why this is necessary and explain.
if t.Orig == t { if t.underlying == t {
nt.Orig = &nt nt.underlying = &nt
} }
return &nt return &nt
} }
@ -755,8 +755,8 @@ func (f *Field) Copy() *Field {
return &nf return &nf
} }
func (t *Type) wantEtype(et EType) { func (t *Type) wantEtype(et Kind) {
if t.Etype != et { if t.kind != et {
Fatalf("want %v, but have %v", et, t) Fatalf("want %v, but have %v", et, t)
} }
} }
@ -810,7 +810,7 @@ func (t *Type) Key() *Type {
// Elem returns the type of elements of t. // Elem returns the type of elements of t.
// Usable with pointers, channels, arrays, slices, and maps. // Usable with pointers, channels, arrays, slices, and maps.
func (t *Type) Elem() *Type { func (t *Type) Elem() *Type {
switch t.Etype { switch t.kind {
case TPTR: case TPTR:
return t.Extra.(Ptr).Elem return t.Extra.(Ptr).Elem
case TARRAY: case TARRAY:
@ -822,7 +822,7 @@ func (t *Type) Elem() *Type {
case TMAP: case TMAP:
return t.Extra.(*Map).Elem return t.Extra.(*Map).Elem
} }
Fatalf("Type.Elem %s", t.Etype) Fatalf("Type.Elem %s", t.kind)
return nil return nil
} }
@ -840,7 +840,7 @@ func (t *Type) FuncArgs() *Type {
// IsFuncArgStruct reports whether t is a struct representing function parameters. // IsFuncArgStruct reports whether t is a struct representing function parameters.
func (t *Type) IsFuncArgStruct() bool { func (t *Type) IsFuncArgStruct() bool {
return t.Etype == TSTRUCT && t.Extra.(*Struct).Funarg != FunargNone return t.kind == TSTRUCT && t.Extra.(*Struct).Funarg != FunargNone
} }
func (t *Type) Methods() *Fields { func (t *Type) Methods() *Fields {
@ -854,7 +854,7 @@ func (t *Type) AllMethods() *Fields {
} }
func (t *Type) Fields() *Fields { func (t *Type) Fields() *Fields {
switch t.Etype { switch t.kind {
case TSTRUCT: case TSTRUCT:
return &t.Extra.(*Struct).fields return &t.Extra.(*Struct).fields
case TINTER: case TINTER:
@ -919,7 +919,7 @@ func (t *Type) ArgWidth() int64 {
} }
func (t *Type) Size() int64 { func (t *Type) Size() int64 {
if t.Etype == TSSA { if t.kind == TSSA {
if t == TypeInt128 { if t == TypeInt128 {
return 16 return 16
} }
@ -935,7 +935,7 @@ func (t *Type) Alignment() int64 {
} }
func (t *Type) SimpleString() string { func (t *Type) SimpleString() string {
return t.Etype.String() return t.kind.String()
} }
// Cmp is a comparison between values a and b. // Cmp is a comparison between values a and b.
@ -1019,31 +1019,31 @@ func (t *Type) cmp(x *Type) Cmp {
return CMPgt return CMPgt
} }
if t.Etype != x.Etype { if t.kind != x.kind {
return cmpForNe(t.Etype < x.Etype) return cmpForNe(t.kind < x.kind)
} }
if t.Sym != nil || x.Sym != nil { if t.sym != nil || x.sym != nil {
// Special case: we keep byte and uint8 separate // Special case: we keep byte and uint8 separate
// for error messages. Treat them as equal. // for error messages. Treat them as equal.
switch t.Etype { switch t.kind {
case TUINT8: case TUINT8:
if (t == Types[TUINT8] || t == Bytetype) && (x == Types[TUINT8] || x == Bytetype) { if (t == Types[TUINT8] || t == ByteType) && (x == Types[TUINT8] || x == ByteType) {
return CMPeq return CMPeq
} }
case TINT32: case TINT32:
if (t == Types[Runetype.Etype] || t == Runetype) && (x == Types[Runetype.Etype] || x == Runetype) { if (t == Types[RuneType.kind] || t == RuneType) && (x == Types[RuneType.kind] || x == RuneType) {
return CMPeq return CMPeq
} }
} }
} }
if c := t.Sym.cmpsym(x.Sym); c != CMPeq { if c := t.sym.cmpsym(x.sym); c != CMPeq {
return c return c
} }
if x.Sym != nil { if x.sym != nil {
// Syms non-nil, if vargens match then equal. // Syms non-nil, if vargens match then equal.
if t.Vargen != x.Vargen { if t.Vargen != x.Vargen {
return cmpForNe(t.Vargen < x.Vargen) return cmpForNe(t.Vargen < x.Vargen)
@ -1052,7 +1052,7 @@ func (t *Type) cmp(x *Type) Cmp {
} }
// both syms nil, look at structure below. // both syms nil, look at structure below.
switch t.Etype { switch t.kind {
case TBOOL, TFLOAT32, TFLOAT64, TCOMPLEX64, TCOMPLEX128, TUNSAFEPTR, TUINTPTR, case TBOOL, TFLOAT32, TFLOAT64, TCOMPLEX64, TCOMPLEX128, TUNSAFEPTR, TUINTPTR,
TINT8, TINT16, TINT32, TINT64, TINT, TUINT8, TUINT16, TUINT32, TUINT64, TUINT: TINT8, TINT16, TINT32, TINT64, TINT, TUINT8, TUINT16, TUINT32, TUINT64, TUINT:
return CMPeq return CMPeq
@ -1209,15 +1209,15 @@ func (t *Type) cmp(x *Type) Cmp {
} }
// IsKind reports whether t is a Type of the specified kind. // IsKind reports whether t is a Type of the specified kind.
func (t *Type) IsKind(et EType) bool { func (t *Type) IsKind(et Kind) bool {
return t != nil && t.Etype == et return t != nil && t.kind == et
} }
func (t *Type) IsBoolean() bool { func (t *Type) IsBoolean() bool {
return t.Etype == TBOOL return t.kind == TBOOL
} }
var unsignedEType = [...]EType{ var unsignedEType = [...]Kind{
TINT8: TUINT8, TINT8: TUINT8,
TUINT8: TUINT8, TUINT8: TUINT8,
TINT16: TUINT16, TINT16: TUINT16,
@ -1236,11 +1236,11 @@ func (t *Type) ToUnsigned() *Type {
if !t.IsInteger() { if !t.IsInteger() {
Fatalf("unsignedType(%v)", t) Fatalf("unsignedType(%v)", t)
} }
return Types[unsignedEType[t.Etype]] return Types[unsignedEType[t.kind]]
} }
func (t *Type) IsInteger() bool { func (t *Type) IsInteger() bool {
switch t.Etype { switch t.kind {
case TINT8, TUINT8, TINT16, TUINT16, TINT32, TUINT32, TINT64, TUINT64, TINT, TUINT, TUINTPTR: case TINT8, TUINT8, TINT16, TUINT16, TINT32, TUINT32, TINT64, TUINT64, TINT, TUINT, TUINTPTR:
return true return true
} }
@ -1248,7 +1248,7 @@ func (t *Type) IsInteger() bool {
} }
func (t *Type) IsSigned() bool { func (t *Type) IsSigned() bool {
switch t.Etype { switch t.kind {
case TINT8, TINT16, TINT32, TINT64, TINT: case TINT8, TINT16, TINT32, TINT64, TINT:
return true return true
} }
@ -1256,7 +1256,7 @@ func (t *Type) IsSigned() bool {
} }
func (t *Type) IsUnsigned() bool { func (t *Type) IsUnsigned() bool {
switch t.Etype { switch t.kind {
case TUINT8, TUINT16, TUINT32, TUINT64, TUINT, TUINTPTR: case TUINT8, TUINT16, TUINT32, TUINT64, TUINT, TUINTPTR:
return true return true
} }
@ -1264,32 +1264,32 @@ func (t *Type) IsUnsigned() bool {
} }
func (t *Type) IsFloat() bool { func (t *Type) IsFloat() bool {
return t.Etype == TFLOAT32 || t.Etype == TFLOAT64 || t == UntypedFloat return t.kind == TFLOAT32 || t.kind == TFLOAT64 || t == UntypedFloat
} }
func (t *Type) IsComplex() bool { func (t *Type) IsComplex() bool {
return t.Etype == TCOMPLEX64 || t.Etype == TCOMPLEX128 || t == UntypedComplex return t.kind == TCOMPLEX64 || t.kind == TCOMPLEX128 || t == UntypedComplex
} }
// IsPtr reports whether t is a regular Go pointer type. // IsPtr reports whether t is a regular Go pointer type.
// This does not include unsafe.Pointer. // This does not include unsafe.Pointer.
func (t *Type) IsPtr() bool { func (t *Type) IsPtr() bool {
return t.Etype == TPTR return t.kind == TPTR
} }
// IsPtrElem reports whether t is the element of a pointer (to t). // IsPtrElem reports whether t is the element of a pointer (to t).
func (t *Type) IsPtrElem() bool { func (t *Type) IsPtrElem() bool {
return t.Cache.ptr != nil return t.cache.ptr != nil
} }
// IsUnsafePtr reports whether t is an unsafe pointer. // IsUnsafePtr reports whether t is an unsafe pointer.
func (t *Type) IsUnsafePtr() bool { func (t *Type) IsUnsafePtr() bool {
return t.Etype == TUNSAFEPTR return t.kind == TUNSAFEPTR
} }
// IsUintptr reports whether t is an uintptr. // IsUintptr reports whether t is an uintptr.
func (t *Type) IsUintptr() bool { func (t *Type) IsUintptr() bool {
return t.Etype == TUINTPTR return t.kind == TUINTPTR
} }
// IsPtrShaped reports whether t is represented by a single machine pointer. // IsPtrShaped reports whether t is represented by a single machine pointer.
@ -1298,13 +1298,13 @@ func (t *Type) IsUintptr() bool {
// that consist of a single pointer shaped type. // that consist of a single pointer shaped type.
// TODO(mdempsky): Should it? See golang.org/issue/15028. // TODO(mdempsky): Should it? See golang.org/issue/15028.
func (t *Type) IsPtrShaped() bool { func (t *Type) IsPtrShaped() bool {
return t.Etype == TPTR || t.Etype == TUNSAFEPTR || return t.kind == TPTR || t.kind == TUNSAFEPTR ||
t.Etype == TMAP || t.Etype == TCHAN || t.Etype == TFUNC t.kind == TMAP || t.kind == TCHAN || t.kind == TFUNC
} }
// HasNil reports whether the set of values determined by t includes nil. // HasNil reports whether the set of values determined by t includes nil.
func (t *Type) HasNil() bool { func (t *Type) HasNil() bool {
switch t.Etype { switch t.kind {
case TCHAN, TFUNC, TINTER, TMAP, TNIL, TPTR, TSLICE, TUNSAFEPTR: case TCHAN, TFUNC, TINTER, TMAP, TNIL, TPTR, TSLICE, TUNSAFEPTR:
return true return true
} }
@ -1312,31 +1312,31 @@ func (t *Type) HasNil() bool {
} }
func (t *Type) IsString() bool { func (t *Type) IsString() bool {
return t.Etype == TSTRING return t.kind == TSTRING
} }
func (t *Type) IsMap() bool { func (t *Type) IsMap() bool {
return t.Etype == TMAP return t.kind == TMAP
} }
func (t *Type) IsChan() bool { func (t *Type) IsChan() bool {
return t.Etype == TCHAN return t.kind == TCHAN
} }
func (t *Type) IsSlice() bool { func (t *Type) IsSlice() bool {
return t.Etype == TSLICE return t.kind == TSLICE
} }
func (t *Type) IsArray() bool { func (t *Type) IsArray() bool {
return t.Etype == TARRAY return t.kind == TARRAY
} }
func (t *Type) IsStruct() bool { func (t *Type) IsStruct() bool {
return t.Etype == TSTRUCT return t.kind == TSTRUCT
} }
func (t *Type) IsInterface() bool { func (t *Type) IsInterface() bool {
return t.Etype == TINTER return t.kind == TINTER
} }
// IsEmptyInterface reports whether t is an empty interface type. // IsEmptyInterface reports whether t is an empty interface type.
@ -1352,7 +1352,7 @@ func (t *Type) NumFields() int {
return t.Fields().Len() return t.Fields().Len()
} }
func (t *Type) FieldType(i int) *Type { func (t *Type) FieldType(i int) *Type {
if t.Etype == TTUPLE { if t.kind == TTUPLE {
switch i { switch i {
case 0: case 0:
return t.Extra.(*Tuple).first return t.Extra.(*Tuple).first
@ -1362,7 +1362,7 @@ func (t *Type) FieldType(i int) *Type {
panic("bad tuple index") panic("bad tuple index")
} }
} }
if t.Etype == TRESULTS { if t.kind == TRESULTS {
return t.Extra.(*Results).Types[i] return t.Extra.(*Results).Types[i]
} }
return t.Field(i).Type return t.Field(i).Type
@ -1393,7 +1393,7 @@ const (
// (and their comprised elements) are excluded from the count. // (and their comprised elements) are excluded from the count.
// struct { x, y [3]int } has six components; [10]struct{ x, y string } has twenty. // struct { x, y [3]int } has six components; [10]struct{ x, y string } has twenty.
func (t *Type) NumComponents(countBlank componentsIncludeBlankFields) int64 { func (t *Type) NumComponents(countBlank componentsIncludeBlankFields) int64 {
switch t.Etype { switch t.kind {
case TSTRUCT: case TSTRUCT:
if t.IsFuncArgStruct() { if t.IsFuncArgStruct() {
Fatalf("NumComponents func arg struct") Fatalf("NumComponents func arg struct")
@ -1416,7 +1416,7 @@ func (t *Type) NumComponents(countBlank componentsIncludeBlankFields) int64 {
// if there is exactly one. Otherwise, it returns nil. // if there is exactly one. Otherwise, it returns nil.
// Components are counted as in NumComponents, including blank fields. // Components are counted as in NumComponents, including blank fields.
func (t *Type) SoleComponent() *Type { func (t *Type) SoleComponent() *Type {
switch t.Etype { switch t.kind {
case TSTRUCT: case TSTRUCT:
if t.IsFuncArgStruct() { if t.IsFuncArgStruct() {
Fatalf("SoleComponent func arg struct") Fatalf("SoleComponent func arg struct")
@ -1442,10 +1442,10 @@ func (t *Type) ChanDir() ChanDir {
} }
func (t *Type) IsMemory() bool { func (t *Type) IsMemory() bool {
if t == TypeMem || t.Etype == TTUPLE && t.Extra.(*Tuple).second == TypeMem { if t == TypeMem || t.kind == TTUPLE && t.Extra.(*Tuple).second == TypeMem {
return true return true
} }
if t.Etype == TRESULTS { if t.kind == TRESULTS {
if types := t.Extra.(*Results).Types; len(types) > 0 && types[len(types)-1] == TypeMem { if types := t.Extra.(*Results).Types; len(types) > 0 && types[len(types)-1] == TypeMem {
return true return true
} }
@ -1454,8 +1454,8 @@ func (t *Type) IsMemory() bool {
} }
func (t *Type) IsFlags() bool { return t == TypeFlags } func (t *Type) IsFlags() bool { return t == TypeFlags }
func (t *Type) IsVoid() bool { return t == TypeVoid } func (t *Type) IsVoid() bool { return t == TypeVoid }
func (t *Type) IsTuple() bool { return t.Etype == TTUPLE } func (t *Type) IsTuple() bool { return t.kind == TTUPLE }
func (t *Type) IsResults() bool { return t.Etype == TRESULTS } func (t *Type) IsResults() bool { return t.kind == TRESULTS }
// IsUntyped reports whether t is an untyped type. // IsUntyped reports whether t is an untyped type.
func (t *Type) IsUntyped() bool { func (t *Type) IsUntyped() bool {
@ -1465,7 +1465,7 @@ func (t *Type) IsUntyped() bool {
if t == UntypedString || t == UntypedBool { if t == UntypedString || t == UntypedBool {
return true return true
} }
switch t.Etype { switch t.kind {
case TNIL, TIDEAL: case TNIL, TIDEAL:
return true return true
} }
@ -1475,7 +1475,7 @@ func (t *Type) IsUntyped() bool {
// HasPointers reports whether t contains a heap pointer. // HasPointers reports whether t contains a heap pointer.
// Note that this function ignores pointers to go:notinheap types. // Note that this function ignores pointers to go:notinheap types.
func (t *Type) HasPointers() bool { func (t *Type) HasPointers() bool {
switch t.Etype { switch t.kind {
case TINT, TUINT, TINT8, TUINT8, TINT16, TUINT16, TINT32, TUINT32, TINT64, case TINT, TUINT, TINT8, TUINT8, TINT16, TUINT16, TINT32, TUINT32, TINT64,
TUINT64, TUINTPTR, TFLOAT32, TFLOAT64, TCOMPLEX64, TCOMPLEX128, TBOOL, TSSA: TUINT64, TUINTPTR, TFLOAT32, TFLOAT64, TCOMPLEX64, TCOMPLEX128, TBOOL, TSSA:
return false return false
@ -1551,16 +1551,16 @@ var (
) )
// NewNamed returns a new named type for the given type name. // NewNamed returns a new named type for the given type name.
func NewNamed(obj IRNode) *Type { func NewNamed(obj Object) *Type {
t := New(TFORW) t := New(TFORW)
t.Sym = obj.Sym() t.sym = obj.Sym()
t.nod = obj t.nod = obj
return t return t
} }
// Obj returns the type name for the named type t. // Obj returns the type name for the named type t.
func (t *Type) Obj() IRNode { func (t *Type) Obj() Object {
if t.Sym != nil { if t.sym != nil {
return t.nod return t.nod
} }
return nil return nil
@ -1568,7 +1568,7 @@ func (t *Type) Obj() IRNode {
// SetUnderlying sets the underlying type. // SetUnderlying sets the underlying type.
func (t *Type) SetUnderlying(underlying *Type) { func (t *Type) SetUnderlying(underlying *Type) {
if underlying.Etype == TFORW { if underlying.kind == TFORW {
// This type isn't computed yet; when it is, update n. // This type isn't computed yet; when it is, update n.
underlying.ForwardType().Copyto = append(underlying.ForwardType().Copyto, t) underlying.ForwardType().Copyto = append(underlying.ForwardType().Copyto, t)
return return
@ -1577,11 +1577,11 @@ func (t *Type) SetUnderlying(underlying *Type) {
ft := t.ForwardType() ft := t.ForwardType()
// TODO(mdempsky): Fix Type rekinding. // TODO(mdempsky): Fix Type rekinding.
t.Etype = underlying.Etype t.kind = underlying.kind
t.Extra = underlying.Extra t.Extra = underlying.Extra
t.Width = underlying.Width t.Width = underlying.Width
t.Align = underlying.Align t.Align = underlying.Align
t.Orig = underlying.Orig t.underlying = underlying.underlying
if underlying.NotInHeap() { if underlying.NotInHeap() {
t.SetNotInHeap(true) t.SetNotInHeap(true)
@ -1612,9 +1612,9 @@ func (t *Type) SetUnderlying(underlying *Type) {
} }
// NewNamed returns a new basic type of the given kind. // NewNamed returns a new basic type of the given kind.
func NewBasic(kind EType, obj IRNode) *Type { func NewBasic(kind Kind, obj Object) *Type {
t := New(kind) t := New(kind)
t.Sym = obj.Sym() t.sym = obj.Sym()
t.nod = obj t.nod = obj
return t return t
} }