1// errorcheck -0 -l -m=2
2
3// Copyright 2019 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// This test makes sure that -m=2's escape analysis diagnostics don't
8// go into an infinite loop when handling negative dereference
9// cycles. The critical thing being tested here is that compilation
10// succeeds ("errorcheck -0"), not any particular diagnostic output,
11// hence the very lax ERROR patterns below.
12
13package p
14
15type Node struct {
16	Orig *Node
17}
18
19var sink *Node
20
21func f1() {
22	var n Node // ERROR "."
23	n.Orig = &n
24
25	m := n // ERROR "."
26	sink = &m
27}
28
29func f2() {
30	var n1, n2 Node // ERROR "."
31	n1.Orig = &n2
32	n2 = n1
33
34	m := n2 // ERROR "."
35	sink = &m
36}
37
38func f3() {
39	var n1, n2 Node // ERROR "."
40	n1.Orig = &n1
41	n1.Orig = &n2
42
43	sink = n1.Orig.Orig
44}
45