mirror of
https://github.com/golang/go
synced 2024-11-17 14:04:48 -07:00
cmd/compile: set IsShape based on type being in the Shapes pkg
Move ShapePkg to types, and change types.NewNamed to automatically set IsShape/HasShape if a type is in the shapes pkg. This means that imported shape types will automatically have the correct IsShape/HasShape flags, even though we are not explicitly exporting/importing those flags. Updates #48337 Change-Id: I8b6131a663205f73f395943c9d0c8bdb2a213401 Reviewed-on: https://go-review.googlesource.com/c/go/+/349869 Run-TryBot: Dan Scales <danscales@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org> Trust: Dan Scales <danscales@google.com>
This commit is contained in:
parent
3a72175cdc
commit
137543bb93
@ -1414,9 +1414,15 @@ func Shapify(t *types.Type) *types.Type {
|
||||
return s
|
||||
}
|
||||
|
||||
sym := shapePkg.Lookup(u.LinkString())
|
||||
sym := types.ShapePkg.Lookup(u.LinkString())
|
||||
if sym.Def != nil {
|
||||
// Use any existing type with the same name
|
||||
shaped[u] = sym.Def.Type()
|
||||
return shaped[u]
|
||||
}
|
||||
name := ir.NewDeclNameAt(u.Pos(), ir.OTYPE, sym)
|
||||
s := types.NewNamed(name)
|
||||
sym.Def = name
|
||||
s.SetUnderlying(u)
|
||||
s.SetIsShape(true)
|
||||
s.SetHasShape(true)
|
||||
@ -1427,5 +1433,3 @@ func Shapify(t *types.Type) *types.Type {
|
||||
}
|
||||
|
||||
var shaped = map[*types.Type]*types.Type{}
|
||||
|
||||
var shapePkg = types.NewPkg(".shape", ".shape")
|
||||
|
@ -1706,6 +1706,10 @@ func NewNamed(obj TypeObject) *Type {
|
||||
t := newType(TFORW)
|
||||
t.sym = obj.Sym()
|
||||
t.nod = obj
|
||||
if t.sym.Pkg == ShapePkg {
|
||||
t.SetIsShape(true)
|
||||
t.SetHasShape(true)
|
||||
}
|
||||
return t
|
||||
}
|
||||
|
||||
@ -2182,3 +2186,5 @@ var (
|
||||
)
|
||||
|
||||
var SimType [NTYPE]Kind
|
||||
|
||||
var ShapePkg = NewPkg(".shape", ".shape")
|
||||
|
25
test/typeparam/issue48337b.dir/a.go
Normal file
25
test/typeparam/issue48337b.dir/a.go
Normal file
@ -0,0 +1,25 @@
|
||||
// Copyright 2021 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package a
|
||||
|
||||
type Container[T any] struct {
|
||||
X T
|
||||
}
|
||||
|
||||
func NewContainer[T any](x T) *Container[T] {
|
||||
return &Container[T]{x}
|
||||
}
|
||||
|
||||
type MetaContainer struct {
|
||||
C *Container[Value]
|
||||
}
|
||||
|
||||
type Value struct{}
|
||||
|
||||
func NewMetaContainer() *MetaContainer {
|
||||
c := NewContainer(Value{})
|
||||
// c := &Container[Value]{Value{}} // <-- this works
|
||||
return &MetaContainer{c}
|
||||
}
|
11
test/typeparam/issue48337b.dir/main.go
Normal file
11
test/typeparam/issue48337b.dir/main.go
Normal file
@ -0,0 +1,11 @@
|
||||
// Copyright 2021 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package main
|
||||
|
||||
import "a"
|
||||
|
||||
func main() {
|
||||
a.NewMetaContainer()
|
||||
}
|
7
test/typeparam/issue48337b.go
Normal file
7
test/typeparam/issue48337b.go
Normal file
@ -0,0 +1,7 @@
|
||||
// rundir -G=3
|
||||
|
||||
// Copyright 2021 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package ignored
|
Loading…
Reference in New Issue
Block a user