mirror of
https://github.com/golang/go
synced 2024-09-04 23:44:16 +00:00
test: add a test for parameterized embedded field
Make sure that an embedded field like "MyStruct[T]" works and can be referenced via the name MyStruct. Change-Id: I8be1f1184dd42c4e54e4144aff2fd85e30af722f Reviewed-on: https://go-review.googlesource.com/c/go/+/356312 Trust: Dan Scales <danscales@google.com> Reviewed-by: Robert Griesemer <gri@golang.org>
This commit is contained in:
parent
680caf1535
commit
640a49b8d4
|
@ -1324,9 +1324,6 @@ func (ts *Tsubster) tstruct(t *types.Type, force bool) *types.Type {
|
|||
}
|
||||
}
|
||||
if newfields != nil {
|
||||
// TODO(danscales): make sure this works for the field
|
||||
// names of embedded types (which should keep the name of
|
||||
// the type param, not the instantiated type).
|
||||
newfields[i] = types.NewField(f.Pos, f.Sym, t2)
|
||||
newfields[i].Embedded = f.Embedded
|
||||
newfields[i].Note = f.Note
|
||||
|
|
46
test/typeparam/genembed2.go
Normal file
46
test/typeparam/genembed2.go
Normal file
|
@ -0,0 +1,46 @@
|
|||
// run -gcflags=-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.
|
||||
|
||||
// Test for declaration and use of a parameterized embedded field.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sync"
|
||||
)
|
||||
|
||||
type MyStruct[T any] struct {
|
||||
val T
|
||||
}
|
||||
|
||||
type Lockable[T any] struct {
|
||||
MyStruct[T]
|
||||
mu sync.Mutex
|
||||
}
|
||||
|
||||
// Get returns the value stored in a Lockable.
|
||||
func (l *Lockable[T]) Get() T {
|
||||
l.mu.Lock()
|
||||
defer l.mu.Unlock()
|
||||
return l.MyStruct.val
|
||||
}
|
||||
|
||||
// Set sets the value in a Lockable.
|
||||
func (l *Lockable[T]) Set(v T) {
|
||||
l.mu.Lock()
|
||||
defer l.mu.Unlock()
|
||||
l.MyStruct = MyStruct[T]{v}
|
||||
}
|
||||
|
||||
func main() {
|
||||
var li Lockable[int]
|
||||
|
||||
li.Set(5)
|
||||
if got, want := li.Get(), 5; got != want {
|
||||
panic(fmt.Sprintf("got %d, want %d", got, want))
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue