diff options
author | Ian Lance Taylor <iant@golang.org> | 2024-03-02 19:27:21 -0800 |
---|---|---|
committer | Gopher Robot <gobot@golang.org> | 2024-04-19 17:15:47 +0000 |
commit | 2ff89341f643920f827e4c45db8e4b507fedd9f0 (patch) | |
tree | 0655297d859b58df9e87a91902d476995b7ca862 | |
parent | f0d6ddfac03c1c3048f20d595fd50352c79e1849 (diff) | |
download | go-2ff89341f643920f827e4c45db8e4b507fedd9f0.tar.gz go-2ff89341f643920f827e4c45db8e4b507fedd9f0.zip |
reflect: omit anonymous field name from StructOf type string
This makes the reflect package match the compiler for StructOf
with an embedded field.
Fixes #24781
Change-Id: Ice64b167cbe0b9d30a953c5d8e2a86f3ad1158bf
Reviewed-on: https://go-review.googlesource.com/c/go/+/567897
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Keith Randall <khr@golang.org>
Commit-Queue: Ian Lance Taylor <iant@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Reviewed-by: Keith Randall <khr@google.com>
Auto-Submit: Ian Lance Taylor <iant@google.com>
-rw-r--r-- | src/reflect/all_test.go | 14 | ||||
-rw-r--r-- | src/reflect/type.go | 5 |
2 files changed, 17 insertions, 2 deletions
diff --git a/src/reflect/all_test.go b/src/reflect/all_test.go index f9b2ffd4f1d..5df83bef7a3 100644 --- a/src/reflect/all_test.go +++ b/src/reflect/all_test.go @@ -6112,6 +6112,20 @@ func TestStructOfTooLarge(t *testing.T) { } } +func TestStructOfAnonymous(t *testing.T) { + var s any = struct{ D1 }{} + f := TypeOf(s).Field(0) + ds := StructOf([]StructField{f}) + st := TypeOf(s) + dt := New(ds).Elem() + if st != dt.Type() { + t.Errorf("StructOf returned %s, want %s", dt.Type(), st) + } + + // This should not panic. + _ = dt.Interface().(struct{ D1 }) +} + func TestChanOf(t *testing.T) { // check construction and use of type not in binary type T string diff --git a/src/reflect/type.go b/src/reflect/type.go index 272f0b87d11..cfefb4c27c6 100644 --- a/src/reflect/type.go +++ b/src/reflect/type.go @@ -2287,8 +2287,9 @@ func StructOf(fields []StructField) Type { // Update string and hash name := f.Name.Name() hash = fnv1(hash, []byte(name)...) - repr = append(repr, (" " + name)...) - if f.Embedded() { + if !f.Embedded() { + repr = append(repr, (" " + name)...) + } else { // Embedded field if f.Typ.Kind() == abi.Pointer { // Embedded ** and *interface{} are illegal |