Commit 6394eb37 authored by Robert Griesemer's avatar Robert Griesemer

cmd/compile: export package for _ (blank) struct fields

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/27639Reviewed-by: 's avatarMatthew Dempsky <mdempsky@google.com>
parent a8eb6d51
......@@ -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)
}
}
......
......@@ -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 = ""
}
......
......@@ -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()
}
......
// 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 }
// 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 }
// 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"
// 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
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