reflect: use TestConvert from all_test.go and make it pass

This PR removes convert_test.go which was a minimal version of this test.
This commit is contained in:
Damian Gryski
2026-05-29 13:47:37 -07:00
committed by Damian Gryski
parent 3abe58448b
commit 1c0c26b8b7
5 changed files with 128 additions and 408 deletions
+15 -9
View File
@@ -760,11 +760,6 @@ func (r *RawType) ConvertibleTo(u *RawType) bool {
// This logic is mostly copied from Value.CanConvert
// Don't need to do anything
if r.underlying() == u.underlying() {
return true
}
switch r.Kind() {
case Int, Int8, Int16, Int32, Int64:
switch u.Kind() {
@@ -812,13 +807,13 @@ func (r *RawType) ConvertibleTo(u *RawType) bool {
case Pointer:
// This may fail at runtime if there isn't room
if u.elem().Kind() == Array {
if u.elem().Kind() == Array && r.elem() == u.elem().elem() {
return true
}
case String:
// bytes or runes
if r.elem().Kind() == Uint8 || r.elem().Kind() == Int32 {
if !r.elem().isNamed() && (r.elem().Kind() == Uint8 || r.elem().Kind() == Int32) {
return true
}
@@ -826,16 +821,27 @@ func (r *RawType) ConvertibleTo(u *RawType) bool {
case String:
// bytes or runes
if u.elem().Kind() == Uint8 || u.elem().Kind() == Int32 {
if u.Kind() == Slice && !u.elem().isNamed() && (u.elem().Kind() == Uint8 || u.elem().Kind() == Int32) {
return true
}
case Pointer:
if !r.isNamed() && u.Kind() == Pointer && !u.isNamed() && r.elem().underlying() == u.elem().underlying() {
return true
}
}
if r.underlying() == u.underlying() {
return true
}
if u.Kind() == Interface && u.NumMethod() == 0 {
return true
}
// TODO(dgryski): Unimplemented
// struct types
// channels
//
return false
+27 -5
View File
@@ -47,12 +47,20 @@ func (v Value) isExported() bool {
return v.flags&valueFlagExported != 0
}
func (v Value) isRO() bool {
func (v Value) IsRO() bool {
return v.flags&(valueFlagRO) != 0
}
func (v *Value) MakeRO(ro bool) {
if ro {
v.flags |= valueFlagRO
} else {
v.flags &^= valueFlagRO
}
}
func (v Value) checkRO() {
if v.isRO() {
if v.IsRO() {
panic("reflect: value is not settable")
}
}
@@ -297,7 +305,7 @@ func (v Value) IsValid() bool {
}
func (v Value) CanInterface() bool {
return v.isExported() && !v.isRO()
return v.isExported() && !v.IsRO()
}
func (v Value) CanAddr() bool {
@@ -1532,6 +1540,12 @@ func convertOp(src Value, typ Type) (Value, bool) {
return cvtStringRunes(src, rtype), true
}
}
case Pointer:
rtype := typ.(*RawType)
if rtype.Kind() == Pointer && !rtype.isNamed() {
return cvtDirect(src, rtype), true
}
}
// TODO(dgryski): Unimplemented:
@@ -1576,6 +1590,14 @@ func cvtFloat(v Value, t *RawType) Value {
return makeFloat(v.flags, v.Float(), t)
}
func cvtDirect(v Value, t *RawType) Value {
return Value{
typecode: t,
value: v.value,
flags: v.flags,
}
}
func cvtComplex(v Value, t *RawType) Value {
return makeComplex(v.flags, v.Complex(), t)
}
@@ -1697,7 +1719,7 @@ func cvtIntString(v Value, t *RawType) Value {
return Value{
typecode: t,
value: unsafe.Pointer(&s),
flags: v.flags | valueFlagRO,
flags: v.flags,
}
}
@@ -1710,7 +1732,7 @@ func cvtUintString(v Value, t *RawType) Value {
return Value{
typecode: t,
value: unsafe.Pointer(&s),
flags: v.flags | valueFlagRO,
flags: v.flags,
}
}