gotools/go/callgraph/vta/testdata/src/returns.go

// Copyright 2021 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.

// go:build ignore

package testdata

type I interface{}

func Bar(ii I) (I, I) {
	return Foo(ii)
}

func Foo(iii I) (I, I) {
	return iii, iii
}

func Do(j I) *I {
	return &j
}

func Baz(i I) *I {
	Bar(i)
	return Do(i)
}

// Relevant SSA:
// func Bar(ii I) (I, I):
//   t0 = Foo(ii)
//   t1 = extract t0 #0
//   t2 = extract t0 #1
//   return t1, t2
//
// func Foo(iii I) (I, I):
//   return iii, iii
//
// func Do(j I) *I:
//   t0 = new I (j)
//   *t0 = j
//   return t0
//
// func Baz(i I):
//   t0 = Bar(i)
//   t1 = Do(i)
//   return t1

// t0 and t1 in the last edge correspond to the nodes
// of Do and Baz. This edge is induced by Do(i).

// WANT:
// Local(i) -> Local(ii), Local(j)
// Local(ii) -> Local(iii)
// Local(iii) -> Return(Foo[0]), Return(Foo[1])
// Local(t1) -> Return(Baz[0])
// Local(t1) -> Return(Bar[0])
// Local(t2) -> Return(Bar[1])
// Local(t0) -> Return(Do[0])
// Return(Do[0]) -> Local(t1)