Skip to content

Commit

Permalink
cmd/go: fix link error for -coverpkg in GOPATH mode
Browse files Browse the repository at this point in the history
If a generated test main package transitively depends on a main
package, the main package will now always be rebuilt as a library and
will not be compiled with '-p main'.

This expands the fix for #30907, which only applied to packages with
the BuildInfo set (main packages built in module mode). Linking
multiple packages with BuildInfo caused link errors, but it appears
these errors apply to some symbols in GOPATH mode.

Fixes #34114

Change-Id: Ic1e53437942269a950dd7e45d163707922c92edd
Reviewed-on: https://go-review.googlesource.com/c/go/+/195279
Run-TryBot: Jay Conrod <jayconrod@google.com>
Reviewed-by: Bryan C. Mills <bcmills@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
  • Loading branch information
Jay Conrod committed Sep 13, 2019
1 parent 79877e5 commit 24781a1
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 13 deletions.
11 changes: 7 additions & 4 deletions src/cmd/go/internal/load/test.go
Original file line number Diff line number Diff line change
Expand Up @@ -399,10 +399,13 @@ func recompileForTest(pmain, preal, ptest, pxtest *Package) {
}
}

// Don't compile build info from a main package. This can happen
// if -coverpkg patterns include main packages, since those packages
// are imported by pmain. See golang.org/issue/30907.
if p.Internal.BuildInfo != "" && p != pmain {
// Force main packages the test imports to be built as libraries.
// Normal imports of main packages are forbidden by the package loader,
// but this can still happen if -coverpkg patterns include main packages:
// covered packages are imported by pmain. Linking multiple packages
// compiled with '-p main' causes duplicate symbol errors.
// See golang.org/issue/30907, golang.org/issue/34114.
if p.Name == "main" && p != pmain {
split()
}
}
Expand Down
21 changes: 12 additions & 9 deletions src/cmd/go/testdata/script/cover_pkgall_multiple_mains.txt
Original file line number Diff line number Diff line change
@@ -1,29 +1,32 @@
# This test checks that multiple main packages can be tested
# with -coverpkg=all without duplicate symbol errors.
# Verifies golang.org/issue/30374.

env GO111MODULE=on
# Verifies golang.org/issue/30374, golang.org/issue/34114.

[short] skip
cd $GOPATH/src/example.com/cov

env GO111MODULE=on
go test -coverpkg=all ./...

env GO111MODULE=off
go test -coverpkg=all ./...

-- go.mod --
-- $GOPATH/src/example.com/cov/go.mod --
module example.com/cov

-- mainonly/mainonly.go --
-- $GOPATH/src/example.com/cov/mainonly/mainonly.go --
package main

func main() {}

-- mainwithtest/mainwithtest.go --
-- $GOPATH/src/example.com/cov/mainwithtest/mainwithtest.go --
package main

func main() {}

func Foo() {}

-- mainwithtest/mainwithtest_test.go --
-- $GOPATH/src/example.com/cov/mainwithtest/mainwithtest_test.go --
package main

import "testing"
Expand All @@ -32,10 +35,10 @@ func TestFoo(t *testing.T) {
Foo()
}

-- xtest/x.go --
-- $GOPATH/src/example.com/cov/xtest/x.go --
package x

-- xtest/x_test.go --
-- $GOPATH/src/example.com/cov/xtest/x_test.go --
package x_test

import "testing"
Expand Down

0 comments on commit 24781a1

Please sign in to comment.