[dev.regabi] cmd/compile: move setUnderlying to package types

Now that setUnderlying is decoupled from Nodes, it can be moved into
package types, where it really belongs.

[git-generate]
cd src/cmd/compile/internal/gc
rf '
mv setUnderlying SetUnderlying
mv SetUnderlying typex.go
mv typex.go cmd/compile/internal/types
'

cd ../types
rf '
mv typex.go type.go
'

Change-Id: I76e2d4d8a6df599f24a731c4d8e5774ec83a119c
Reviewed-on: https://go-review.googlesource.com/c/go/+/274433
Trust: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Russ Cox <rsc@golang.org>
This commit is contained in:
Matthew Dempsky 2020-12-01 01:31:29 -08:00
parent f2311462ab
commit 63a6f08b39
3 changed files with 47 additions and 46 deletions

View file

@ -316,7 +316,7 @@ func (r *importReader) doDecl(n ir.Node) {
// after the underlying type has been assigned. // after the underlying type has been assigned.
defercheckwidth() defercheckwidth()
underlying := r.typ() underlying := r.typ()
setUnderlying(t, underlying) types.SetUnderlying(t, underlying)
resumecheckwidth() resumecheckwidth()
if underlying.IsInterface() { if underlying.IsInterface() {

View file

@ -3427,50 +3427,6 @@ func checkMapKeys() {
mapqueue = nil mapqueue = nil
} }
func setUnderlying(t, underlying *types.Type) {
if underlying.Etype == types.TFORW {
// This type isn't computed yet; when it is, update n.
underlying.ForwardType().Copyto = append(underlying.ForwardType().Copyto, t)
return
}
ft := t.ForwardType()
// TODO(mdempsky): Fix Type rekinding.
t.Etype = underlying.Etype
t.Extra = underlying.Extra
t.Width = underlying.Width
t.Align = underlying.Align
t.Orig = underlying.Orig
if underlying.NotInHeap() {
t.SetNotInHeap(true)
}
if underlying.Broke() {
t.SetBroke(true)
}
// spec: "The declared type does not inherit any methods bound
// to the existing type, but the method set of an interface
// type [...] remains unchanged."
if t.IsInterface() {
*t.Methods() = *underlying.Methods()
*t.AllMethods() = *underlying.AllMethods()
}
// Update types waiting on this type.
for _, w := range ft.Copyto {
setUnderlying(w, t)
}
// Double-check use of type as embedded type.
if ft.Embedlineno.IsKnown() {
if t.IsPtr() || t.IsUnsafePtr() {
base.ErrorfAt(ft.Embedlineno, "embedded type cannot be a pointer")
}
}
}
func typecheckdeftype(n *ir.Name) { func typecheckdeftype(n *ir.Name) {
if enableTrace && base.Flag.LowerT { if enableTrace && base.Flag.LowerT {
defer tracePrint("typecheckdeftype", n)(nil) defer tracePrint("typecheckdeftype", n)(nil)
@ -3492,7 +3448,7 @@ func typecheckdeftype(n *ir.Name) {
errorsBefore := base.Errors() errorsBefore := base.Errors()
n.Ntype = typecheckNtype(n.Ntype) n.Ntype = typecheckNtype(n.Ntype)
if underlying := n.Ntype.Type(); underlying != nil { if underlying := n.Ntype.Type(); underlying != nil {
setUnderlying(t, underlying) types.SetUnderlying(t, underlying)
} else { } else {
n.SetDiag(true) n.SetDiag(true)
n.SetType(nil) n.SetType(nil)

View file

@ -5,6 +5,7 @@
package types package types
import ( import (
"cmd/compile/internal/base"
"cmd/internal/obj" "cmd/internal/obj"
"cmd/internal/src" "cmd/internal/src"
"fmt" "fmt"
@ -1517,3 +1518,47 @@ var (
TypeVoid = newSSA("void") TypeVoid = newSSA("void")
TypeInt128 = newSSA("int128") TypeInt128 = newSSA("int128")
) )
func SetUnderlying(t, underlying *Type) {
if underlying.Etype == TFORW {
// This type isn't computed yet; when it is, update n.
underlying.ForwardType().Copyto = append(underlying.ForwardType().Copyto, t)
return
}
ft := t.ForwardType()
// TODO(mdempsky): Fix Type rekinding.
t.Etype = underlying.Etype
t.Extra = underlying.Extra
t.Width = underlying.Width
t.Align = underlying.Align
t.Orig = underlying.Orig
if underlying.NotInHeap() {
t.SetNotInHeap(true)
}
if underlying.Broke() {
t.SetBroke(true)
}
// spec: "The declared type does not inherit any methods bound
// to the existing type, but the method set of an interface
// type [...] remains unchanged."
if t.IsInterface() {
*t.Methods() = *underlying.Methods()
*t.AllMethods() = *underlying.AllMethods()
}
// Update types waiting on this type.
for _, w := range ft.Copyto {
SetUnderlying(w, t)
}
// Double-check use of type as embedded type.
if ft.Embedlineno.IsKnown() {
if t.IsPtr() || t.IsUnsafePtr() {
base.ErrorfAt(ft.Embedlineno, "embedded type cannot be a pointer")
}
}
}