]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: fix assert condition in generic method call
authorWayne Zuo <wdvxdr@golangcn.org>
Thu, 16 Jun 2022 03:05:39 +0000 (11:05 +0800)
committerGopher Robot <gobot@golang.org>
Wed, 22 Jun 2022 16:25:18 +0000 (16:25 +0000)
Fixes #53406.

Change-Id: If7ae39ec1042a792d82a0a2de96d168c22d8ab71
Reviewed-on: https://go-review.googlesource.com/c/go/+/412614
Reviewed-by: Keith Randall <khr@google.com>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Alex Rakoczy <alex@golang.org>
Auto-Submit: Alex Rakoczy <alex@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
Run-TryBot: Wayne Zuo <wdvxdr@golangcn.org>

src/cmd/compile/internal/noder/stencil.go
test/typeparam/issue53406.go [new file with mode: 0644]

index eeb503811c95970de1e1e667cbd65b2c46584fcd..d463c850f3620935fd133c36644d378659349f4d 100644 (file)
@@ -208,9 +208,15 @@ func (g *genInst) scanForGenCalls(decl ir.Node) {
 
                        st := g.getInstantiation(gf, targs, true).fun
                        dictValue, usingSubdict := g.getDictOrSubdict(declInfo, n, gf, targs, true)
-                       // We have to be using a subdictionary, since this is
-                       // a generic method call.
-                       assert(usingSubdict)
+                       if hasShapeTypes(targs) {
+                               // We have to be using a subdictionary, since this is
+                               // a generic method call.
+                               assert(usingSubdict)
+                       } else {
+                               // We should use main dictionary, because the receiver is
+                               // an instantiation already, see issue #53406.
+                               assert(!usingSubdict)
+                       }
 
                        // Transform to a function call, by appending the
                        // dictionary and the receiver to the args.
diff --git a/test/typeparam/issue53406.go b/test/typeparam/issue53406.go
new file mode 100644 (file)
index 0000000..90fe78f
--- /dev/null
@@ -0,0 +1,22 @@
+// compile
+
+// 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() {
+       f[int]()
+}
+
+func f[T1 any]() {
+       var x Outer[T1, int]
+       x.M()
+}
+
+type Outer[T1, T2 any] struct{ Inner[T2] }
+
+type Inner[_ any] int
+
+func (Inner[_]) M() {}