mirror of
https://github.com/golang/go
synced 2024-11-17 14:14:56 -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
|
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)
|
name := ir.NewDeclNameAt(u.Pos(), ir.OTYPE, sym)
|
||||||
s := types.NewNamed(name)
|
s := types.NewNamed(name)
|
||||||
|
sym.Def = name
|
||||||
s.SetUnderlying(u)
|
s.SetUnderlying(u)
|
||||||
s.SetIsShape(true)
|
s.SetIsShape(true)
|
||||||
s.SetHasShape(true)
|
s.SetHasShape(true)
|
||||||
@ -1427,5 +1433,3 @@ func Shapify(t *types.Type) *types.Type {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var shaped = map[*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 := newType(TFORW)
|
||||||
t.sym = obj.Sym()
|
t.sym = obj.Sym()
|
||||||
t.nod = obj
|
t.nod = obj
|
||||||
|
if t.sym.Pkg == ShapePkg {
|
||||||
|
t.SetIsShape(true)
|
||||||
|
t.SetHasShape(true)
|
||||||
|
}
|
||||||
return t
|
return t
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2182,3 +2186,5 @@ var (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var SimType [NTYPE]Kind
|
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