2019-11-12 03:45:34 +03:00
|
|
|
// 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
|
|
|
|
}
|
2019-11-12 22:24:17 +03:00
|
|
|
|
|
|
|
func f3() {
|
|
|
|
var n1, n2 Node // ERROR "."
|
|
|
|
n1.Orig = &n1
|
|
|
|
n1.Orig = &n2
|
|
|
|
|
|
|
|
sink = n1.Orig.Orig
|
|
|
|
}
|