]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/gc: fix export of inlined function body with type guard
authorRuss Cox <rsc@golang.org>
Thu, 8 Nov 2012 21:07:05 +0000 (16:07 -0500)
committerRuss Cox <rsc@golang.org>
Thu, 8 Nov 2012 21:07:05 +0000 (16:07 -0500)
When exporting a body containing
        x, ok := v.(Type)

the definition for Type was not being included, so when the body
was actually used, it would cause an "unknown type" compiler error.

Fixes #4370.

R=ken2
CC=golang-dev
https://golang.org/cl/6827064

src/cmd/gc/export.c
test/fixedbugs/issue4370.dir/p1.go [new file with mode: 0644]
test/fixedbugs/issue4370.dir/p2.go [new file with mode: 0644]
test/fixedbugs/issue4370.dir/p3.go [new file with mode: 0644]
test/fixedbugs/issue4370.go [new file with mode: 0644]

index 50303afd80fbbef89b0ac0ba952410df6d8139eb..ad0dc740d61c59fd556eef437c98fe90af2fa0e9 100644 (file)
@@ -152,6 +152,7 @@ reexportdep(Node *n)
        case OCONVIFACE:
        case OCONVNOP:
        case ODOTTYPE:
+       case ODOTTYPE2:
        case OSTRUCTLIT:
        case OPTRLIT:
                t = n->type;
diff --git a/test/fixedbugs/issue4370.dir/p1.go b/test/fixedbugs/issue4370.dir/p1.go
new file mode 100644 (file)
index 0000000..d732c8b
--- /dev/null
@@ -0,0 +1,20 @@
+// Copyright 2012 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 p1
+
+type Magic int
+
+type T struct {
+       x interface{}
+}
+
+func (t *T) M() bool {
+       _, ok := t.x.(Magic)
+       return ok
+}
+
+func F(t *T) {
+       println(t)
+}
diff --git a/test/fixedbugs/issue4370.dir/p2.go b/test/fixedbugs/issue4370.dir/p2.go
new file mode 100644 (file)
index 0000000..33370d0
--- /dev/null
@@ -0,0 +1,16 @@
+// Copyright 2012 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 p2
+
+import "./p1"
+
+type T struct {
+       p1.T
+}
+
+func F() {
+       var t T
+       p1.F(&t.T)
+}
diff --git a/test/fixedbugs/issue4370.dir/p3.go b/test/fixedbugs/issue4370.dir/p3.go
new file mode 100644 (file)
index 0000000..13c996b
--- /dev/null
@@ -0,0 +1,13 @@
+// Copyright 2012 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 p3
+
+import "./p2"
+
+func F() {
+       p2.F()
+       var t p2.T
+       println(t.T.M())
+}
diff --git a/test/fixedbugs/issue4370.go b/test/fixedbugs/issue4370.go
new file mode 100644 (file)
index 0000000..76b47e1
--- /dev/null
@@ -0,0 +1,9 @@
+// compiledir
+
+// Copyright 2012 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.
+
+// Re-exporting inlined function bodies missed types in x, ok := v.(Type)
+
+package ignored