@@ -350,6 +350,7 @@ func TestCanSetField(t *testing.T) {
350
350
}
351
351
352
352
type testCase struct {
353
+ // -1 means Addr().Elem() of current value
353
354
index []int
354
355
canSet bool
355
356
}
@@ -360,35 +361,65 @@ func TestCanSetField(t *testing.T) {
360
361
val : ValueOf (& S1 {}),
361
362
cases : []testCase {
362
363
{[]int {0 }, false },
364
+ {[]int {0 , - 1 }, false },
363
365
{[]int {0 , 0 }, false },
366
+ {[]int {0 , 0 , - 1 }, false },
367
+ {[]int {0 , - 1 , 0 }, false },
368
+ {[]int {0 , - 1 , 0 , - 1 }, false },
364
369
{[]int {0 , 1 }, true },
370
+ {[]int {0 , 1 , - 1 }, true },
371
+ {[]int {0 , - 1 , 1 }, true },
372
+ {[]int {0 , - 1 , 1 , - 1 }, true },
365
373
{[]int {1 }, false },
374
+ {[]int {1 , - 1 }, false },
366
375
{[]int {2 }, true },
376
+ {[]int {2 , - 1 }, true },
367
377
},
368
378
}, {
369
379
val : ValueOf (& S2 {embed : & embed {}}),
370
380
cases : []testCase {
371
381
{[]int {0 }, false },
382
+ {[]int {0 , - 1 }, false },
372
383
{[]int {0 , 0 }, false },
384
+ {[]int {0 , 0 , - 1 }, false },
385
+ {[]int {0 , - 1 , 0 }, false },
386
+ {[]int {0 , - 1 , 0 , - 1 }, false },
373
387
{[]int {0 , 1 }, true },
388
+ {[]int {0 , 1 , - 1 }, true },
389
+ {[]int {0 , - 1 , 1 }, true },
390
+ {[]int {0 , - 1 , 1 , - 1 }, true },
374
391
{[]int {1 }, false },
375
392
{[]int {2 }, true },
376
393
},
377
394
}, {
378
395
val : ValueOf (& S3 {}),
379
396
cases : []testCase {
380
397
{[]int {0 }, true },
398
+ {[]int {0 , - 1 }, true },
381
399
{[]int {0 , 0 }, false },
400
+ {[]int {0 , 0 , - 1 }, false },
401
+ {[]int {0 , - 1 , 0 }, false },
402
+ {[]int {0 , - 1 , 0 , - 1 }, false },
382
403
{[]int {0 , 1 }, true },
404
+ {[]int {0 , 1 , - 1 }, true },
405
+ {[]int {0 , - 1 , 1 }, true },
406
+ {[]int {0 , - 1 , 1 , - 1 }, true },
383
407
{[]int {1 }, false },
384
408
{[]int {2 }, true },
385
409
},
386
410
}, {
387
411
val : ValueOf (& S4 {Embed : & Embed {}}),
388
412
cases : []testCase {
389
413
{[]int {0 }, true },
414
+ {[]int {0 , - 1 }, true },
390
415
{[]int {0 , 0 }, false },
416
+ {[]int {0 , 0 , - 1 }, false },
417
+ {[]int {0 , - 1 , 0 }, false },
418
+ {[]int {0 , - 1 , 0 , - 1 }, false },
391
419
{[]int {0 , 1 }, true },
420
+ {[]int {0 , 1 , - 1 }, true },
421
+ {[]int {0 , - 1 , 1 }, true },
422
+ {[]int {0 , - 1 , 1 , - 1 }, true },
392
423
{[]int {1 }, false },
393
424
{[]int {2 }, true },
394
425
},
@@ -402,7 +433,11 @@ func TestCanSetField(t *testing.T) {
402
433
if f .Kind () == Ptr {
403
434
f = f .Elem ()
404
435
}
405
- f = f .Field (i )
436
+ if i == - 1 {
437
+ f = f .Addr ().Elem ()
438
+ } else {
439
+ f = f .Field (i )
440
+ }
406
441
}
407
442
if got := f .CanSet (); got != tc .canSet {
408
443
t .Errorf ("CanSet() = %v, want %v" , got , tc .canSet )
0 commit comments