| // errorcheck -0 -l -m=2 | |
| // Copyright 2019 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 -m=2's escape analysis diagnostics don't | |
| // go into an infinite loop when handling negative dereference | |
| // cycles. The critical thing being tested here is that compilation | |
| // succeeds ("errorcheck -0"), not any particular diagnostic output, | |
| // hence the very lax ERROR patterns below. | |
| package p | |
| type Node struct { | |
| Orig *Node | |
| } | |
| var sink *Node | |
| func f1() { | |
| var n Node // ERROR "." | |
| n.Orig = &n | |
| m := n // ERROR "." | |
| sink = &m | |
| } | |
| func f2() { | |
| var n1, n2 Node // ERROR "." | |
| n1.Orig = &n2 | |
| n2 = n1 | |
| m := n2 // ERROR "." | |
| sink = &m | |
| } | |
| func f3() { | |
| var n1, n2 Node // ERROR "." | |
| n1.Orig = &n1 | |
| n1.Orig = &n2 | |
| sink = n1.Orig.Orig | |
| } |