// run // This test makes sure that t.s = t.s[0:x] doesn't write // either the slice pointer or the capacity. // See issue #14855. package main import "fmt" const N = 1000000 type T struct { s []int } func main() { done := make(chan struct{}) a := make([]int, N+10) t := &T{a} go func() { for i := 0; i < N; i++ { t.s = t.s[1:9] } done <- struct{}{} }() go func() { for i := 0; i < N; i++ { t.s = t.s[0:8] // should only write len } done <- struct{}{} }() <-done <-done ok := true if cap(t.s) != cap(a)-N { fmt.Printf("wanted cap=%d, got %d\n", cap(a)-N, cap(t.s)) ok = false } if &t.s[0] != &a[N] { fmt.Printf("wanted ptr=%p, got %p\n", &a[N], &t.s[0]) ok = false } if !ok { panic("bad") } }