]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: add support for a go:noinline directive
authorTodd Neal <todd@tneal.org>
Tue, 25 Aug 2015 00:45:59 +0000 (19:45 -0500)
committerTodd Neal <todd@tneal.org>
Thu, 29 Oct 2015 23:16:27 +0000 (23:16 +0000)
Some tests need to disable inlining of a function.  It's currently done
in one of a few ways (adding a function call, an empty switch, or a
defer).  Add support for a less fragile 'go:noinline' directive that
prevents inlining.

Fixes #12312

Change-Id: Ife444e13361b4a927709d81aa41e448f32eec8d4
Reviewed-on: https://go-review.googlesource.com/13911
Run-TryBot: Todd Neal <todd@tneal.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
src/cmd/compile/internal/gc/go.go
src/cmd/compile/internal/gc/go.y
src/cmd/compile/internal/gc/inl.go
src/cmd/compile/internal/gc/lex.go
src/cmd/compile/internal/gc/syntax.go
src/cmd/compile/internal/gc/y.go
test/inline.go

index 12f07494b930dae25250788f739d79b32087fff7..84f11e69d0ecade63014eed99764c15e64d1cb1d 100644 (file)
@@ -657,10 +657,11 @@ var instrumenting bool
 // Pending annotations for next func declaration.
 var (
        noescape       bool
+       noinline       bool
+       norace         bool
        nosplit        bool
        nowritebarrier bool
        systemstack    bool
-       norace         bool
 )
 
 var debuglive int
index 3b2b64302775298a7929a47d9c5e2865978af736..fc3af695683a816f39bf4cbf07d6fd376f1f6b8c 100644 (file)
@@ -1393,6 +1393,7 @@ xfndcl:
                $$.Noescape = noescape;
                $$.Func.Norace = norace;
                $$.Func.Nosplit = nosplit;
+               $$.Func.Noinline = noinline;
                $$.Func.Nowritebarrier = nowritebarrier;
                $$.Func.Systemstack = systemstack;
                funcbody($$);
@@ -1579,8 +1580,9 @@ xdcl_list:
                if nsyntaxerrors == 0 {
                        testdclstack();
                }
-               nointerface = false
                noescape = false
+               noinline = false
+               nointerface = false
                norace = false
                nosplit = false
                nowritebarrier = false
index cb165f48f2dd8a626a61657a5a098c86aea9b9f9..66d5b743073bb0b9134d9b2c306ad602e712a15d 100644 (file)
@@ -106,6 +106,11 @@ func caninl(fn *Node) {
                Fatalf("caninl no nname %v", Nconv(fn, obj.FmtSign))
        }
 
