From 1d3a5b4aeac319acd51b32e1d47a9c316d9ce2aa Mon Sep 17 00:00:00 2001 From: zhouguangyuan Date: Thu, 16 Dec 2021 22:18:26 +0800 Subject: [PATCH] reflect: fix name of type parameter Fixes #50208 Change-Id: Ib0aff56341adb98ff6831c5badd1603ebf002b79 Reviewed-on: https://go-review.googlesource.com/c/go/+/372774 Reviewed-by: Keith Randall Run-TryBot: Keith Randall TryBot-Result: Gopher Robot Trust: Cherry Mui --- src/reflect/all_test.go | 14 ++++++++++++++ src/reflect/type.go | 9 ++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/reflect/all_test.go b/src/reflect/all_test.go index 9c8434c22c..866f38e687 100644 --- a/src/reflect/all_test.go +++ b/src/reflect/all_test.go @@ -7768,3 +7768,17 @@ func TestMethodCallValueCodePtr(t *testing.T) { t.Errorf("methodValueCall code pointer mismatched, want: %v, got: %v", want, got) } } + +type A struct{} +type B[T any] struct{} + +func TestIssue50208(t *testing.T) { + want1 := "B[reflect_test.A]" + if got := TypeOf(new(B[A])).Elem().Name(); got != want1 { + t.Errorf("name of type parameter mismatched, want:%s, got:%s", want1, got) + } + want2 := "B[reflect_test.B[reflect_test.A]]" + if got := TypeOf(new(B[B[A]])).Elem().Name(); got != want2 { + t.Errorf("name of type parameter mismatched, want:%s, got:%s", want2, got) + } +} diff --git a/src/reflect/type.go b/src/reflect/type.go index 6217291a3f..4e03dc3382 100644 --- a/src/reflect/type.go +++ b/src/reflect/type.go @@ -915,7 +915,14 @@ func (t *rtype) Name() string { } s := t.String() i := len(s) - 1 - for i >= 0 && s[i] != '.' { + sqBrackets := 0 + for i >= 0 && (s[i] != '.' || sqBrackets != 0) { + switch s[i] { + case ']': + sqBrackets++ + case '[': + sqBrackets-- + } i-- } return s[i+1:] -- 2.50.0