1// errorcheck -0 -m -l
2
3// Copyright 2015 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
7// Test escape analysis for function parameters.
8
9package foo
10
11var Ssink *string
12
13type U struct {
14	_sp  *string
15	_spp **string
16}
17
18func A(sp *string, spp **string) U { // ERROR "leaking param: sp to result ~r0 level=0$" "leaking param: spp to result ~r0 level=0$"
19	return U{sp, spp}
20}
21
22func B(spp **string) U { // ERROR "leaking param: spp to result ~r0 level=0$"
23	return U{*spp, spp}
24}
25
26func tA1() {
27	s := "cat"
28	sp := &s
29	spp := &sp
30	u := A(sp, spp)
31	_ = u
32	println(s)
33}
34
35func tA2() {
36	s := "cat"
37	sp := &s
38	spp := &sp
39	u := A(sp, spp)
40	println(*u._sp)
41}
42
43func tA3() {
44	s := "cat"
45	sp := &s
46	spp := &sp
47	u := A(sp, spp)
48	println(**u._spp)
49}
50
51func tB1() {
52	s := "cat"
53	sp := &s
54	spp := &sp
55	u := B(spp)
56	_ = u
57	println(s)
58}
59
60func tB2() {
61	s := "cat"
62	sp := &s
63	spp := &sp
64	u := B(spp)
65	println(*u._sp)
66}
67
68func tB3() {
69	s := "cat"
70	sp := &s
71	spp := &sp
72	u := B(spp)
73	println(**u._spp)
74}
75