1
0
mirror of https://github.com/golang/go synced 2024-11-17 17:54:48 -07:00

cmd/compile: call types2.Unalias to be ready for GODEBUG=gotypesalias=1

types2.Unalias is not needed if we know we have a core or underlying
type. Also, types of declared functions (signatures) cannot be aliases
(this includes tuples).

Fixes #65125.

Change-Id: I1faa26b66f6c646719e830dd661136fae86f3775
Reviewed-on: https://go-review.googlesource.com/c/go/+/556036
Run-TryBot: Robert Griesemer <gri@google.com>
Reviewed-by: Mauri de Souza Meneguzzo <mauri870@gmail.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Auto-Submit: Robert Griesemer <gri@google.com>
Reviewed-by: Robert Griesemer <gri@google.com>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
Robert Griesemer 2024-01-16 16:59:31 -08:00 committed by Gopher Robot
parent 7e7b16c972
commit 8e658eee9c
3 changed files with 14 additions and 13 deletions

View File

@ -80,7 +80,7 @@ func idealType(tv syntax.TypeAndValue) types2.Type {
// types2 mostly satisfies this expectation already. But there are a few // types2 mostly satisfies this expectation already. But there are a few
// cases where the Go spec doesn't require converting to concrete type, // cases where the Go spec doesn't require converting to concrete type,
// and so types2 leaves them untyped. So we need to fix those up here. // and so types2 leaves them untyped. So we need to fix those up here.
typ := tv.Type typ := types2.Unalias(tv.Type)
if basic, ok := typ.(*types2.Basic); ok && basic.Info()&types2.IsUntyped != 0 { if basic, ok := typ.(*types2.Basic); ok && basic.Info()&types2.IsUntyped != 0 {
switch basic.Kind() { switch basic.Kind() {
case types2.UntypedNil: case types2.UntypedNil:
@ -109,13 +109,14 @@ func idealType(tv syntax.TypeAndValue) types2.Type {
} }
func isTypeParam(t types2.Type) bool { func isTypeParam(t types2.Type) bool {
_, ok := t.(*types2.TypeParam) _, ok := types2.Unalias(t).(*types2.TypeParam)
return ok return ok
} }
// isNotInHeap reports whether typ is or contains an element of type // isNotInHeap reports whether typ is or contains an element of type
// runtime/internal/sys.NotInHeap. // runtime/internal/sys.NotInHeap.
func isNotInHeap(typ types2.Type) bool { func isNotInHeap(typ types2.Type) bool {
typ = types2.Unalias(typ)
if named, ok := typ.(*types2.Named); ok { if named, ok := typ.(*types2.Named); ok {
if obj := named.Obj(); obj.Name() == "nih" && obj.Pkg().Path() == "runtime/internal/sys" { if obj := named.Obj(); obj.Name() == "nih" && obj.Pkg().Path() == "runtime/internal/sys" {
return true return true

View File

@ -97,7 +97,7 @@ func checkFiles(m posMap, noders []*noder) (*types2.Package, *types2.Info) {
for _, file := range files { for _, file := range files {
syntax.Inspect(file, func(n syntax.Node) bool { syntax.Inspect(file, func(n syntax.Node) bool {
if n, ok := n.(*syntax.InterfaceType); ok { if n, ok := n.(*syntax.InterfaceType); ok {
if f.hasCycle(n.GetTypeInfo().Type.(*types2.Interface)) { if f.hasCycle(types2.Unalias(n.GetTypeInfo().Type).(*types2.Interface)) {
base.ErrorfAt(m.makeXPos(n.Pos()), errors.InvalidTypeCycle, "invalid recursive type: anonymous interface refers to itself (see https://go.dev/issue/56103)") base.ErrorfAt(m.makeXPos(n.Pos()), errors.InvalidTypeCycle, "invalid recursive type: anonymous interface refers to itself (see https://go.dev/issue/56103)")
for typ := range f.cyclic { for typ := range f.cyclic {
@ -171,7 +171,7 @@ func (f *cycleFinder) hasCycle(typ *types2.Interface) bool {
// visit recursively walks typ0 to check any referenced interface types. // visit recursively walks typ0 to check any referenced interface types.
func (f *cycleFinder) visit(typ0 types2.Type) bool { func (f *cycleFinder) visit(typ0 types2.Type) bool {
for { // loop for tail recursion for { // loop for tail recursion
switch typ := typ0.(type) { switch typ := types2.Unalias(typ0).(type) {
default: default:
base.Fatalf("unexpected type: %T", typ) base.Fatalf("unexpected type: %T", typ)

View File

@ -217,7 +217,7 @@ type itabInfo struct {
// generic function or method. // generic function or method.
func (dict *writerDict) typeParamIndex(typ *types2.TypeParam) int { func (dict *writerDict) typeParamIndex(typ *types2.TypeParam) int {
for idx, implicit := range dict.implicits { for idx, implicit := range dict.implicits {
if implicit.Type().(*types2.TypeParam) == typ { if types2.Unalias(implicit.Type()).(*types2.TypeParam) == typ {
return idx return idx
} }
} }
@ -498,7 +498,7 @@ func (pw *pkgWriter) typIdx(typ types2.Type, dict *writerDict) typeInfo {
w := pw.newWriter(pkgbits.RelocType, pkgbits.SyncTypeIdx) w := pw.newWriter(pkgbits.RelocType, pkgbits.SyncTypeIdx)
w.dict = dict w.dict = dict
switch typ := typ.(type) { switch typ := types2.Unalias(typ).(type) {
default: default:
base.Fatalf("unexpected type: %v (%T)", typ, typ) base.Fatalf("unexpected type: %v (%T)", typ, typ)
@ -889,7 +889,7 @@ func (w *writer) objDict(obj types2.Object, dict *writerDict) {
// parameter is constrained to `int | uint` but then never used in // parameter is constrained to `int | uint` but then never used in
// arithmetic/conversions/etc, we could shape those together. // arithmetic/conversions/etc, we could shape those together.
for _, implicit := range dict.implicits { for _, implicit := range dict.implicits {
tparam := implicit.Type().(*types2.TypeParam) tparam := types2.Unalias(implicit.Type()).(*types2.TypeParam)
w.Bool(tparam.Underlying().(*types2.Interface).IsMethodSet()) w.Bool(tparam.Underlying().(*types2.Interface).IsMethodSet())
} }
for i := 0; i < ntparams; i++ { for i := 0; i < ntparams; i++ {
@ -2124,7 +2124,7 @@ func (w *writer) methodExpr(expr *syntax.SelectorExpr, recv types2.Type, sel *ty
// Method on a type parameter. These require an indirect call // Method on a type parameter. These require an indirect call
// through the current function's runtime dictionary. // through the current function's runtime dictionary.
if typeParam, ok := recv.(*types2.TypeParam); w.Bool(ok) { if typeParam, ok := types2.Unalias(recv).(*types2.TypeParam); w.Bool(ok) {
typeParamIdx := w.dict.typeParamIndex(typeParam) typeParamIdx := w.dict.typeParamIndex(typeParam)
methodInfo := w.p.selectorIdx(fun) methodInfo := w.p.selectorIdx(fun)
@ -2137,7 +2137,7 @@ func (w *writer) methodExpr(expr *syntax.SelectorExpr, recv types2.Type, sel *ty
} }
if !isInterface(recv) { if !isInterface(recv) {
if named, ok := deref2(recv).(*types2.Named); ok { if named, ok := types2.Unalias(deref2(recv)).(*types2.Named); ok {
obj, targs := splitNamed(named) obj, targs := splitNamed(named)
info := w.p.objInstIdx(obj, targs, w.dict) info := w.p.objInstIdx(obj, targs, w.dict)
@ -2363,7 +2363,7 @@ func (w *writer) varDictIndex(obj *types2.Var) {
} }
func isUntyped(typ types2.Type) bool { func isUntyped(typ types2.Type) bool {
basic, ok := typ.(*types2.Basic) basic, ok := types2.Unalias(typ).(*types2.Basic)
return ok && basic.Info()&types2.IsUntyped != 0 return ok && basic.Info()&types2.IsUntyped != 0
} }
@ -2416,7 +2416,7 @@ func (w *writer) exprType(iface types2.Type, typ syntax.Expr) {
// If typ is a type parameter, then isInterface reports an internal // If typ is a type parameter, then isInterface reports an internal
// compiler error instead. // compiler error instead.
func isInterface(typ types2.Type) bool { func isInterface(typ types2.Type) bool {
if _, ok := typ.(*types2.TypeParam); ok { if _, ok := types2.Unalias(typ).(*types2.TypeParam); ok {
// typ is a type parameter and may be instantiated as either a // typ is a type parameter and may be instantiated as either a
// concrete or interface type, so the writer can't depend on // concrete or interface type, so the writer can't depend on
// knowing this. // knowing this.
@ -2867,7 +2867,7 @@ func (pw *pkgWriter) isBuiltin(expr syntax.Expr, builtin string) bool {
// recvBase returns the base type for the given receiver parameter. // recvBase returns the base type for the given receiver parameter.
func recvBase(recv *types2.Var) *types2.Named { func recvBase(recv *types2.Var) *types2.Named {
typ := recv.Type() typ := types2.Unalias(recv.Type())
if ptr, ok := typ.(*types2.Pointer); ok { if ptr, ok := typ.(*types2.Pointer); ok {
typ = ptr.Elem() typ = ptr.Elem()
} }
@ -2945,7 +2945,7 @@ func asWasmImport(p syntax.Pragma) *WasmImport {
// isPtrTo reports whether from is the type *to. // isPtrTo reports whether from is the type *to.
func isPtrTo(from, to types2.Type) bool { func isPtrTo(from, to types2.Type) bool {
ptr, ok := from.(*types2.Pointer) ptr, ok := types2.Unalias(from).(*types2.Pointer)
return ok && types2.Identical(ptr.Elem(), to) return ok && types2.Identical(ptr.Elem(), to)
} }