1// run
2
3// Copyright 2018 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// Issue 26407: ensure that stack variables which have
8// had their address taken and then used in a comparison,
9// but are otherwise unused, are cleared.
10
11package main
12
13func main() {
14	poison()
15	test()
16}
17
18//go:noinline
19func poison() {
20	// initialise the stack with invalid pointers
21	var large [256]uintptr
22	for i := range large {
23		large[i] = 1
24	}
25	use(large[:])
26}
27
28//go:noinline
29func test() {
30	a := 2
31	x := &a
32	if x != compare(&x) {
33		panic("not possible")
34	}
35}
36
37//go:noinline
38func compare(x **int) *int {
39	var y *int
40	if x == &y {
41		panic("not possible")
42	}
43	// grow the stack to trigger a check for invalid pointers
44	grow()
45	if x == &y {
46		panic("not possible")
47	}
48	return *x
49}
50
51//go:noinline
52func grow() {
53	var large [1 << 16]uintptr
54	use(large[:])
55}
56
57//go:noinline
58func use(_ []uintptr) { }
59