From e6756ec1492558f4724b8942d4c60c982563aa42 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Sun, 4 Feb 2018 18:45:39 -0800 Subject: [PATCH] cmd/go: ignore coverpkg match on sync/atomic in atomic coverage mode Otherwise we get into a dependency loop as we try to apply coverage analysis to sync/atomic when the coverage analysis itself requires sync/atomic. Fixes #23694 Change-Id: I3a74ef3881ec5c6197ed348acc7f9e175417f6c7 Reviewed-on: https://go-review.googlesource.com/91875 Run-TryBot: Ian Lance Taylor Reviewed-by: Russ Cox --- src/cmd/go/go_test.go | 13 +++++++++++++ src/cmd/go/internal/test/test.go | 9 +++++++++ 2 files changed, 22 insertions(+) diff --git a/src/cmd/go/go_test.go b/src/cmd/go/go_test.go index ac47adb8e7d..9009ec92e13 100644 --- a/src/cmd/go/go_test.go +++ b/src/cmd/go/go_test.go @@ -5686,3 +5686,16 @@ func TestCpuprofileTwice(t *testing.T) { tg.run("test", "-o="+bin, "-cpuprofile="+out, "x") tg.mustExist(out) } + +// Issue 23694. +func TestAtomicCoverpkgAll(t *testing.T) { + tg := testgo(t) + defer tg.cleanup() + tg.parallel() + + tg.tempFile("src/x/x.go", `package x; import _ "sync/atomic"; func F() {}`) + tg.tempFile("src/x/x_test.go", `package x; import "testing"; func TestF(t *testing.T) { F() }`) + tg.setenv("GOPATH", tg.path(".")) + tg.run("test", "-coverpkg=all", "-race", "x") + tg.run("test", "-coverpkg=all", "-covermode=atomic", "x") +} diff --git a/src/cmd/go/internal/test/test.go b/src/cmd/go/internal/test/test.go index 7f7ce63eda8..bf684809e3a 100644 --- a/src/cmd/go/internal/test/test.go +++ b/src/cmd/go/internal/test/test.go @@ -659,6 +659,15 @@ func runTest(cmd *base.Command, args []string) { haveMatch = true } } + + // Silently ignore attempts to run coverage on + // sync/atomic when using atomic coverage mode. + // Atomic coverage mode uses sync/atomic, so + // we can't also do coverage on it. + if testCoverMode == "atomic" && p.Standard && p.ImportPath == "sync/atomic" { + continue + } + if haveMatch { testCoverPkgs = append(testCoverPkgs, p) }