]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/gc: fix missing export data for inlining in a few other cases.
authorRémy Oudompheng <oudomphe@phare.normalesup.org>
Fri, 28 Jun 2013 21:29:13 +0000 (23:29 +0200)
committerRémy Oudompheng <oudomphe@phare.normalesup.org>
Fri, 28 Jun 2013 21:29:13 +0000 (23:29 +0200)
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

src/cmd/gc/export.c
test/fixedbugs/issue5755.dir/a.go [new file with mode: 0644]
test/fixedbugs/issue5755.dir/main.go [new file with mode: 0644]
test/fixedbugs/issue5755.go [new file with mode: 0644]

index 4a9b8c8ba31c6e70e0a39d4f02702315f5b2a90c..caac330d52dcca0ba3e90e680e9c6c9bd6a87b2a 100644 (file)
@@ -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 (file)
index 0000000..aa398e8
--- /dev/null
@@ -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 (file)
index 0000000..6d515f2
--- /dev/null
@@ -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 (file)
index 0000000..fa7ea4d
--- /dev/null
@@ -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