| // Copyright 2018 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // 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 "testing" |
| |
| const N = 1000000 |
| |
| type X struct { |
| s []int |
| } |
| |
| func TestSlice(t *testing.T) { |
| done := make(chan struct{}) |
| a := make([]int, N+10) |
| |
| x := &X{a} |
| |
| go func() { |
| for i := 0; i < N; i++ { |
| x.s = x.s[1:9] |
| } |
| done <- struct{}{} |
| }() |
| go func() { |
| for i := 0; i < N; i++ { |
| x.s = x.s[0:8] // should only write len |
| } |
| done <- struct{}{} |
| }() |
| <-done |
| <-done |
| |
| if cap(x.s) != cap(a)-N { |
| t.Errorf("wanted cap=%d, got %d\n", cap(a)-N, cap(x.s)) |
| } |
| if &x.s[0] != &a[N] { |
| t.Errorf("wanted ptr=%p, got %p\n", &a[N], &x.s[0]) |
| } |
| } |