| // 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]) | |
| } | |
| } | |