+       // If marked "go:noinline", don't inline
+       if fn.Func.Noinline {
+               return
+       }
+
        // If fn has no body (is defined outside of Go), cannot inline it.
        if fn.Nbody == nil {
                return
index 6ea1482313305afbf9a77a6c49cb400576a492fd..c37befdafb32d1d3c7bc0211aa5354b50a5a4cbd 100644 (file)
@@ -1662,6 +1662,11 @@ func getlinepragma() int {
                        return c
                }
 
+               if verb == "go:noinline" {
+                       noinline = true
+                       return c
+               }
+
                if verb == "go:systemstack" {
                        if compiling_runtime == 0 {
                                Yyerror("//go:systemstack only allowed in runtime")
index c94d727488eda1143f031ff14dc4c045b1a7563a..87480044ff1f9e749bcdfc8efd8d655462d73f94 100644 (file)
@@ -171,6 +171,7 @@ type Func struct {
 
        Norace         bool // func must not have race detector annotations
        Nosplit        bool // func should not execute on separate stack
+       Noinline       bool // func should not be inlined
        Nowritebarrier bool // emit compiler error instead of write barrier
        Dupok          bool // duplicate definitions ok
        Wrapper        bool // is method wrapper
index 5e5b5f4a46dbebd099876da2b8eb0be540c832b1..7e6ae02c7f52bf2f6fd7695d370abb297ee1eb5d 100644 (file)
@@ -154,7 +154,7 @@ const yyEofCode = 1
 const yyErrCode = 2
 const yyMaxDepth = 200
 
-//line go.y:2309
+//line go.y:2311
 func fixlbrace(lbr int) {
        // If the opening brace was an LBODY,
        // set up for another one now that we're done.
@@ -2542,13 +2542,14 @@ yydefault:
                        yyVAL.node.Noescape = noescape
                        yyVAL.node.Func.Norace = norace
                        yyVAL.node.Func.Nosplit = nosplit
+                       yyVAL.node.Func.Noinline = noinline
                        yyVAL.node.Func.Nowritebarrier = nowritebarrier
                        yyVAL.node.Func.Systemstack = systemstack
                        funcbody(yyVAL.node)
                }
        case 205:
                yyDollar = yyS[yypt-5 : yypt+1]
-               //line go.y:1403
+               //line go.y:1404
                {
                        var t *Node
 
@@ -2581,7 +2582,7 @@ yydefault:
                }
        case 206:
                yyDollar = yyS[yypt-8 : yypt+1]
-               //line go.y:1434
+               //line go.y:1435
                {
                        var rcvr, t *Node
 
@@ -2619,7 +2620,7 @@ yydefault:
                }
        case 207:
                yyDollar = yyS[yypt-5 : yypt+1]
-               //line go.y:1472
+               //line go.y:1473
                {
                        var s *Sym
                        var t *Type
@@ -2646,7 +2647,7 @@ yydefault:
                }
        case 208:
                yyDollar = yyS[yypt-8 : yypt+1]
-               //line go.y:1497
+               //line go.y:1498
                {
                        yyVAL.node = methodname1(newname(yyDollar[4].sym), yyDollar[2].list.N.Right)
                        yyVAL.node.Type = functype(yyDollar[2].list.N, yyDollar[6].list, yyDollar[8].list)
@@ -2664,7 +2665,7 @@ yydefault:
                }
        case 209:
                yyDollar = yyS[yypt-5 : yypt+1]
-               //line go.y:1515
+               //line go.y:1516
                {
                        yyDollar[3].list = checkarglist(yyDollar[3].list, 1)
                        yyVAL.node = Nod(OTFUNC, nil, nil)
@@ -2673,13 +2674,13 @@ yydefault:
                }
        case 210:
                yyDollar = yyS[yypt-0 : yypt+1]
-               //line go.y:1523
+               //line go.y:1524
                {
                        yyVAL.list = nil
                }
        case 211:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1527
+               //line go.y:1528
                {
                        yyVAL.list = yyDollar[2].list
                        if yyVAL.list == nil {
@@ -2688,58 +2689,59 @@ yydefault:
                }
        case 212:
                yyDollar = yyS[yypt-0 : yypt+1]
-               //line go.y:1536
+               //line go.y:1537
                {
                        yyVAL.list = nil
                }
        case 213:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1540
+               //line go.y:1541
                {
                        yyVAL.list = list1(Nod(ODCLFIELD, nil, yyDollar[1].node))
                }
        case 214:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1544
+               //line go.y:1545
                {
                        yyDollar[2].list = checkarglist(yyDollar[2].list, 0)
                        yyVAL.list = yyDollar[2].list
                }
        case 215:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1551
+               //line go.y:1552
                {
                        closurehdr(yyDollar[1].node)
                }
        case 216:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:1557
+               //line go.y:1558
                {
                        yyVAL.node = closurebody(yyDollar[3].list)
                        fixlbrace(yyDollar[2].i)
                }
        case 217:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:1562
+               //line go.y:1563
                {
                        yyVAL.node = closurebody(nil)
                }
        case 218:
                yyDollar = yyS[yypt-0 : yypt+1]
-               //line go.y:1573
+               //line go.y:1574
                {
                        yyVAL.list = nil
                }
        case 219:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1577
+               //line go.y:1578
                {
                        yyVAL.list = concat(yyDollar[1].list, yyDollar[2].list)
                        if nsyntaxerrors == 0 {
                                testdclstack()
                        }
-                       nointerface = false
                        noescape = false
+                       noinline = false
+                       nointerface = false
                        norace = false
                        nosplit = false
                        nowritebarrier = false
@@ -2747,49 +2749,49 @@ yydefault:
                }
        case 221:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1593
+               //line go.y:1595
                {
                        yyVAL.list = concat(yyDollar[1].list, yyDollar[3].list)
                }
        case 223:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1600
+               //line go.y:1602
                {
                        yyVAL.list = concat(yyDollar[1].list, yyDollar[3].list)
                }
        case 224:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1606
+               //line go.y:1608
                {
                        yyVAL.list = list1(yyDollar[1].node)
                }
        case 225:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1610
+               //line go.y:1612
                {
                        yyVAL.list = list(yyDollar[1].list, yyDollar[3].node)
                }
        case 227:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1617
+               //line go.y:1619
                {
                        yyVAL.list = concat(yyDollar[1].list, yyDollar[3].list)
                }
        case 228:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1623
+               //line go.y:1625
                {
                        yyVAL.list = list1(yyDollar[1].node)
                }
        case 229:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1627
+               //line go.y:1629
                {
                        yyVAL.list = list(yyDollar[1].list, yyDollar[3].node)
                }
        case 230:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1633
+               //line go.y:1635
                {
                        var l *NodeList
 
@@ -2815,14 +2817,14 @@ yydefault:
                }
        case 231:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:1657
+               //line go.y:1659
                {
                        yyDollar[1].node.SetVal(yyDollar[2].val)
                        yyVAL.list = list1(yyDollar[1].node)
                }
        case 232:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:1662
+               //line go.y:1664
                {
                        yyDollar[2].node.SetVal(yyDollar[4].val)
                        yyVAL.list = list1(yyDollar[2].node)
@@ -2830,7 +2832,7 @@ yydefault:
                }
        case 233:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1668
+               //line go.y:1670
                {
                        yyDollar[2].node.Right = Nod(OIND, yyDollar[2].node.Right, nil)
                        yyDollar[2].node.SetVal(yyDollar[3].val)
@@ -2838,7 +2840,7 @@ yydefault:
                }
        case 234:
                yyDollar = yyS[yypt-5 : yypt+1]
-               //line go.y:1674
+               //line go.y:1676
                {
                        yyDollar[3].node.Right = Nod(OIND, yyDollar[3].node.Right, nil)
                        yyDollar[3].node.SetVal(yyDollar[5].val)
@@ -2847,7 +2849,7 @@ yydefault:
                }
        case 235:
                yyDollar = yyS[yypt-5 : yypt+1]
-               //line go.y:1681
+               //line go.y:1683
                {
                        yyDollar[3].node.Right = Nod(OIND, yyDollar[3].node.Right, nil)
                        yyDollar[3].node.SetVal(yyDollar[5].val)
@@ -2856,7 +2858,7 @@ yydefault:
                }
        case 236:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1690
+               //line go.y:1692
                {
                        var n *Node
 
@@ -2868,7 +2870,7 @@ yydefault:
                }
        case 237:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1700
+               //line go.y:1702
                {
                        var pkg *Pkg
 
@@ -2883,33 +2885,33 @@ yydefault:
                }
        case 238:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1715
+               //line go.y:1717
                {
                        yyVAL.node = embedded(yyDollar[1].sym, localpkg)
                }
        case 239:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:1721
+               //line go.y:1723
                {
                        yyVAL.node = Nod(ODCLFIELD, yyDollar[1].node, yyDollar[2].node)
                        ifacedcl(yyVAL.node)
                }
        case 240:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1726
+               //line go.y:1728
                {
                        yyVAL.node = Nod(ODCLFIELD, nil, oldname(yyDollar[1].sym))
                }
        case 241:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1730
+               //line go.y:1732
                {
                        yyVAL.node = Nod(ODCLFIELD, nil, oldname(yyDollar[2].sym))
                        Yyerror("cannot parenthesize embedded type")
                }
        case 242:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:1737
+               //line go.y:1739
                {
                        // without func keyword
                        yyDollar[2].list = checkarglist(yyDollar[2].list, 1)
@@ -2919,7 +2921,7 @@ yydefault:
                }
        case 244:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:1751
+               //line go.y:1753
                {
                        yyVAL.node = Nod(ONONAME, nil, nil)
                        yyVAL.node.Sym = yyDollar[1].sym
@@ -2927,7 +2929,7 @@ yydefault:
                }
        case 245:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:1757
+               //line go.y:1759
                {
                        yyVAL.node = Nod(ONONAME, nil, nil)
                        yyVAL.node.Sym = yyDollar[1].sym
@@ -2935,56 +2937,56 @@ yydefault:
                }
        case 247:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1766
+               //line go.y:1768
                {
                        yyVAL.list = list1(yyDollar[1].node)
                }
        case 248:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1770
+               //line go.y:1772
                {
                        yyVAL.list = list(yyDollar[1].list, yyDollar[3].node)
                }
        case 249:
                yyDollar = yyS[yypt-0 : yypt+1]
-               //line go.y:1775
+               //line go.y:1777
                {
                        yyVAL.list = nil
                }
        case 250:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:1779
+               //line go.y:1781
                {
                        yyVAL.list = yyDollar[1].list
                }
        case 251:
                yyDollar = yyS[yypt-0 : yypt+1]
-               //line go.y:1787
+               //line go.y:1789
                {
                        yyVAL.node = nil
                }
        case 253:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1792
+               //line go.y:1794
                {
                        yyVAL.node = liststmt(yyDollar[1].list)
                }
        case 255:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1797
+               //line go.y:1799
                {
                        yyVAL.node = nil
                }
        case 261:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:1808
+               //line go.y:1810
                {
                        yyDollar[1].node = Nod(OLABEL, yyDollar[1].node, nil)
                        yyDollar[1].node.Sym = dclstack // context, for goto restrictions
                }
        case 262:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:1813
+               //line go.y:1815
                {
                        var l *NodeList
 
@@ -2997,7 +2999,7 @@ yydefault:
                }
        case 263:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1824
+               //line go.y:1826
                {
                        // will be converted to OFALL
                        yyVAL.node = Nod(OXFALL, nil, nil)
@@ -3005,38 +3007,38 @@ yydefault:
                }
        case 264:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:1830
+               //line go.y:1832
                {
                        yyVAL.node = Nod(OBREAK, yyDollar[2].node, nil)
                }
        case 265:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:1834
+               //line go.y:1836
                {
                        yyVAL.node = Nod(OCONTINUE, yyDollar[2].node, nil)
                }
        case 266:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:1838
+               //line go.y:1840
                {
                        yyVAL.node = Nod(OPROC, yyDollar[2].node, nil)
                }
        case 267:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:1842
+               //line go.y:1844
                {
                        yyVAL.node = Nod(ODEFER, yyDollar[2].node, nil)
                }
        case 268:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:1846
+               //line go.y:1848
                {
                        yyVAL.node = Nod(OGOTO, yyDollar[2].node, nil)
                        yyVAL.node.Sym = dclstack // context, for goto restrictions
                }
        case 269:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:1851
+               //line go.y:1853
                {
                        yyVAL.node = Nod(ORETURN, nil, nil)
                        yyVAL.node.List = yyDollar[2].list
@@ -3058,7 +3060,7 @@ yydefault:
                }
        case 270:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1873
+               //line go.y:1875
                {
                        yyVAL.list = nil
                        if yyDollar[1].node != nil {
@@ -3067,7 +3069,7 @@ yydefault:
                }
        case 271:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1880
+               //line go.y:1882
                {
                        yyVAL.list = yyDollar[1].list
                        if yyDollar[3].node != nil {
@@ -3076,163 +3078,163 @@ yydefault:
                }
        case 272:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1889
+               //line go.y:1891
                {
                        yyVAL.list = list1(yyDollar[1].node)
                }
        case 273:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1893
+               //line go.y:1895
                {
                        yyVAL.list = list(yyDollar[1].list, yyDollar[3].node)
                }
        case 274:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1899
+               //line go.y:1901
                {
                        yyVAL.list = list1(yyDollar[1].node)
                }
        case 275:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1903
+               //line go.y:1905
                {
                        yyVAL.list = list(yyDollar[1].list, yyDollar[3].node)
                }
        case 276:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1909
+               //line go.y:1911
                {
                        yyVAL.list = list1(yyDollar[1].node)
                }
        case 277:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1913
+               //line go.y:1915
                {
                        yyVAL.list = list(yyDollar[1].list, yyDollar[3].node)
                }
        case 278:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1919
+               //line go.y:1921
                {
                        yyVAL.list = list1(yyDollar[1].node)
                }
        case 279:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1923
+               //line go.y:1925
                {
                        yyVAL.list = list(yyDollar[1].list, yyDollar[3].node)
                }
        case 280:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1932
+               //line go.y:1934
                {
                        yyVAL.list = list1(yyDollar[1].node)
                }
        case 281:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1936
+               //line go.y:1938
                {
                        yyVAL.list = list1(yyDollar[1].node)
                }
        case 282:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1940
+               //line go.y:1942
                {
                        yyVAL.list = list(yyDollar[1].list, yyDollar[3].node)
                }
        case 283:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1944
+               //line go.y:1946
                {
                        yyVAL.list = list(yyDollar[1].list, yyDollar[3].node)
                }
        case 284:
                yyDollar = yyS[yypt-0 : yypt+1]
-               //line go.y:1949
+               //line go.y:1951
                {
                        yyVAL.list = nil
                }
        case 285:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:1953
+               //line go.y:1955
                {
                        yyVAL.list = yyDollar[1].list
                }
        case 290:
                yyDollar = yyS[yypt-0 : yypt+1]
-               //line go.y:1967
+               //line go.y:1969
                {
                        yyVAL.node = nil
                }
        case 292:
                yyDollar = yyS[yypt-0 : yypt+1]
-               //line go.y:1973
+               //line go.y:1975
                {
                        yyVAL.list = nil
                }
        case 294:
                yyDollar = yyS[yypt-0 : yypt+1]
-               //line go.y:1979
+               //line go.y:1981
                {
                        yyVAL.node = nil
                }
        case 296:
                yyDollar = yyS[yypt-0 : yypt+1]
-               //line go.y:1985
+               //line go.y:1987
                {
                        yyVAL.list = nil
                }
        case 298:
                yyDollar = yyS[yypt-0 : yypt+1]
-               //line go.y:1991
+               //line go.y:1993
                {
                        yyVAL.list = nil
                }
        case 300:
                yyDollar = yyS[yypt-0 : yypt+1]
-               //line go.y:1997
+               //line go.y:1999
                {
                        yyVAL.list = nil
                }
        case 302:
                yyDollar = yyS[yypt-0 : yypt+1]
-               //line go.y:2003
+               //line go.y:2005
                {
                        yyVAL.val.U = nil
                }
        case 304:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:2013
+               //line go.y:2015
                {
                        importimport(yyDollar[2].sym, yyDollar[3].val.U.(string))
                }
        case 305:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:2017
+               //line go.y:2019
                {
                        importvar(yyDollar[2].sym, yyDollar[3].typ)
                }
        case 306:
                yyDollar = yyS[yypt-5 : yypt+1]
-               //line go.y:2021
+               //line go.y:2023
                {
                        importconst(yyDollar[2].sym, Types[TIDEAL], yyDollar[4].node)
                }
        case 307:
                yyDollar = yyS[yypt-6 : yypt+1]
-               //line go.y:2025
+               //line go.y:2027
                {
                        importconst(yyDollar[2].sym, yyDollar[3].typ, yyDollar[5].node)
                }
        case 308:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:2029
+               //line go.y:2031
                {
                        importtype(yyDollar[2].typ, yyDollar[3].typ)
                }
        case 309:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:2033
+               //line go.y:2035
                {
                        if yyDollar[2].node == nil {
                                dclcontext = PEXTERN // since we skip the funcbody below
@@ -3253,27 +3255,27 @@ yydefault:
                }
        case 310:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:2054
+               //line go.y:2056
                {
                        yyVAL.sym = yyDollar[1].sym
                        structpkg = yyVAL.sym.Pkg
                }
        case 311:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:2061
+               //line go.y:2063
                {
                        yyVAL.typ = pkgtype(yyDollar[1].sym)
                        importsym(yyDollar[1].sym, OTYPE)
                }
        case 317:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:2081
+               //line go.y:2083
                {
                        yyVAL.typ = pkgtype(yyDollar[1].sym)
                }
        case 318:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:2085
+               //line go.y:2087
                {
                        // predefined name like uint8
                        yyDollar[1].sym = Pkglookup(yyDollar[1].sym.Name, builtinpkg)
@@ -3286,43 +3288,43 @@ yydefault:
                }
        case 319:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:2096
+               //line go.y:2098
                {
                        yyVAL.typ = aindex(nil, yyDollar[3].typ)
                }
        case 320:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:2100
+               //line go.y:2102
                {
                        yyVAL.typ = aindex(nodlit(yyDollar[2].val), yyDollar[4].typ)
                }
        case 321:
                yyDollar = yyS[yypt-5 : yypt+1]
-               //line go.y:2104
+               //line go.y:2106
                {
                        yyVAL.typ = maptype(yyDollar[3].typ, yyDollar[5].typ)
                }
        case 322:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:2108
+               //line go.y:2110
                {
                        yyVAL.typ = tostruct(yyDollar[3].list)
                }
        case 323:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:2112
+               //line go.y:2114
                {
                        yyVAL.typ = tointerface(yyDollar[3].list)
                }
        case 324:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:2116
+               //line go.y:2118
                {
                        yyVAL.typ = Ptrto(yyDollar[2].typ)
                }
        case 325:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:2120
+               //line go.y:2122
                {
                        yyVAL.typ = typ(TCHAN)
                        yyVAL.typ.Type = yyDollar[2].typ
@@ -3330,7 +3332,7 @@ yydefault:
                }
        case 326:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:2126
+               //line go.y:2128
                {
                        yyVAL.typ = typ(TCHAN)
                        yyVAL.typ.Type = yyDollar[3].typ
@@ -3338,7 +3340,7 @@ yydefault:
                }
        case 327:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:2132
+               //line go.y:2134
                {
                        yyVAL.typ = typ(TCHAN)
                        yyVAL.typ.Type = yyDollar[3].typ
@@ -3346,7 +3348,7 @@ yydefault:
                }
        case 328:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:2140
+               //line go.y:2142
                {
                        yyVAL.typ = typ(TCHAN)
                        yyVAL.typ.Type = yyDollar[3].typ
@@ -3354,13 +3356,13 @@ yydefault:
                }
        case 329:
                yyDollar = yyS[yypt-5 : yypt+1]
-               //line go.y:2148
+               //line go.y:2150
                {
                        yyVAL.typ = functype(nil, yyDollar[3].list, yyDollar[5].list)
                }
        case 330:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:2154
+               //line go.y:2156
                {
                        yyVAL.node = Nod(ODCLFIELD, nil, typenod(yyDollar[2].typ))
                        if yyDollar[1].sym != nil {
@@ -3370,7 +3372,7 @@ yydefault:
                }
        case 331:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:2162
+               //line go.y:2164
                {
                        var t *Type
 
@@ -3387,7 +3389,7 @@ yydefault:
                }
        case 332:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:2179
+               //line go.y:2181
                {
                        var s *Sym
                        var p *Pkg
@@ -3411,43 +3413,43 @@ yydefault:
                }
        case 333:
                yyDollar = yyS[yypt-5 : yypt+1]
-               //line go.y:2203
+               //line go.y:2205
                {
                        yyVAL.node = Nod(ODCLFIELD, newname(yyDollar[1].sym), typenod(functype(fakethis(), yyDollar[3].list, yyDollar[5].list)))
                }
        case 334:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:2207
+               //line go.y:2209
                {
                        yyVAL.node = Nod(ODCLFIELD, nil, typenod(yyDollar[1].typ))
                }
        case 335:
                yyDollar = yyS[yypt-0 : yypt+1]
-               //line go.y:2212
+               //line go.y:2214
                {
                        yyVAL.list = nil
                }
        case 337:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:2219
+               //line go.y:2221
                {
                        yyVAL.list = yyDollar[2].list
                }
        case 338:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:2223
+               //line go.y:2225
                {
                        yyVAL.list = list1(Nod(ODCLFIELD, nil, typenod(yyDollar[1].typ)))
                }
        case 339:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:2233
+               //line go.y:2235
                {
                        yyVAL.node = nodlit(yyDollar[1].val)
                }
        case 340:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:2237
+               //line go.y:2239
                {
                        yyVAL.node = nodlit(yyDollar[2].val)
                        switch yyVAL.node.Val().Ctype() {
@@ -3467,7 +3469,7 @@ yydefault:
                }
        case 341:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:2255
+               //line go.y:2257
                {
                        yyVAL.node = oldname(Pkglookup(yyDollar[1].sym.Name, builtinpkg))
                        if yyVAL.node.Op != OLITERAL {
@@ -3476,7 +3478,7 @@ yydefault:
                }
        case 343:
                yyDollar = yyS[yypt-5 : yypt+1]
-               //line go.y:2265
+               //line go.y:2267
                {
                        if yyDollar[2].node.Val().Ctype() == CTRUNE && yyDollar[4].node.Val().Ctype() == CTINT {
                                yyVAL.node = yyDollar[2].node
@@ -3489,37 +3491,37 @@ yydefault:
                }
        case 346:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:2281
+               //line go.y:2283
                {
                        yyVAL.list = list1(yyDollar[1].node)
                }
        case 347:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:2285
+               //line go.y:2287
                {
                        yyVAL.list = list(yyDollar[1].list, yyDollar[3].node)
                }
        case 348:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:2291
+               //line go.y:2293
                {
                        yyVAL.list = list1(yyDollar[1].node)
                }
        case 349:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:2295
+               //line go.y:2297
                {
                        yyVAL.list = list(yyDollar[1].list, yyDollar[3].node)
                }
        case 350:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:2301
+               //line go.y:2303
                {
                        yyVAL.list = list1(yyDollar[1].node)
                }
        case 351:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:2305
+               //line go.y:2307
                {
                        yyVAL.list = list(yyDollar[1].list, yyDollar[3].node)
                }
index 54f7b3efb19dd421377d87a2fab958bc5e52d8fc..fb20fab3292582c911c2707baa4d7c236d9f75dd 100644 (file)
@@ -22,3 +22,12 @@ func add1(p unsafe.Pointer, x uintptr) unsafe.Pointer { // ERROR "can inline add
 func f(x *byte) *byte { // ERROR "can inline f" "leaking param: x to result"
        return add2(x, 1) // ERROR "inlining call to add2" "inlining call to add1"
 }
+
+//go:noinline
+func g(x int) int {
+       return x + 1
+}
+
+func h(x int) int { // ERROR "can inline h"
+       return x + 2
+}