aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2017-07-21 16:37:40 -0700
committerIan Lance Taylor <iant@golang.org>2017-07-24 18:05:00 +0000
commitee392ac10c7bed0ef1984dbb421491ca7b18e190 (patch)
tree811aa2ddb54f2ce59fed4b9b4b3344e9a38cf4e0
parent6bb88fc280518150e31bf12744596467796a4528 (diff)
downloadgo-ee392ac10c7bed0ef1984dbb421491ca7b18e190.tar.gz
go-ee392ac10c7bed0ef1984dbb421491ca7b18e190.zip
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>
-rw-r--r--src/cmd/compile/internal/gc/reflect.go6
-rw-r--r--test/fixedbugs/issue21120.dir/a.go13
-rw-r--r--test/fixedbugs/issue21120.dir/b.go29
-rw-r--r--test/fixedbugs/issue21120.dir/main.go25
-rw-r--r--test/fixedbugs/issue21120.go11
5 files changed, 83 insertions, 1 deletions
diff --git a/src/cmd/compile/internal/gc/reflect.go b/src/cmd/compile/internal/gc/reflect.go
index decd3beda7..91e6f46804 100644
--- a/src/cmd/compile/internal/gc/reflect.go
+++ b/src/cmd/compile/internal/gc/reflect.go
@@ -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)
diff --git a/test/fixedbugs/issue21120.dir/a.go b/test/fixedbugs/issue21120.dir/a.go
new file mode 100644
index 0000000000..f2ee252671
--- /dev/null
+++ b/test/fixedbugs/issue21120.dir/a.go
@@ -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}
+}
diff --git a/test/fixedbugs/issue21120.dir/b.go b/test/fixedbugs/issue21120.dir/b.go
new file mode 100644
index 0000000000..b00bd53a5d
--- /dev/null
+++ b/test/fixedbugs/issue21120.dir/b.go
@@ -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
+}
diff --git a/test/fixedbugs/issue21120.dir/main.go b/test/fixedbugs/issue21120.dir/main.go
new file mode 100644
index 0000000000..1f1ec30e56
--- /dev/null
+++ b/test/fixedbugs/issue21120.dir/main.go
@@ -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)
+ }
+}
diff --git a/test/fixedbugs/issue21120.go b/test/fixedbugs/issue21120.go
new file mode 100644
index 0000000000..ea896ce8e1
--- /dev/null
+++ b/test/fixedbugs/issue21120.go
@@ -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