github.com/powerman/golang-tools@v0.1.11-0.20220410185822-5ad214d8d803/go/callgraph/vta/testdata/src/node_uniqueness.go (about) 1 // Copyright 2021 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // go:build ignore 6 7 package testdata 8 9 // TestNodeTypeUniqueness checks if semantically equivalent types 10 // are being represented using the same pointer value in vta nodes. 11 // If not, some edges become missing in the string representation 12 // of the graph. 13 14 type I interface { 15 Foo() 16 } 17 18 type A struct{} 19 20 func (a A) Foo() {} 21 22 func Baz(a *A) (I, I, interface{}, interface{}) { 23 var i I 24 i = a 25 26 var ii I 27 aa := &A{} 28 ii = aa 29 30 m := make(map[int]int) 31 var iii interface{} 32 iii = m 33 34 var iiii interface{} 35 iiii = m 36 37 return i, ii, iii, iiii 38 } 39 40 // Relevant SSA: 41 // func Baz(a *A) (I, I, interface{}, interface{}): 42 // t0 = make I <- *A (a) 43 // t1 = new A (complit) 44 // t2 = make I <- *A (t1) 45 // t3 = make map[int]int 46 // t4 = make interface{} <- map[int]int (t3) 47 // t5 = make interface{} <- map[int]int (t3) 48 // return t0, t2, t4, t5 49 50 // Without canon approach, one of Pointer(*A) -> Local(t0) and Pointer(*A) -> Local(t2) edges is 51 // missing in the graph string representation. The original graph has both of the edges but the 52 // source node Pointer(*A) is not the same; two occurrences of Pointer(*A) are considered separate 53 // nodes. Since they have the same string representation, one edge gets overridden by the other 54 // during the graph stringification, instead of being joined together as in below. 55 56 // WANT: 57 // Pointer(*testdata.A) -> Local(t0), Local(t2) 58 // Local(t3) -> Local(t4), Local(t5)