]> Cypherpunks repositories - gostls13.git/commitdiff
test: add a test for parameterized embedded field
authorDan Scales <danscales@google.com>
Fri, 15 Oct 2021 22:05:36 +0000 (15:05 -0700)
committerDan Scales <danscales@google.com>
Sat, 16 Oct 2021 16:27:40 +0000 (16:27 +0000)
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>
src/cmd/compile/internal/typecheck/subr.go
test/typeparam/genembed2.go [new file with mode: 0644]

index b3fc7459e1dc84f56bdf7dfc462568986177d7f2..b4d53025250383c7cd4669520a3b755d0c098db9 100644 (file)
@@ -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
diff --git a/test/typeparam/genembed2.go b/test/typeparam/genembed2.go
new file mode 100644 (file)
index 0000000..6effd2e
--- /dev/null
@@ -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))
+       }
+}