Skip to content

Commit 99bbd3c

Browse files
committed
go/callgraph/vta: use core type for struct fields
Fixes golang/go#63146 Change-Id: Iafcd171b727ecf8bab04fdd2dbc06823574050df Reviewed-on: https://go-review.googlesource.com/c/tools/+/536035 LUCI-TryBot-Result: Go LUCI <[email protected]> Run-TryBot: Tim King <[email protected]> TryBot-Result: Gopher Robot <[email protected]> Reviewed-by: Zvonimir Pavlinovic <[email protected]>
1 parent 8ed1113 commit 99bbd3c

File tree

3 files changed

+30
-3
lines changed

3 files changed

+30
-3
lines changed

go/callgraph/vta/graph.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,12 +106,12 @@ type field struct {
106106
}
107107

108108
func (f field) Type() types.Type {
109-
s := f.StructType.Underlying().(*types.Struct)
109+
s := typeparams.CoreType(f.StructType).(*types.Struct)
110110
return s.Field(f.index).Type()
111111
}
112112

113113
func (f field) String() string {
114-
s := f.StructType.Underlying().(*types.Struct)
114+
s := typeparams.CoreType(f.StructType).(*types.Struct)
115115
return fmt.Sprintf("Field(%v:%s)", f.StructType, s.Field(f.index).Name())
116116
}
117117

@@ -434,7 +434,7 @@ func (b *builder) field(f *ssa.Field) {
434434
}
435435

436436
func (b *builder) fieldAddr(f *ssa.FieldAddr) {
437-
t := f.X.Type().Underlying().(*types.Pointer).Elem()
437+
t := typeparams.CoreType(f.X.Type()).(*types.Pointer).Elem()
438438

439439
// Since we are getting pointer to a field, make a bidirectional edge.
440440
fnode := field{StructType: t, index: f.Field}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package test
2+
3+
type embedded struct{}
4+
5+
type S struct{ embedded }
6+
7+
func (_ S) M() {}
8+
9+
type C interface {
10+
M()
11+
S
12+
}
13+
14+
func G[T C]() {
15+
t := T{embedded{}}
16+
t.M()
17+
}
18+
19+
func F() {
20+
G[S]()
21+
}
22+
23+
// WANT:
24+
// F: G[testdata.S]() -> G[testdata.S]
25+
// G[testdata.S]: (S).M(t2) -> S.M
26+
// S.M: (testdata.S).M(t1) -> S.M

go/callgraph/vta/vta_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ func TestVTACallGraphGenerics(t *testing.T) {
127127
files := []string{
128128
"testdata/src/arrays_generics.go",
129129
"testdata/src/callgraph_generics.go",
130+
"testdata/src/issue63146.go",
130131
}
131132
for _, file := range files {
132133
t.Run(file, func(t *testing.T) {

0 commit comments

Comments
 (0)