mirror of
https://github.com/golang/go
synced 2024-10-06 08:00:07 +00:00
cmd/compile: consider exported flag in namedata
It is possible to have an unexported name with a nil package, for an embedded field whose type is a pointer to an unexported type. We must encode that fact in the type..namedata symbol name, to avoid incorrectly merging an unexported name with an exported name. Fixes #21120 Change-Id: I2e3879d77fa15c05ad92e0bf8e55f74082db5111 Reviewed-on: https://go-review.googlesource.com/50710 Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: David Crawshaw <crawshaw@golang.org>
This commit is contained in:
parent
6bb88fc280
commit
ee392ac10c
|
@ -582,7 +582,11 @@ func dname(name, tag string, pkg *types.Pkg, exported bool) *obj.LSym {
|
|||
sname += "-noname-unexported." + tag
|
||||
}
|
||||
} else {
|
||||
sname += name + "." + tag
|
||||
if exported {
|
||||
sname += name + "." + tag
|
||||
} else {
|
||||
sname += name + "-" + tag
|
||||
}
|
||||
}
|
||||
} else {
|
||||
sname = fmt.Sprintf(`%s"".%d`, sname, dnameCount)
|
||||
|
|
13
test/fixedbugs/issue21120.dir/a.go
Normal file
13
test/fixedbugs/issue21120.dir/a.go
Normal file
|
@ -0,0 +1,13 @@
|
|||
// Copyright 2017 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 S struct {
|
||||
x int
|
||||
}
|
||||
|
||||
func V() interface{} {
|
||||
return S{0}
|
||||
}
|
29
test/fixedbugs/issue21120.dir/b.go
Normal file
29
test/fixedbugs/issue21120.dir/b.go
Normal file
|
@ -0,0 +1,29 @@
|
|||
// Copyright 2017 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
|
||||
|
||||
import "reflect"
|
||||
|
||||
type X int
|
||||
|
||||
func F1() string {
|
||||
type x X
|
||||
|
||||
s := struct {
|
||||
*x
|
||||
}{nil}
|
||||
v := reflect.TypeOf(s)
|
||||
return v.Field(0).PkgPath
|
||||
}
|
||||
|
||||
func F2() string {
|
||||
type y X
|
||||
|
||||
s := struct {
|
||||
*y
|
||||
}{nil}
|
||||
v := reflect.TypeOf(s)
|
||||
return v.Field(0).PkgPath
|
||||
}
|
25
test/fixedbugs/issue21120.dir/main.go
Normal file
25
test/fixedbugs/issue21120.dir/main.go
Normal file
|
@ -0,0 +1,25 @@
|
|||
// Copyright 2017 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 main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
"./a"
|
||||
"./b"
|
||||
)
|
||||
|
||||
func main() {
|
||||
// Make sure the reflect information for a.S is in the executable.
|
||||
_ = a.V()
|
||||
|
||||
b1 := b.F1()
|
||||
b2 := b.F2()
|
||||
if b1 != b2 {
|
||||
fmt.Printf("%q (from b.F1()) != %q (from b.F2())\n", b1, b2)
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
11
test/fixedbugs/issue21120.go
Normal file
11
test/fixedbugs/issue21120.go
Normal file
|
@ -0,0 +1,11 @@
|
|||
// rundir
|
||||
|
||||
// Copyright 2017 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.
|
||||
|
||||
// The compiler was using an incomplete symbol name for reflect name data,
|
||||
// permitting an invalid merge in the linker, producing an incorrect
|
||||
// exported flag bit.
|
||||
|
||||
package ignored
|
Loading…
Reference in a new issue