CL 37499 allows inlining more functions by ignoring dead code.
However, that dead code can contain non-exportable constructs.
Teach the exporter not to export dead code.
Fixes #19679
Change-Id: Idb1d3794053514544b6f1035d29262aa6683e1e7
Reviewed-on: https://go-review.googlesource.com/38601
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
p.pos(n)
p.stmtList(n.Ninit)
p.expr(n.Left)
- p.stmtList(n.Nbody)
- p.stmtList(n.Rlist)
+ nbody := n.Nbody
+ rlist := n.Rlist
+ if Isconst(n.Left, CTBOOL) {
+ // if false { ... } or if true { ... }
+ // Only export the taken branch.
+ // This is more efficient,
+ // and avoids trying to export
+ // un-exportable nodes.
+ if n.Left.Bool() {
+ rlist = Nodes{}
+ } else {
+ nbody = Nodes{}
+ }
+ }
+ p.stmtList(nbody)
+ p.stmtList(rlist)
case OFOR:
p.op(OFOR)
--- /dev/null
+// compile
+
+// 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.
+
+// Used to crash when a type switch was present in dead code
+// in an inlineable function.
+
+package p
+
+func Then() {
+ var i interface{}
+ if false {
+ switch i.(type) {
+ }
+ }
+}
+
+func Else() {
+ var i interface{}
+ if true {
+ _ = i
+ } else {
+ switch i.(type) {
+ }
+ }
+}
+
+func Switch() {
+ var i interface{}
+ switch 5 {
+ case 3:
+ switch i.(type) {
+ }
+ case 5:
+ }
+}