mirror of
https://github.com/golang/go
synced 2024-09-29 00:34:30 -06:00
61014f00f2
This change implements field the access p.f where the type of p is a type parameter with a structural constraint that is a struct with a field f. This is only the fix for the type checker. The compiler will need a separate CL. This makes the behavior consistent with the fact that we can write struct composite literals for type parameters with a struct structural type. For #50417. For #50233. Change-Id: I87d07e016f97cbf19c45cde19165eae3ec0bad2b Reviewed-on: https://go-review.googlesource.com/c/go/+/375795 Trust: Robert Griesemer <gri@golang.org> Run-TryBot: Robert Griesemer <gri@golang.org> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Robert Findley <rfindley@google.com>
71 lines
914 B
Go
71 lines
914 B
Go
// run
|
|
|
|
// 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
|
|
}
|
|
|
|
// TODO(danscales) enable once the compiler is fixed
|
|
// var _ = f0[Sf]
|
|
// var _ = f0t[Sf]
|
|
|
|
func f1[P interface {
|
|
Sf
|
|
m()
|
|
}](p P) {
|
|
_ = p.f
|
|
p.f = 0
|
|
p.m()
|
|
}
|
|
|
|
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()
|
|
}
|
|
|
|
// TODO(danscales) enable once the compiler is fixed
|
|
// var _ = f2[Sfm]
|
|
|
|
// special case: structural type is a named pointer type
|
|
|
|
type PSfm *Sfm
|
|
|
|
func f3[P interface{ PSfm }](p P) {
|
|
_ = p.f
|
|
p.f = 0
|
|
}
|
|
|
|
// TODO(danscales) enable once the compiler is fixed
|
|
// var _ = f3[PSfm]
|