]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: fix error msg mentioning different packages with same name
authorRobert Griesemer <gri@golang.org>
Tue, 21 Jun 2016 21:27:40 +0000 (14:27 -0700)
committerRobert Griesemer <gri@golang.org>
Wed, 22 Jun 2016 00:12:55 +0000 (00:12 +0000)
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>

src/cmd/compile/internal/gc/bimport.go
src/cmd/compile/internal/gc/export.go
test/fixedbugs/issue16133.dir/a1.go [new file with mode: 0644]
test/fixedbugs/issue16133.dir/a2.go [new file with mode: 0644]
test/fixedbugs/issue16133.dir/b.go [new file with mode: 0644]
test/fixedbugs/issue16133.dir/c.go [new file with mode: 0644]
test/fixedbugs/issue16133.go [new file with mode: 0644]

index 36aa0e8b9ceaf36a5a18bd7c9316d93b47589629..5a4d9a3c55a2fe6789da6cf9730f14704ecc8f90 100644 (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)
 
index 1148b27f025f1792bfeab6172beb8e7574a4f2a5..911ef0f327a365293a247922bce88ff2947c1748 100644 (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) {
diff --git a/test/fixedbugs/issue16133.dir/a1.go b/test/fixedbugs/issue16133.dir/a1.go
new file mode 100644 (file)
index 0000000..497cccf
--- /dev/null
@@ -0,0 +1,7 @@
+package a
+
+type X string
+
+func NewX() X {
+       return ""
+}
diff --git a/test/fixedbugs/issue16133.dir/a2.go b/test/fixedbugs/issue16133.dir/a2.go
new file mode 100644 (file)
index 0000000..497cccf
--- /dev/null
@@ -0,0 +1,7 @@
+package a
+
+type X string
+
+func NewX() X {
+       return ""
+}
diff --git a/test/fixedbugs/issue16133.dir/b.go b/test/fixedbugs/issue16133.dir/b.go
new file mode 100644 (file)
index 0000000..be1bebf
--- /dev/null
@@ -0,0 +1,7 @@
+package b
+
+import "./a2"
+
+type T struct {
+       X a.X
+}
diff --git a/test/fixedbugs/issue16133.dir/c.go b/test/fixedbugs/issue16133.dir/c.go
new file mode 100644 (file)
index 0000000..b25fe5a
--- /dev/null
@@ -0,0 +1,10 @@
+package p
+
+import (
+       "./a1"
+       "./b"
+)
+
+var _ = b.T{
+       X: a.NewX(), // ERROR `cannot use "a1"\.NewX\(\)`
+}
diff --git a/test/fixedbugs/issue16133.go b/test/fixedbugs/issue16133.go
new file mode 100644 (file)
index 0000000..4afffc5
--- /dev/null
@@ -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