aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Gerrand <adg@golang.org>2013-07-22 18:34:36 +1000
committerAndrew Gerrand <adg@golang.org>2013-07-22 18:34:36 +1000
commite33810b29189e2a470e7003b0a519b624eedb651 (patch)
treef94311dee022dab9b08bbc3df9df90ae390ba0c2
parent6baa8dba68f7611b62c4e4c3813518c0584b3fab (diff)
downloadgo-e33810b29189e2a470e7003b0a519b624eedb651.tar.gz
go-e33810b29189e2a470e7003b0a519b624eedb651.zip
[release-branch.go1.1] cmd/gc: fix missing export data for inlining in a few other cases.
««« CL 10464043 / c224c549a3c7 cmd/gc: fix missing export data for inlining in a few other cases. Exported inlined functions that perform a string conversion using a non-exported named type may miss it in export data. Fixes #5755. R=rsc, golang-dev, ality, r CC=golang-dev https://golang.org/cl/10464043 »»» Update #5928 R=golang-dev, dave CC=golang-dev https://golang.org/cl/11629044
-rw-r--r--src/cmd/gc/export.c5
-rw-r--r--test/fixedbugs/issue5755.dir/a.go60
-rw-r--r--test/fixedbugs/issue5755.dir/main.go23
-rw-r--r--test/fixedbugs/issue5755.go10
4 files changed, 98 insertions, 0 deletions
diff --git a/src/cmd/gc/export.c b/src/cmd/gc/export.c
index 4a9b8c8ba3..caac330d52 100644
--- a/src/cmd/gc/export.c
+++ b/src/cmd/gc/export.c
@@ -161,6 +161,11 @@ reexportdep(Node *n)
case OCONV:
case OCONVIFACE:
case OCONVNOP:
+ case ORUNESTR:
+ case OARRAYBYTESTR:
+ case OARRAYRUNESTR:
+ case OSTRARRAYBYTE:
+ case OSTRARRAYRUNE:
case ODOTTYPE:
case ODOTTYPE2:
case OSTRUCTLIT:
diff --git a/test/fixedbugs/issue5755.dir/a.go b/test/fixedbugs/issue5755.dir/a.go
new file mode 100644
index 0000000000..aa398e82b2
--- /dev/null
+++ b/test/fixedbugs/issue5755.dir/a.go
@@ -0,0 +1,60 @@
+// Copyright 2013 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 I interface {
+ F()
+}
+
+type foo1 []byte
+type foo2 []rune
+type foo3 []uint8
+type foo4 []int32
+type foo5 string
+type foo6 string
+type foo7 string
+type foo8 string
+type foo9 string
+
+func (f foo1) F() { return }
+func (f foo2) F() { return }
+func (f foo3) F() { return }
+func (f foo4) F() { return }
+func (f foo5) F() { return }
+func (f foo6) F() { return }
+func (f foo7) F() { return }
+func (f foo8) F() { return }
+func (f foo9) F() { return }
+
+func Test1(s string) I { return foo1(s) }
+func Test2(s string) I { return foo2(s) }
+func Test3(s string) I { return foo3(s) }
+func Test4(s string) I { return foo4(s) }
+func Test5(s []byte) I { return foo5(s) }
+func Test6(s []rune) I { return foo6(s) }
+func Test7(s []uint8) I { return foo7(s) }
+func Test8(s []int32) I { return foo8(s) }
+func Test9(s int) I { return foo9(s) }
+
+type bar map[int]int
+
+func (b bar) F() { return }
+
+func TestBar() I { return bar{1: 2} }
+
+type baz int
+
+func IsBaz(x interface{}) bool { _, ok := x.(baz); return ok }
+
+type baz2 int
+
+func IsBaz2(x interface{}) bool {
+ switch x.(type) {
+ case baz2:
+ return true
+ default:
+ return false
+ }
+}
diff --git a/test/fixedbugs/issue5755.dir/main.go b/test/fixedbugs/issue5755.dir/main.go
new file mode 100644
index 0000000000..6d515f26a6
--- /dev/null
+++ b/test/fixedbugs/issue5755.dir/main.go
@@ -0,0 +1,23 @@
+// Copyright 2013 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 "./a"
+
+func main() {
+ a.Test1("frumious")
+ a.Test2("frumious")
+ a.Test3("frumious")
+ a.Test4("frumious")
+
+ a.Test5(nil)
+ a.Test6(nil)
+ a.Test7(nil)
+ a.Test8(nil)
+ a.Test9(0)
+
+ a.TestBar()
+ a.IsBaz(nil)
+}
diff --git a/test/fixedbugs/issue5755.go b/test/fixedbugs/issue5755.go
new file mode 100644
index 0000000000..fa7ea4d204
--- /dev/null
+++ b/test/fixedbugs/issue5755.go
@@ -0,0 +1,10 @@
+// compiledir
+
+// Copyright 2013 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.
+
+// Issue 5755: exported data for inlining may miss
+// named types when used in string conversions.
+
+package ignored