mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
[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:
parent
f2311462ab
commit
63a6f08b39
3 changed files with 47 additions and 46 deletions
|
|
@ -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() {
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue