From 60bb832c894c4e62b22dd126c9bd5dc776443c05 Mon Sep 17 00:00:00 2001 From: Damian Gryski Date: Sat, 1 Apr 2023 09:39:25 -0700 Subject: [PATCH] reflect: handle Convert'ing between identical underlying types Needed for go-jose/v3 --- src/reflect/value.go | 11 ++++++++++- src/reflect/value_test.go | 6 ++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/reflect/value.go b/src/reflect/value.go index dd2691be..51c69cd5 100644 --- a/src/reflect/value.go +++ b/src/reflect/value.go @@ -1224,6 +1224,16 @@ func (v Value) Convert(t Type) Value { } func convertOp(src Value, typ Type) (Value, bool) { + + // Easy check first. Do we even need to do anything? + if src.typecode.underlying() == typ.(*rawType).underlying() { + return Value{ + typecode: typ.(*rawType), + value: src.value, + flags: src.flags, + }, true + } + switch src.Kind() { case Int, Int8, Int16, Int32, Int64: switch rtype := typ.(*rawType); rtype.Kind() { @@ -1289,7 +1299,6 @@ func convertOp(src Value, typ Type) (Value, bool) { // TODO(dgryski): Unimplemented: // Chan - // Identical underlying types // Non-defined pointers types with same underlying base type // Interface <-> Type conversions diff --git a/src/reflect/value_test.go b/src/reflect/value_test.go index 64b1cf0e..b6c17705 100644 --- a/src/reflect/value_test.go +++ b/src/reflect/value_test.go @@ -587,6 +587,12 @@ func TestConvert(t *testing.T) { t.Errorf("Convert(string -> []byte") } + type namedString string + + c = v.Convert(TypeOf(namedString(""))) + if c.Type().Kind() != String || c.Type().Name() != "namedString" { + t.Errorf("Convert(string -> namedString") + } } func equal[T comparable](a, b []T) bool {