2022-01-06 17:50:49 -07:00
|
|
|
// run -gcflags=-G=3
|
2022-01-05 16:46:31 -07:00
|
|
|
|
|
|
|
// Copyright 2022 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
|
|
|
|
|
|
|
|
func main() {}
|
|
|
|
|
|
|
|
type Sf struct {
|
|
|
|
f int
|
|
|
|
}
|
|
|
|
|
|
|
|
func f0[P Sf](p P) {
|
|
|
|
_ = p.f
|
|
|
|
p.f = 0
|
|
|
|
}
|
|
|
|
|
|
|
|
func f0t[P ~struct{ f int }](p P) {
|
|
|
|
_ = p.f
|
|
|
|
p.f = 0
|
|
|
|
}
|
|
|
|
|
cmd/compile: support field access for typeparam with structural constraint
In the compiler, we need to distinguish field and method access on a
type param. For field access, we avoid the dictionary access (to create
an interface bound) and just do the normal transformDot() (which will
create the field access on the shape type).
This field access works fine for non-pointer types, since the shape type
preserves the underlying type of all types in the shape. But we
generally merge all pointer types into a single shape, which means the
field will not be accessible via the shape type. So, we need to change
Shapify() so that a type which is a pointer type is mapped to its
underlying type, rather than being merged with other pointers.
Because we don't want to change the export format at this point in the
release, we need to compute StructuralType() directly in types1, rather
than relying on types2. That implementation is in types/type.go, along
with the helper specificTypes().
I enabled the compiler-related tests in issue50417.go, added an extra
test for unnamed pointer types, and added a bunch more tests for
interesting cases involving StructuralType(). I added a test
issue50417b.go similar to the original example, but also tests access to
an embedded field.
I also added a unit test in
cmd/compile/internal/types/structuraltype_test.go that tests a bunch of
unusual cases directly (some of which have no structural type).
Updates #50417
Change-Id: I77c55cbad98a2b95efbd4a02a026c07dfbb46caa
Reviewed-on: https://go-review.googlesource.com/c/go/+/376194
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
Trust: Dan Scales <danscales@google.com>
Run-TryBot: Dan Scales <danscales@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
2022-01-06 17:51:10 -07:00
|
|
|
var _ = f0[Sf]
|
|
|
|
var _ = f0t[Sf]
|
2022-01-05 16:46:31 -07:00
|
|
|
|
|
|
|
func f1[P interface {
|
cmd/compile: support field access for typeparam with structural constraint
In the compiler, we need to distinguish field and method access on a
type param. For field access, we avoid the dictionary access (to create
an interface bound) and just do the normal transformDot() (which will
create the field access on the shape type).
This field access works fine for non-pointer types, since the shape type
preserves the underlying type of all types in the shape. But we
generally merge all pointer types into a single shape, which means the
field will not be accessible via the shape type. So, we need to change
Shapify() so that a type which is a pointer type is mapped to its
underlying type, rather than being merged with other pointers.
Because we don't want to change the export format at this point in the
release, we need to compute StructuralType() directly in types1, rather
than relying on types2. That implementation is in types/type.go, along
with the helper specificTypes().
I enabled the compiler-related tests in issue50417.go, added an extra
test for unnamed pointer types, and added a bunch more tests for
interesting cases involving StructuralType(). I added a test
issue50417b.go similar to the original example, but also tests access to
an embedded field.
I also added a unit test in
cmd/compile/internal/types/structuraltype_test.go that tests a bunch of
unusual cases directly (some of which have no structural type).
Updates #50417
Change-Id: I77c55cbad98a2b95efbd4a02a026c07dfbb46caa
Reviewed-on: https://go-review.googlesource.com/c/go/+/376194
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
Trust: Dan Scales <danscales@google.com>
Run-TryBot: Dan Scales <danscales@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
2022-01-06 17:51:10 -07:00
|
|
|
~struct{ f int }
|
2022-01-05 16:46:31 -07:00
|
|
|
m()
|
|
|
|
}](p P) {
|
|
|
|
_ = p.f
|
|
|
|
p.f = 0
|
|
|
|
p.m()
|
|
|
|
}
|
|
|
|
|
cmd/compile: support field access for typeparam with structural constraint
In the compiler, we need to distinguish field and method access on a
type param. For field access, we avoid the dictionary access (to create
an interface bound) and just do the normal transformDot() (which will
create the field access on the shape type).
This field access works fine for non-pointer types, since the shape type
preserves the underlying type of all types in the shape. But we
generally merge all pointer types into a single shape, which means the
field will not be accessible via the shape type. So, we need to change
Shapify() so that a type which is a pointer type is mapped to its
underlying type, rather than being merged with other pointers.
Because we don't want to change the export format at this point in the
release, we need to compute StructuralType() directly in types1, rather
than relying on types2. That implementation is in types/type.go, along
with the helper specificTypes().
I enabled the compiler-related tests in issue50417.go, added an extra
test for unnamed pointer types, and added a bunch more tests for
interesting cases involving StructuralType(). I added a test
issue50417b.go similar to the original example, but also tests access to
an embedded field.
I also added a unit test in
cmd/compile/internal/types/structuraltype_test.go that tests a bunch of
unusual cases directly (some of which have no structural type).
Updates #50417
Change-Id: I77c55cbad98a2b95efbd4a02a026c07dfbb46caa
Reviewed-on: https://go-review.googlesource.com/c/go/+/376194
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
Trust: Dan Scales <danscales@google.com>
Run-TryBot: Dan Scales <danscales@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
2022-01-06 17:51:10 -07:00
|
|
|
var _ = f1[Sfm]
|
|
|
|
|
2022-01-05 16:46:31 -07:00
|
|
|
type Sm struct{}
|
|
|
|
|
|
|
|
func (Sm) m() {}
|
|
|
|
|
|
|
|
type Sfm struct {
|
|
|
|
f int
|
|
|
|
}
|
|
|
|
|
|
|
|
func (Sfm) m() {}
|
|
|
|
|
|
|
|
func f2[P interface {
|
|
|
|
Sfm
|
|
|
|
m()
|
|
|
|
}](p P) {
|
|
|
|
_ = p.f
|
|
|
|
p.f = 0
|
|
|
|
p.m()
|
|
|
|
}
|
|
|
|
|
cmd/compile: support field access for typeparam with structural constraint
In the compiler, we need to distinguish field and method access on a
type param. For field access, we avoid the dictionary access (to create
an interface bound) and just do the normal transformDot() (which will
create the field access on the shape type).
This field access works fine for non-pointer types, since the shape type
preserves the underlying type of all types in the shape. But we
generally merge all pointer types into a single shape, which means the
field will not be accessible via the shape type. So, we need to change
Shapify() so that a type which is a pointer type is mapped to its
underlying type, rather than being merged with other pointers.
Because we don't want to change the export format at this point in the
release, we need to compute StructuralType() directly in types1, rather
than relying on types2. That implementation is in types/type.go, along
with the helper specificTypes().
I enabled the compiler-related tests in issue50417.go, added an extra
test for unnamed pointer types, and added a bunch more tests for
interesting cases involving StructuralType(). I added a test
issue50417b.go similar to the original example, but also tests access to
an embedded field.
I also added a unit test in
cmd/compile/internal/types/structuraltype_test.go that tests a bunch of
unusual cases directly (some of which have no structural type).
Updates #50417
Change-Id: I77c55cbad98a2b95efbd4a02a026c07dfbb46caa
Reviewed-on: https://go-review.googlesource.com/c/go/+/376194
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
Trust: Dan Scales <danscales@google.com>
Run-TryBot: Dan Scales <danscales@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
2022-01-06 17:51:10 -07:00
|
|
|
var _ = f2[Sfm]
|
2022-01-05 16:46:31 -07:00
|
|
|
|
|
|
|
// special case: structural type is a named pointer type
|
|
|
|
|
|
|
|
type PSfm *Sfm
|
|
|
|
|
|
|
|
func f3[P interface{ PSfm }](p P) {
|
|
|
|
_ = p.f
|
|
|
|
p.f = 0
|
|
|
|
}
|
|
|
|
|
cmd/compile: support field access for typeparam with structural constraint
In the compiler, we need to distinguish field and method access on a
type param. For field access, we avoid the dictionary access (to create
an interface bound) and just do the normal transformDot() (which will
create the field access on the shape type).
This field access works fine for non-pointer types, since the shape type
preserves the underlying type of all types in the shape. But we
generally merge all pointer types into a single shape, which means the
field will not be accessible via the shape type. So, we need to change
Shapify() so that a type which is a pointer type is mapped to its
underlying type, rather than being merged with other pointers.
Because we don't want to change the export format at this point in the
release, we need to compute StructuralType() directly in types1, rather
than relying on types2. That implementation is in types/type.go, along
with the helper specificTypes().
I enabled the compiler-related tests in issue50417.go, added an extra
test for unnamed pointer types, and added a bunch more tests for
interesting cases involving StructuralType(). I added a test
issue50417b.go similar to the original example, but also tests access to
an embedded field.
I also added a unit test in
cmd/compile/internal/types/structuraltype_test.go that tests a bunch of
unusual cases directly (some of which have no structural type).
Updates #50417
Change-Id: I77c55cbad98a2b95efbd4a02a026c07dfbb46caa
Reviewed-on: https://go-review.googlesource.com/c/go/+/376194
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
Trust: Dan Scales <danscales@google.com>
Run-TryBot: Dan Scales <danscales@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
2022-01-06 17:51:10 -07:00
|
|
|
var _ = f3[PSfm]
|
|
|
|
|
|
|
|
// special case: structural type is an unnamed pointer type
|
|
|
|
|
|
|
|
func f4[P interface{ *Sfm }](p P) {
|
|
|
|
_ = p.f
|
|
|
|
p.f = 0
|
|
|
|
}
|
|
|
|
|
|
|
|
var _ = f4[*Sfm]
|
|
|
|
|
|
|
|
type A int
|
|
|
|
type B int
|
|
|
|
type C float64
|
|
|
|
|
|
|
|
type Int interface {
|
|
|
|
*Sf | A
|
|
|
|
*Sf | B
|
|
|
|
}
|
|
|
|
|
|
|
|
func f5[P Int](p P) {
|
|
|
|
_ = p.f
|
|
|
|
p.f = 0
|
|
|
|
}
|
|
|
|
|
|
|
|
var _ = f5[*Sf]
|
|
|
|
|
|
|
|
type Int2 interface {
|
|
|
|
*Sf | A
|
|
|
|
any
|
|
|
|
*Sf | C
|
|
|
|
}
|
|
|
|
|
|
|
|
func f6[P Int2](p P) {
|
|
|
|
_ = p.f
|
|
|
|
p.f = 0
|
|
|
|
}
|
|
|
|
|
|
|
|
var _ = f6[*Sf]
|
|
|
|
|
|
|
|
type Int3 interface {
|
|
|
|
Sf
|
|
|
|
~struct{ f int }
|
|
|
|
}
|
|
|
|
|
|
|
|
func f7[P Int3](p P) {
|
|
|
|
_ = p.f
|
|
|
|
p.f = 0
|
|
|
|
}
|
|
|
|
|
|
|
|
var _ = f7[Sf]
|
|
|
|
|
|
|
|
type Em1 interface {
|
|
|
|
*Sf | A
|
|
|
|
}
|
|
|
|
|
|
|
|
type Em2 interface {
|
|
|
|
*Sf | B
|
|
|
|
}
|
|
|
|
|
|
|
|
type Int4 interface {
|
|
|
|
Em1
|
|
|
|
Em2
|
|
|
|
any
|
|
|
|
}
|
|
|
|
|
|
|
|
func f8[P Int4](p P) {
|
|
|
|
_ = p.f
|
|
|
|
p.f = 0
|
|
|
|
}
|
|
|
|
|
|
|
|
var _ = f8[*Sf]
|