]> Cypherpunks repositories - gostls13.git/commitdiff
go/types, types: add additional generic cases for the Selections API
authorRobert Findley <rfindley@google.com>
Tue, 8 Mar 2022 21:16:49 +0000 (16:16 -0500)
committerRobert Findley <rfindley@google.com>
Tue, 22 Mar 2022 13:07:38 +0000 (13:07 +0000)
Change-Id: Icc5240db7447846061d0d81f5e15f788758d4d64
Reviewed-on: https://go-review.googlesource.com/c/go/+/393372
Trust: Robert Findley <rfindley@google.com>
Reviewed-by: Robert Griesemer <gri@golang.org>
Run-TryBot: Dmitri Shuralyov <dmitshur@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>

src/cmd/compile/internal/types2/api_test.go
src/go/types/api_test.go

index 5bb551798ee230499178fa27699194de1cc54eac..d433ed1bdf7de389b9cd3acebc62e6949de114a3 100644 (file)
@@ -1428,15 +1428,23 @@ type C struct {
        c int
 }
 
+type G[P any] struct {
+       p P
+}
+
+func (G[P]) m(P) {}
+
+var Inst G[int]
+
 func (C) g()
 func (*C) h()
 
 func main() {
        // qualified identifiers
        var _ lib.T
-        _ = lib.C
-        _ = lib.F
-        _ = lib.V
+       _ = lib.C
+       _ = lib.F
+       _ = lib.V
        _ = lib.T.M
 
        // fields
@@ -1452,25 +1460,30 @@ func main() {
        _ = A{}.c
        _ = new(A).c
 
+       _ = Inst.p
+       _ = G[string]{}.p
+
        // methods
-        _ = A{}.f
-        _ = new(A).f
-        _ = A{}.g
-        _ = new(A).g
-        _ = new(A).h
+       _ = A{}.f
+       _ = new(A).f
+       _ = A{}.g
+       _ = new(A).g
+       _ = new(A).h
 
-        _ = B{}.f
-        _ = new(B).f
+       _ = B{}.f
+       _ = new(B).f
 
-        _ = C{}.g
-        _ = new(C).g
-        _ = new(C).h
+       _ = C{}.g
+       _ = new(C).g
+       _ = new(C).h
+       _ = Inst.m
 
        // method expressions
-        _ = A.f
-        _ = (*A).f
-        _ = B.f
-        _ = (*B).f
+       _ = A.f
+       _ = (*A).f
+       _ = B.f
+       _ = (*B).f
+       _ = G[string].m
 }`
 
        wantOut := map[string][2]string{
@@ -1484,6 +1497,7 @@ func main() {
                "new(A).b": {"field (*main.A) b int", "->[0 0]"},
                "A{}.c":    {"field (main.A) c int", ".[1 0]"},
                "new(A).c": {"field (*main.A) c int", "->[1 0]"},
+               "Inst.p":   {"field (main.G[int]) p int", ".[0]"},
 
                "A{}.f":    {"method (main.A) f(int)", "->[0 0]"},
                "new(A).f": {"method (*main.A) f(int)", "->[0 0]"},
@@ -1495,11 +1509,14 @@ func main() {
                "C{}.g":    {"method (main.C) g()", ".[0]"},
                "new(C).g": {"method (*main.C) g()", "->[0]"},
                "new(C).h": {"method (*main.C) h()", "->[1]"}, // TODO(gri) should this report .[1] ?
-
-               "A.f":    {"method expr (main.A) f(main.A, int)", "->[0 0]"},
-               "(*A).f": {"method expr (*main.A) f(*main.A, int)", "->[0 0]"},
-               "B.f":    {"method expr (main.B) f(main.B, int)", ".[0]"},
-               "(*B).f": {"method expr (*main.B) f(*main.B, int)", "->[0]"},
+               "Inst.m":   {"method (main.G[int]) m(int)", ".[0]"},
+
+               "A.f":           {"method expr (main.A) f(main.A, int)", "->[0 0]"},
+               "(*A).f":        {"method expr (*main.A) f(*main.A, int)", "->[0 0]"},
+               "B.f":           {"method expr (main.B) f(main.B, int)", ".[0]"},
+               "(*B).f":        {"method expr (*main.B) f(*main.B, int)", "->[0]"},
+               "G[string].m":   {"method expr (main.G[string]) m(main.G[string], string)", ".[0]"},
+               "G[string]{}.p": {"field (main.G[string]) p string", ".[0]"},
        }
 
        makePkg("lib", libSrc)
index 4014201769ea546537d1d502ddbd09554f311957..d25e6116cf4cc062bf755f8c8531e68b64fa9d95 100644 (file)
@@ -1432,15 +1432,23 @@ type C struct {
        c int
 }
 
+type G[P any] struct {
+       p P
+}
+
+func (G[P]) m(P) {}
+
+var Inst G[int]
+
 func (C) g()
 func (*C) h()
 
 func main() {
        // qualified identifiers
        var _ lib.T
-        _ = lib.C
-        _ = lib.F
-        _ = lib.V
+       _ = lib.C
+       _ = lib.F
+       _ = lib.V
        _ = lib.T.M
 
        // fields
@@ -1456,25 +1464,30 @@ func main() {
        _ = A{}.c
        _ = new(A).c
 
+       _ = Inst.p
+       _ = G[string]{}.p
+
        // methods
-        _ = A{}.f
-        _ = new(A).f
-        _ = A{}.g
-        _ = new(A).g
-        _ = new(A).h
+       _ = A{}.f
+       _ = new(A).f
+       _ = A{}.g
+       _ = new(A).g
+       _ = new(A).h
 
-        _ = B{}.f
-        _ = new(B).f
+       _ = B{}.f
+       _ = new(B).f
 
-        _ = C{}.g
-        _ = new(C).g
-        _ = new(C).h
+       _ = C{}.g
+       _ = new(C).g
+       _ = new(C).h
+       _ = Inst.m
 
        // method expressions
-        _ = A.f
-        _ = (*A).f
-        _ = B.f
-        _ = (*B).f
+       _ = A.f
+       _ = (*A).f
+       _ = B.f
+       _ = (*B).f
+       _ = G[string].m
 }`
 
        wantOut := map[string][2]string{
@@ -1488,6 +1501,7 @@ func main() {
                "new(A).b": {"field (*main.A) b int", "->[0 0]"},
                "A{}.c":    {"field (main.A) c int", ".[1 0]"},
                "new(A).c": {"field (*main.A) c int", "->[1 0]"},
+               "Inst.p":   {"field (main.G[int]) p int", ".[0]"},
 
                "A{}.f":    {"method (main.A) f(int)", "->[0 0]"},
                "new(A).f": {"method (*main.A) f(int)", "->[0 0]"},
@@ -1499,11 +1513,14 @@ func main() {
                "C{}.g":    {"method (main.C) g()", ".[0]"},
                "new(C).g": {"method (*main.C) g()", "->[0]"},
                "new(C).h": {"method (*main.C) h()", "->[1]"}, // TODO(gri) should this report .[1] ?
-
-               "A.f":    {"method expr (main.A) f(main.A, int)", "->[0 0]"},
-               "(*A).f": {"method expr (*main.A) f(*main.A, int)", "->[0 0]"},
-               "B.f":    {"method expr (main.B) f(main.B, int)", ".[0]"},
-               "(*B).f": {"method expr (*main.B) f(*main.B, int)", "->[0]"},
+               "Inst.m":   {"method (main.G[int]) m(int)", ".[0]"},
+
+               "A.f":           {"method expr (main.A) f(main.A, int)", "->[0 0]"},
+               "(*A).f":        {"method expr (*main.A) f(*main.A, int)", "->[0 0]"},
+               "B.f":           {"method expr (main.B) f(main.B, int)", ".[0]"},
+               "(*B).f":        {"method expr (*main.B) f(*main.B, int)", "->[0]"},
+               "G[string].m":   {"method expr (main.G[string]) m(main.G[string], string)", ".[0]"},
+               "G[string]{}.p": {"field (main.G[string]) p string", ".[0]"},
        }
 
        makePkg("lib", libSrc)