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
5package main
6
7import (
8	"sort"
9	"strings"
10
11	"issue20014.dir/a"
12)
13
14func main() {
15	samePackage()
16	crossPackage()
17
18	// Print fields registered with field tracking.
19	var fields []string
20	for _, line := range strings.Split(fieldTrackInfo, "\n") {
21		if line != "" {
22			fields = append(fields, strings.Split(line, "\t")[0])
23		}
24	}
25	sort.Strings(fields) // for stable output, regardless of optimizations
26	for _, field := range fields {
27		println(field)
28	}
29}
30
31type T struct {
32	X int `go:"track"`
33	Y int `go:"track"`
34	Z int // untracked
35}
36
37func (t *T) GetX() int {
38	return t.X
39}
40func (t *T) GetY() int {
41	return t.Y
42}
43func (t *T) GetZ() int {
44	return t.Z
45}
46
47func samePackage() {
48	var t T
49	println(t.GetX())
50	println(t.GetZ())
51}
52
53func crossPackage() {
54	var t a.T
55	println(t.GetX())
56	println(t.GetZ())
57}
58
59// This global variable is set by the linker using the -k option.
60var fieldTrackInfo string
61