github.com/powerman/golang-tools@v0.1.11-0.20220410185822-5ad214d8d803/go/callgraph/vta/testdata/src/store_load_alias.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  type A struct{}
    10  
    11  func (a A) foo() {}
    12  
    13  type I interface{ foo() }
    14  
    15  func Baz(i I) {
    16  	j := &i
    17  	k := &j
    18  	**k = A{}
    19  	i.foo()
    20  	(**k).foo()
    21  }
    22  
    23  // Relevant SSA:
    24  // func Baz(i I):
    25  //   t0 = new I (i)
    26  //   *t0 = i
    27  //   t1 = new *I (j)
    28  //   *t1 = t0
    29  //   t2 = *t1
    30  //   t3 = local A (complit)
    31  //   t4 = *t3
    32  //   t5 = make I <- A (t4)
    33  //   *t2 = t5
    34  //   t6 = *t0
    35  //   t7 = invoke t6.foo()
    36  //   t8 = *t1
    37  //   t9 = *t8
    38  //   t10 = invoke t9.foo()
    39  
    40  // Flow chain showing that A reaches i.foo():
    41  //   t4 (A) -> t5 -> t2 <-> PtrInterface(I) <-> t0 -> t6
    42  // Flow chain showing that A reaches (**k).foo():
    43  //	 t4 (A) -> t5 -> t2 <-> PtrInterface(I) <-> t8 -> t9
    44  
    45  // WANT:
    46  // Local(i) -> Local(t0)
    47  // Local(t0) -> Local(t6), PtrInterface(testdata.I)
    48  // PtrInterface(testdata.I) -> Local(t0), Local(t2), Local(t8)
    49  // Local(t2) -> PtrInterface(testdata.I)
    50  // Local(t4) -> Local(t5)
    51  // Local(t5) -> Local(t2)
    52  // Local(t8) -> Local(t9), PtrInterface(testdata.I)