]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: allow inlining of functions with switch statements
authorTodd Neal <todd@tneal.org>
Thu, 17 Mar 2016 02:29:17 +0000 (21:29 -0500)
committerTodd Neal <todd@tneal.org>
Mon, 21 Mar 2016 23:05:10 +0000 (23:05 +0000)
Allow inlining of functions with switch statements as long as they don't
contain a break or type switch.

Fixes #13071

Change-Id: I057be351ea4584def1a744ee87eafa5df47a7f6d
Reviewed-on: https://go-review.googlesource.com/20824
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/cmd/compile/internal/gc/fmt.go
src/cmd/compile/internal/gc/inl.go
test/inline.go

index 1bd08e8278c3647f1cdc540391dd35665c5333a5..72ed6ab442a0fab9da0df7126692bc69e2c1db1d 100644 (file)
@@ -888,7 +888,7 @@ func stmtfmt(n *Node) string {
                        f += fmt.Sprintf(" %v;", n.Ninit.First())
                }
                if n.Left != nil {
-                       f += Nconv(n.Left, 0)
+                       f += fmt.Sprintf(" %s ", Nconv(n.Left, 0))
                }
 
                f += fmt.Sprintf(" { %v }", n.List)
index 77e45898a4df16361f31edcdf9b84d2f764743e5..890eeade5faab9757b40950cf3bfe43128a85185 100644 (file)
@@ -214,10 +214,11 @@ func ishairy(n *Node, budget *int) bool {
                ORANGE,
                OFOR,
                OSELECT,
-               OSWITCH,
+               OTYPESW,
                OPROC,
                ODEFER,
                ODCLTYPE, // can't print yet
+               OBREAK,
                ORETJMP:
                return true
        }
index 8984d059d8439ce20ea72d7b0aa38b4c49e7a59a..e246c52e6d5a7e6be883adacf8fc3ff45f3bb82d 100644 (file)
@@ -36,3 +36,39 @@ func i(x int) int { // ERROR "can inline i"
        const y = 2
        return x + y
 }
+
+func j(x int) int { // ERROR "can inline j"
+       switch {
+       case x > 0:
+               return x + 2
+       default:
+               return x + 1
+       }
+}
+
+// can't currently inline functions with a break statement
+func switchBreak(x, y int) int {
+       var n int
+       switch x {
+       case 0:
+               n = 1
+       Done:
+               switch y {
+               case 0:
+                       n += 10
+                       break Done
+               }
+               n = 2
+       }
+       return n
+}
+
+// can't currently inline functions with a type switch
+func switchType(x interface{}) int { // ERROR "switchType x does not escape"
+       switch x.(type) {
+       case int:
+               return x.(int)
+       default:
+               return 0
+       }
+}