1// errorcheck -0 -m -d=escapemutationscalls,zerocopy -l
2
3// Copyright 2023 The Go Authors. All rights reserved.
4// Use of this source code is governed by a BSD-style
5// license that can be found in the LICENSE file.
6
7package p
8
9import "fmt"
10
11type B struct {
12	x  int
13	px *int
14	pb *B
15}
16
17func F1(b *B) { // ERROR "mutates param: b derefs=0"
18	b.x = 1
19}
20
21func F2(b *B) { // ERROR "mutates param: b derefs=1"
22	*b.px = 1
23}
24
25func F2a(b *B) { // ERROR "mutates param: b derefs=0"
26	b.px = nil
27}
28
29func F3(b *B) { // ERROR "leaking param: b"
30	fmt.Println(b) // ERROR "\.\.\. argument does not escape"
31}
32
33func F4(b *B) { // ERROR "leaking param content: b"
34	fmt.Println(*b) // ERROR "\.\.\. argument does not escape" "\*b escapes to heap"
35}
36
37func F4a(b *B) { // ERROR "leaking param content: b" "mutates param: b derefs=0"
38	b.x = 2
39	fmt.Println(*b) // ERROR "\.\.\. argument does not escape" "\*b escapes to heap"
40}
41
42func F5(b *B) { // ERROR "leaking param: b"
43	sink = b
44}
45
46func F6(b *B) int { // ERROR "b does not escape, mutate, or call"
47	return b.x
48}
49
50var sink any
51
52func M() {
53	var b B // ERROR "moved to heap: b"
54	F1(&b)
55	F2(&b)
56	F2a(&b)
57	F3(&b)
58	F4(&b)
59}
60
61func g(s string) { // ERROR "s does not escape, mutate, or call"
62	sink = &([]byte(s))[10] // ERROR "\(\[\]byte\)\(s\) escapes to heap"
63}
64
65func h(out []byte, s string) { // ERROR "mutates param: out derefs=0" "s does not escape, mutate, or call"
66	copy(out, []byte(s)) // ERROR "zero-copy string->\[\]byte conversion" "\(\[\]byte\)\(s\) does not escape"
67}
68
69func i(s string) byte { // ERROR "s does not escape, mutate, or call"
70	p := []byte(s) // ERROR "zero-copy string->\[\]byte conversion" "\(\[\]byte\)\(s\) does not escape"
71	return p[20]
72}
73
74func j(s string, x byte) { // ERROR "s does not escape, mutate, or call"
75	p := []byte(s) // ERROR "\(\[\]byte\)\(s\) does not escape"
76	p[20] = x
77}
78