From e46ac3837026bef0feec2d83dbf07a19c1aad29d Mon Sep 17 00:00:00 2001 From: Wayne Zuo Date: Thu, 5 May 2022 21:46:51 +0800 Subject: [PATCH] [release-branch.go1.18] cmd/compile: allow exporting `.rcvr` ident 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 Reviewed-by: Cuong Manh Le TryBot-Result: Gopher Robot Reviewed-by: David Chase Reviewed-by: Matthew Dempsky (cherry picked from commit ac39dbdf58e50a2575b891675e7d2e1400b20cfe) Reviewed-on: https://go-review.googlesource.com/c/go/+/404774 Reviewed-by: Keith Randall Reviewed-by: Keith Randall --- src/cmd/compile/internal/typecheck/iexport.go | 2 +- test/typeparam/issue52241.go | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 test/typeparam/issue52241.go diff --git a/src/cmd/compile/internal/typecheck/iexport.go b/src/cmd/compile/internal/typecheck/iexport.go index 18b5fc7f80..e811368d2b 100644 --- a/src/cmd/compile/internal/typecheck/iexport.go +++ b/src/cmd/compile/internal/typecheck/iexport.go @@ -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 index 0000000000..841afd8b8e --- /dev/null +++ b/test/typeparam/issue52241.go @@ -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() +} -- 2.50.0