aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2024-03-02 19:27:21 -0800
committerGopher Robot <gobot@golang.org>2024-04-19 17:15:47 +0000
commit2ff89341f643920f827e4c45db8e4b507fedd9f0 (patch)
tree0655297d859b58df9e87a91902d476995b7ca862
parentf0d6ddfac03c1c3048f20d595fd50352c79e1849 (diff)
downloadgo-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.go14
-rw-r--r--src/reflect/type.go5
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