]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: export package for _ (blank) struct fields
authorRobert Griesemer <gri@golang.org>
Tue, 23 Aug 2016 23:02:19 +0000 (16:02 -0700)
committerRobert Griesemer <gri@golang.org>
Tue, 23 Aug 2016 23:40:36 +0000 (23:40 +0000)
Blank struct fields are regular unexported fields. Two
blank fields are different if they are from different
packages. In order to correctly differentiate them, the
compiler needs the package information. Add it to the
export data.

Fixes #15514.

Change-Id: I421aaca22b542fcd0d66b2d2db777249cad78df6
Reviewed-on: https://go-review.googlesource.com/27639
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/compile/internal/gc/bexport.go
src/cmd/compile/internal/gc/bimport.go
src/go/internal/gcimporter/bimport.go
test/fixedbugs/issue15514.dir/a.go [new file with mode: 0644]
test/fixedbugs/issue15514.dir/b.go [new file with mode: 0644]
test/fixedbugs/issue15514.dir/c.go [new file with mode: 0644]
test/fixedbugs/issue15514.go [new file with mode: 0644]

index 9c1ccd87a1640ceaab8450178e77700640863768..a43158d14ba10159ade4ecb17ae06c7e3873ad0c 100644 (file)
@@ -858,11 +858,9 @@ func (p *exporter) method(m *Field) {
        p.paramList(m.Type.Results(), false)
 }
 
-// fieldName is like qualifiedName but it doesn't record the package
-// for blank (_) or exported names.
+// fieldName is like qualifiedName but it doesn't record the package for exported names.
 func (p *exporter) fieldName(t *Field) {
        name := t.Sym.Name
-
        if t.Embedded != 0 {
                name = "" // anonymous field
                if bname := basetypeName(t.Type); bname != "" && !exportname(bname) {
@@ -871,8 +869,7 @@ func (p *exporter) fieldName(t *Field) {
                }
        }
        p.string(name)
-
-       if name != "_" && name != "" && !exportname(name) {
+       if name != "" && !exportname(name) {
                p.pkg(t.Sym.Pkg)
        }
 }
index 0e30031f071ec182f07ab6b15935fa8b18154bef..65c845c93ad1509286efcf5e37b597f96de8451a 100644 (file)
@@ -590,12 +590,7 @@ func (p *importer) method() *Node {
 func (p *importer) fieldName() *Sym {
        name := p.string()
        pkg := localpkg
-       if name == "_" {
-               // During imports, unqualified non-exported identifiers are from builtinpkg
-               // (see parser.go:sym). The binary exporter only exports blank as a non-exported
-               // identifier without qualification.
-               pkg = builtinpkg
-       } else if name != "" && !exportname(name) {
+       if name != "" && !exportname(name) {
                if name == "?" {
                        name = ""
                }
index 87701f99deb44d7227d613d029b016d67be4405b..b657cc79bac1007a18b6d6216132112d1c319782 100644 (file)
@@ -492,19 +492,15 @@ func (p *importer) method(parent *types.Package) *types.Func {
 }
 
 func (p *importer) fieldName(parent *types.Package) (*types.Package, string) {
+       name := p.string()
        pkg := parent
        if pkg == nil {
                // use the imported package instead
                pkg = p.pkgList[0]
        }
-       name := p.string()
-       if name == "" {
-               return pkg, "" // anonymous
-       }
-       if name == "?" || name != "_" && !exported(name) {
-               // explicitly qualified field
+       if name != "" && !exported(name) {
                if name == "?" {
-                       name = "" // anonymous
+                       name = ""
                }
                pkg = p.pkg()
        }
diff --git a/test/fixedbugs/issue15514.dir/a.go b/test/fixedbugs/issue15514.dir/a.go
new file mode 100644 (file)
index 0000000..663303b
--- /dev/null
@@ -0,0 +1,7 @@
+// 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.
+
+package a
+
+type A struct{ _ int32 }
diff --git a/test/fixedbugs/issue15514.dir/b.go b/test/fixedbugs/issue15514.dir/b.go
new file mode 100644 (file)
index 0000000..f0750d3
--- /dev/null
@@ -0,0 +1,7 @@
+// 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.
+
+package b
+
+func B() (_ struct{ _ int32 }) { return }
diff --git a/test/fixedbugs/issue15514.dir/c.go b/test/fixedbugs/issue15514.dir/c.go
new file mode 100644 (file)
index 0000000..11624f9
--- /dev/null
@@ -0,0 +1,10 @@
+// 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.
+
+package c
+
+import "./a"
+import "./b"
+
+var _ a.A = b.B() // ERROR "cannot use b\.B"
diff --git a/test/fixedbugs/issue15514.go b/test/fixedbugs/issue15514.go
new file mode 100644 (file)
index 0000000..626f7ad
--- /dev/null
@@ -0,0 +1,7 @@
+// errorcheckdir
+
+// 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.
+
+package ignored