]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/cover: add newline to fix -covermode=atomic build error
authorThan McIntosh <thanm@google.com>
Tue, 7 Feb 2023 16:11:45 +0000 (11:11 -0500)
committerThan McIntosh <thanm@google.com>
Wed, 8 Feb 2023 18:28:28 +0000 (18:28 +0000)
Fix a minor buglet in atomic mode fixup that would generate
non-compilable code for a package containing only the "package X"
clause with no trailing newline following the "X".

Fixes #58370.

Change-Id: I0d9bc4f2b687c6bd913595418f6db7dbe50cc5df
Reviewed-on: https://go-review.googlesource.com/c/go/+/466115
Reviewed-by: David Chase <drchase@google.com>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Than McIntosh <thanm@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>

src/cmd/cover/cover.go
src/cmd/cover/cover_test.go

index 74bb500cb9d3296b99cfdfbdf1feaafc521e1062..49d3f580bcf2932a62dc81899e1835b2bf9bb3dc 100644 (file)
@@ -656,7 +656,7 @@ func (p *Package) annotateFile(name string, fd io.Writer, last bool) {
        // Emit a reference to the atomic package to avoid
        // import and not used error when there's no code in a file.
        if *mode == "atomic" {
-               fmt.Fprintf(fd, "var _ = %sLoadUint32\n", atomicPackagePrefix())
+               fmt.Fprintf(fd, "\nvar _ = %sLoadUint32\n", atomicPackagePrefix())
        }
 
        // Last file? Emit meta-data and converage config.
index af266b5e8365fa2d3ac2733f5bded67985f8d6d4..1292bbbf1fa5fd0459a8bd76342e263bcf403e24 100644 (file)
@@ -126,6 +126,9 @@ func TestCoverWithToolExec(t *testing.T) {
        t.Run("FuncWithDuplicateLines", func(t *testing.T) {
                testFuncWithDuplicateLines(t, toolexecArg)
        })
+       t.Run("MissingTrailingNewlineIssue58370", func(t *testing.T) {
+               testMissingTrailingNewlineIssue58370(t, toolexecArg)
+       })
 }
 
 // Execute this command sequence:
@@ -574,3 +577,42 @@ func runExpectingError(c *exec.Cmd, t *testing.T) string {
        }
        return string(out)
 }
+
+// Test instrumentation of package that ends before an expected
+// trailing newline following package clause. Issue #58370.
+func testMissingTrailingNewlineIssue58370(t *testing.T, toolexecArg string) {
+       testenv.MustHaveGoBuild(t)
+       dir := tempDir(t)
+
+       t.Parallel()
+
+       noeolDir := filepath.Join(dir, "issue58370")
+       noeolGo := filepath.Join(noeolDir, "noeol.go")
+       noeolTestGo := filepath.Join(noeolDir, "noeol_test.go")
+
+       if err := os.Mkdir(noeolDir, 0777); err != nil {
+               t.Fatal(err)
+       }
+
+       if err := os.WriteFile(filepath.Join(noeolDir, "go.mod"), []byte("module noeol\n"), 0666); err != nil {
+               t.Fatal(err)
+       }
+       const noeolContents = `package noeol`
+       if err := os.WriteFile(noeolGo, []byte(noeolContents), 0444); err != nil {
+               t.Fatal(err)
+       }
+       const noeolTestContents = `
+package noeol
+import "testing"
+func TestCoverage(t *testing.T) { }
+`
+       if err := os.WriteFile(noeolTestGo, []byte(noeolTestContents), 0444); err != nil {
+               t.Fatal(err)
+       }
+
+       // go test -covermode atomic
+       cmd := testenv.Command(t, testenv.GoToolPath(t), "test", toolexecArg, "-covermode", "atomic")
+       cmd.Env = append(cmd.Environ(), "CMDCOVER_TOOLEXEC=true")
+       cmd.Dir = noeolDir
+       run(cmd, t)
+}