Commit 1f446432 authored by Robert Griesemer's avatar Robert Griesemer

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/24312Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
Run-TryBot: Robert Griesemer <gri@golang.org>
parent 845992ee
......@@ -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) {
......
package a
type X string
func NewX() X {
return ""
}
package a
type X string
func NewX() X {
return ""
}
package b
import "./a2"
type T struct {
X a.X
}
package p
import (
"./a1"
"./b"
)
var _ = b.T{
X: a.NewX(), // ERROR `cannot use "a1"\.NewX\(\)`
}
// 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
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