Commit 679fd5b4 authored by Ian Lance Taylor's avatar Ian Lance Taylor

cmd/go: do not permit importing a main package

Fixes #4210.

Change-Id: Id981814a6e55a57403ce7a8ac45ab3ba081a3a86
Reviewed-on: https://go-review.googlesource.com/10925Reviewed-by: default avatarRuss Cox <rsc@golang.org>
parent 8668ac08
......@@ -1830,3 +1830,21 @@ func TestGoGetRscIoToolstash(t *testing.T) {
tg.cd(tg.path("src/rsc.io"))
tg.run("get", "./toolstash")
}
// Test that you can not import a main package.
func TestIssue4210(t *testing.T) {
tg := testgo(t)
defer tg.cleanup()
tg.tempFile("src/x/main.go", `package main
var X int
func main() {}`)
tg.tempFile("src/y/main.go", `package main
import "fmt"
import xmain "x"
func main() {
fmt.Println(xmain.X)
}`)
tg.setenv("GOPATH", tg.path("."))
tg.runFail("build", "y")
tg.grepBoth("is a program", `did not find expected error message ("is a program")`)
}
......@@ -631,6 +631,16 @@ func (p *Package) load(stk *importStack, bp *build.Package, err error) *Package
continue
}
p1 := loadImport(path, p.Dir, stk, p.build.ImportPos[path])
if p1.Name == "main" {
p.Error = &PackageError{
ImportStack: stk.copy(),
Err: fmt.Sprintf("import %q is a program, not an importable package", path),
}
pos := p.build.ImportPos[path]
if len(pos) > 0 {
p.Error.Pos = pos[0].String()
}
}
if p1.local {
if !p.local && p.Error == nil {
p.Error = &PackageError{
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment