Commit ad8c17b7 authored by Josh Bleecher Snyder's avatar Josh Bleecher Snyder

cmd/compile: don't export dead code in inlineable fuctions

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: 's avatarRobert Griesemer <gri@golang.org>
parent a69754e3
......@@ -1493,8 +1493,22 @@ func (p *exporter) stmt(n *Node) {
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)
......
// 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:
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment