if p.Name == "main" && cfg.Goarch == "arm" {
ImportPaths = append(ImportPaths, "math")
}
- // In coverage atomic mode everything depends on sync/atomic.
- if cfg.TestCoverMode == "atomic" && (!p.Standard || (p.ImportPath != "runtime/cgo" && p.ImportPath != "runtime/race" && p.ImportPath != "sync/atomic")) {
- ImportPaths = append(ImportPaths, "sync/atomic")
- }
}
// Runtime and its internal packages depend on runtime/internal/sys,
}
var (
- testC bool // -c flag
- testCover bool // -cover flag
- // Note: testCoverMode is cfg.TestCoverMode (-covermode)
+ testC bool // -c flag
+ testCover bool // -cover flag
+ testCoverMode string // -covermode flag
testCoverPaths []string // -coverpkg flag
testCoverPkgs []*load.Package // -coverpkg flag
testO string // -o flag
p.Stale = true // rebuild
p.StaleReason = "rebuild for coverage"
p.Internal.Fake = true // do not warn about rebuild
- p.Internal.CoverMode = cfg.TestCoverMode
+ p.Internal.CoverMode = testCoverMode
var coverFiles []string
coverFiles = append(coverFiles, p.GoFiles...)
coverFiles = append(coverFiles, p.CgoFiles...)
// Prepare build + run + print actions for all packages being tested.
for _, p := range pkgs {
+ // sync/atomic import is inserted by the cover tool. See #18486
+ if testCover && testCoverMode == "atomic" {
+ ensureImport(p, "sync/atomic")
+ }
+
buildTest, runTest, printTest, err := builderTest(&b, p)
if err != nil {
str := err.Error()
b.Do(root)
}
+// ensures that package p imports the named package
+func ensureImport(p *load.Package, pkg string) {
+ for _, d := range p.Internal.Deps {
+ if d.Name == pkg {
+ return
+ }
+ }
+
+ a := load.LoadPackage(pkg, &load.ImportStack{})
+ if a.Error != nil {
+ base.Fatalf("load %s: %v", pkg, a.Error)
+ }
+ load.ComputeStale(a)
+
+ p.Internal.Imports = append(p.Internal.Imports, a)
+}
+
var windowsBadWords = []string{
"install",
"patch",
ptest.Internal.Build.ImportPos = m
if localCover {
- ptest.Internal.CoverMode = cfg.TestCoverMode
+ ptest.Internal.CoverMode = testCoverMode
var coverFiles []string
coverFiles = append(coverFiles, ptest.GoFiles...)
coverFiles = append(coverFiles, ptest.CgoFiles...)
}
func (t *testFuncs) CoverMode() string {
- return cfg.TestCoverMode
+ return testCoverMode
}
func (t *testFuncs) CoverEnabled() bool {
case "covermode":
switch value {
case "set", "count", "atomic":
- cfg.TestCoverMode = value
+ testCoverMode = value
default:
base.Fatalf("invalid flag argument for -covermode: %q", value)
}
}
}
- if cfg.TestCoverMode == "" {
- cfg.TestCoverMode = "set"
+ if testCoverMode == "" {
+ testCoverMode = "set"
if cfg.BuildRace {
// Default coverage mode is atomic when -race is set.
- cfg.TestCoverMode = "atomic"
+ testCoverMode = "atomic"
}
}