]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: don't export dead code in inlineable fuctions
authorJosh Bleecher Snyder <josharian@gmail.com>
Fri, 24 Mar 2017 16:52:39 +0000 (09:52 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Fri, 24 Mar 2017 17:21:05 +0000 (17:21 +0000)
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>
src/cmd/compile/internal/gc/bexport.go
test/fixedbugs/issue19679.go [new file with mode: 0644]

index bed200b57821962a92abe8ffa8d6efe3c5c83068..d60b959e370f9356128fb5867b6560832194a7f7 100644 (file)
@@ -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)
diff --git a/test/fixedbugs/issue19679.go b/test/fixedbugs/issue19679.go
new file mode 100644 (file)
index 0000000..636b27f
--- /dev/null
@@ -0,0 +1,38 @@
+// 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:
+       }
+}