cmd/compile: fix error msg mentioning different packages with same name

This is a regression from 1.6. The respective code in importimport
(export.go) was not exactly replicated with the new importer. Also
copied over the missing cyclic import check.

Added test cases.

Fixes #16133.

Change-Id: I1e0a39ff1275ca62a8054874294d400ed83fb26a
Reviewed-on: https://go-review.googlesource.com/24312
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Robert Griesemer <gri@golang.org>
This commit is contained in:
Robert Griesemer 2016-06-21 14:27:40 -07:00
parent 845992eeed
commit 1f446432dd
7 changed files with 52 additions and 1 deletions

View file

@ -239,14 +239,20 @@ func (p *importer) pkg() *Pkg {
Fatalf("importer: package path %q for pkg index %d", path, len(p.pkgList))
}
// see importimport (export.go)
pkg := importpkg
if path != "" {
pkg = mkpkg(path)
}
if pkg.Name == "" {
pkg.Name = name
numImport[name]++
} else if pkg.Name != name {
Fatalf("importer: conflicting package names %s and %s for path %q", pkg.Name, name, path)
Yyerror("importer: conflicting package names %s and %s for path %q", pkg.Name, name, path)
}
if incannedimport == 0 && myimportpath != "" && path == myimportpath {
Yyerror("import %q: package depends on %q (import cycle)", importpkg.Path, path)
errorexit()
}
p.pkgList = append(p.pkgList, pkg)

View file

@ -479,6 +479,10 @@ func pkgtype(s *Sym) *Type {
return s.Def.Type
}
// numImport tracks how often a package with a given name is imported.
// It is used to provide a better error message (by using the package
// path to disambiguate) if a package that appears multiple times with
// the same name appears in an error message.
var numImport = make(map[string]int)
func importimport(s *Sym, path string) {

View file

@ -0,0 +1,7 @@
package a
type X string
func NewX() X {
return ""
}

View file

@ -0,0 +1,7 @@
package a
type X string
func NewX() X {
return ""
}

View file

@ -0,0 +1,7 @@
package b
import "./a2"
type T struct {
X a.X
}

View file

@ -0,0 +1,10 @@
package p
import (
"./a1"
"./b"
)
var _ = b.T{
X: a.NewX(), // ERROR `cannot use "a1"\.NewX\(\)`
}

View file

@ -0,0 +1,10 @@
// errorcheckdir -s
// Copyright 2016 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Verify error messages referring to multiple different
// packages with the same package name.
package ignored