]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.18] cmd/compile: allow exporting `.rcvr` ident
authorWayne Zuo <wdvxdr@golangcn.org>
Thu, 5 May 2022 13:46:51 +0000 (21:46 +0800)
committerAlex Rakoczy <alex@golang.org>
Wed, 25 May 2022 19:31:01 +0000 (19:31 +0000)
Noder pass will build a closure to implement generic function
instantiation which may produce `.dict` and `.rcvr` ident.
Since we allow `.dict` during exporting, we should allow `.rcvr` too.

Fixes #52242.

Change-Id: Ifc3912ba5155b5ac1887f20830da64f4fb3fceb6
Reviewed-on: https://go-review.googlesource.com/c/go/+/404314
Run-TryBot: Wayne Zuo <wdvxdr@golangcn.org>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: David Chase <drchase@google.com>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
(cherry picked from commit ac39dbdf58e50a2575b891675e7d2e1400b20cfe)
Reviewed-on: https://go-review.googlesource.com/c/go/+/404774
Reviewed-by: Keith Randall <khr@google.com>
Reviewed-by: Keith Randall <khr@golang.org>
src/cmd/compile/internal/typecheck/iexport.go
test/typeparam/issue52241.go [new file with mode: 0644]

index 18b5fc7f80f862b7a5fbfaeae8b8d3979d92f1d2..e811368d2b431099f9663c119426fa6f942b56e9 100644 (file)
@@ -2284,7 +2284,7 @@ func (w *exportWriter) localIdent(s *types.Sym) {
                return
        }
 
-       if i := strings.LastIndex(name, "."); i >= 0 && !strings.HasPrefix(name, LocalDictName) {
+       if i := strings.LastIndex(name, "."); i >= 0 && !strings.HasPrefix(name, LocalDictName) && !strings.HasPrefix(name, ".rcvr") {
                base.Fatalf("unexpected dot in identifier: %v", name)
        }
 
diff --git a/test/typeparam/issue52241.go b/test/typeparam/issue52241.go
new file mode 100644 (file)
index 0000000..841afd8
--- /dev/null
@@ -0,0 +1,22 @@
+// compile -G=3
+
+// 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
+
+type Collector[T any] struct {
+}
+
+func (c *Collector[T]) Collect() {
+}
+
+func TestInOrderIntTree() {
+       collector := Collector[int]{}
+       _ = collector.Collect
+}
+
+func main() {
+       TestInOrderIntTree()
+}