mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +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
5 changed files with 83 additions and 1 deletions
|
|
@ -582,7 +582,11 @@ func dname(name, tag string, pkg *types.Pkg, exported bool) *obj.LSym {
|
||||||
sname += "-noname-unexported." + tag
|
sname += "-noname-unexported." + tag
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
sname += name + "." + tag
|
if exported {
|
||||||
|
sname += name + "." + tag
|
||||||
|
} else {
|
||||||
|
sname += name + "-" + tag
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
sname = fmt.Sprintf(`%s"".%d`, sname, dnameCount)
|
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…
Add table
Add a link
Reference in a new issue