cmd/gc: fix export of inlined function body with type guard

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
This commit is contained in:
Russ Cox 2012-11-08 16:07:05 -05:00
parent 5451708d5b
commit 761830f481
5 changed files with 59 additions and 0 deletions

View file

@ -152,6 +152,7 @@ reexportdep(Node *n)
case OCONVIFACE:
case OCONVNOP:
case ODOTTYPE:
case ODOTTYPE2:
case OSTRUCTLIT:
case OPTRLIT:
t = n->type;

View file

@ -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)
}

View file

@ -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)
}

View file

@ -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())
}

View file

@ -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