mirror of
https://github.com/golang/go
synced 2024-09-04 23:44:16 +00:00
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:
parent
845992eeed
commit
1f446432dd
|
@ -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)
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
7
test/fixedbugs/issue16133.dir/a1.go
Normal file
7
test/fixedbugs/issue16133.dir/a1.go
Normal file
|
@ -0,0 +1,7 @@
|
|||
package a
|
||||
|
||||
type X string
|
||||
|
||||
func NewX() X {
|
||||
return ""
|
||||
}
|
7
test/fixedbugs/issue16133.dir/a2.go
Normal file
7
test/fixedbugs/issue16133.dir/a2.go
Normal file
|
@ -0,0 +1,7 @@
|
|||
package a
|
||||
|
||||
type X string
|
||||
|
||||
func NewX() X {
|
||||
return ""
|
||||
}
|
7
test/fixedbugs/issue16133.dir/b.go
Normal file
7
test/fixedbugs/issue16133.dir/b.go
Normal file
|
@ -0,0 +1,7 @@
|
|||
package b
|
||||
|
||||
import "./a2"
|
||||
|
||||
type T struct {
|
||||
X a.X
|
||||
}
|
10
test/fixedbugs/issue16133.dir/c.go
Normal file
10
test/fixedbugs/issue16133.dir/c.go
Normal file
|
@ -0,0 +1,10 @@
|
|||
package p
|
||||
|
||||
import (
|
||||
"./a1"
|
||||
"./b"
|
||||
)
|
||||
|
||||
var _ = b.T{
|
||||
X: a.NewX(), // ERROR `cannot use "a1"\.NewX\(\)`
|
||||
}
|
10
test/fixedbugs/issue16133.go
Normal file
10
test/fixedbugs/issue16133.go
Normal 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
|
Loading…
Reference in a new issue