}
type testCase struct {
+ // -1 means Addr().Elem() of current value
index []int
canSet bool
}
val: ValueOf(&S1{}),
cases: []testCase{
{[]int{0}, false},
+ {[]int{0, -1}, false},
{[]int{0, 0}, false},
+ {[]int{0, 0, -1}, false},
+ {[]int{0, -1, 0}, false},
+ {[]int{0, -1, 0, -1}, false},
{[]int{0, 1}, true},
+ {[]int{0, 1, -1}, true},
+ {[]int{0, -1, 1}, true},
+ {[]int{0, -1, 1, -1}, true},
{[]int{1}, false},
+ {[]int{1, -1}, false},
{[]int{2}, true},
+ {[]int{2, -1}, true},
},
}, {
val: ValueOf(&S2{embed: &embed{}}),
cases: []testCase{
{[]int{0}, false},
+ {[]int{0, -1}, false},
{[]int{0, 0}, false},
+ {[]int{0, 0, -1}, false},
+ {[]int{0, -1, 0}, false},
+ {[]int{0, -1, 0, -1}, false},
{[]int{0, 1}, true},
+ {[]int{0, 1, -1}, true},
+ {[]int{0, -1, 1}, true},
+ {[]int{0, -1, 1, -1}, true},
{[]int{1}, false},
{[]int{2}, true},
},
val: ValueOf(&S3{}),
cases: []testCase{
{[]int{0}, true},
+ {[]int{0, -1}, true},
{[]int{0, 0}, false},
+ {[]int{0, 0, -1}, false},
+ {[]int{0, -1, 0}, false},
+ {[]int{0, -1, 0, -1}, false},
{[]int{0, 1}, true},
+ {[]int{0, 1, -1}, true},
+ {[]int{0, -1, 1}, true},
+ {[]int{0, -1, 1, -1}, true},
{[]int{1}, false},
{[]int{2}, true},
},
val: ValueOf(&S4{Embed: &Embed{}}),
cases: []testCase{
{[]int{0}, true},
+ {[]int{0, -1}, true},
{[]int{0, 0}, false},
+ {[]int{0, 0, -1}, false},
+ {[]int{0, -1, 0}, false},
+ {[]int{0, -1, 0, -1}, false},
{[]int{0, 1}, true},
+ {[]int{0, 1, -1}, true},
+ {[]int{0, -1, 1}, true},
+ {[]int{0, -1, 1, -1}, true},
{[]int{1}, false},
{[]int{2}, true},
},
if f.Kind() == Ptr {
f = f.Elem()
}
- f = f.Field(i)
+ if i == -1 {
+ f = f.Addr().Elem()
+ } else {
+ f = f.Field(i)
+ }
}
if got := f.CanSet(); got != tc.canSet {
t.Errorf("CanSet() = %v, want %v", got, tc.canSet)