test: add a field tracking test

Now that we can set experiments at build time instead of make.bash time,
we can actually write a test for field tracking!

Update #20014

This CL contains a test for the functionality fixed in CL 312069.

Change-Id: I7569a7057bbc7c88ae25ae7bf974b0c8a4e35be8
Reviewed-on: https://go-review.googlesource.com/c/go/+/312217
Trust: Keith Randall <khr@golang.org>
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
diff --git a/test/fixedbugs/issue20014.dir/a/a.go b/test/fixedbugs/issue20014.dir/a/a.go
new file mode 100644
index 0000000..1e66326
--- /dev/null
+++ b/test/fixedbugs/issue20014.dir/a/a.go
@@ -0,0 +1,21 @@
+// 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.
+
+package a
+
+type T struct {
+	X int `go:"track"`
+	Y int `go:"track"`
+	Z int // untracked
+}
+
+func (t *T) GetX() int {
+	return t.X
+}
+func (t *T) GetY() int {
+	return t.Y
+}
+func (t *T) GetZ() int {
+	return t.Z
+}
diff --git a/test/fixedbugs/issue20014.dir/main.go b/test/fixedbugs/issue20014.dir/main.go
new file mode 100644
index 0000000..ac9957d
--- /dev/null
+++ b/test/fixedbugs/issue20014.dir/main.go
@@ -0,0 +1,54 @@
+// 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.
+
+package main
+
+import (
+	"strings"
+
+	"issue20014.dir/a"
+)
+
+func main() {
+	samePackage()
+	crossPackage()
+	// Print fields registered with field tracking.
+	for _, line := range strings.Split(fieldTrackInfo, "\n") {
+		if line == "" {
+			continue
+		}
+		println(strings.Split(line, "\t")[0])
+	}
+}
+
+type T struct {
+	X int `go:"track"`
+	Y int `go:"track"`
+	Z int // untracked
+}
+
+func (t *T) GetX() int {
+	return t.X
+}
+func (t *T) GetY() int {
+	return t.Y
+}
+func (t *T) GetZ() int {
+	return t.Z
+}
+
+func samePackage() {
+	var t T
+	println(t.GetX())
+	println(t.GetZ())
+}
+
+func crossPackage() {
+	var t a.T
+	println(t.GetX())
+	println(t.GetZ())
+}
+
+// This global variable is set by the linker using the -k option.
+var fieldTrackInfo string
diff --git a/test/fixedbugs/issue20014.go b/test/fixedbugs/issue20014.go
new file mode 100644
index 0000000..e186aa1
--- /dev/null
+++ b/test/fixedbugs/issue20014.go
@@ -0,0 +1,7 @@
+// runindir -goexperiment fieldtrack -ldflags -k=main.fieldTrackInfo
+
+// 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.
+
+package ignored
diff --git a/test/fixedbugs/issue20014.out b/test/fixedbugs/issue20014.out
new file mode 100644
index 0000000..252e78d
--- /dev/null
+++ b/test/fixedbugs/issue20014.out
@@ -0,0 +1,6 @@
+0
+0
+0
+0
+main.T.X
+issue20014.dir/a.T.X