From a92543e1a13f62add68a55a5b2c8f87e40d8a41f Mon Sep 17 00:00:00 2001 From: Todd Neal Date: Mon, 24 Aug 2015 19:45:59 -0500 Subject: [PATCH] cmd/compile: add support for a go:noinline directive 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 TryBot-Result: Gobot Gobot Reviewed-by: Josh Bleecher Snyder --- src/cmd/compile/internal/gc/go.go | 3 +- src/cmd/compile/internal/gc/go.y | 4 +- src/cmd/compile/internal/gc/inl.go | 5 + src/cmd/compile/internal/gc/lex.go | 5 + src/cmd/compile/internal/gc/syntax.go | 1 + src/cmd/compile/internal/gc/y.go | 236 +++++++++++++------------- test/inline.go | 9 + 7 files changed, 144 insertions(+), 119 deletions(-) diff --git a/src/cmd/compile/internal/gc/go.go b/src/cmd/compile/internal/gc/go.go index 12f07494b9..84f11e69d0 100644 --- a/src/cmd/compile/internal/gc/go.go +++ b/src/cmd/compile/internal/gc/go.go @@ -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 diff --git a/src/cmd/compile/internal/gc/go.y b/src/cmd/compile/internal/gc/go.y index 3b2b643027..fc3af69568 100644 --- a/src/cmd/compile/internal/gc/go.y +++ b/src/cmd/compile/internal/gc/go.y @@ -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 diff --git a/src/cmd/compile/internal/gc/inl.go b/src/cmd/compile/internal/gc/inl.go index cb165f48f2..66d5b74307 100644 --- a/src/cmd/compile/internal/gc/inl.go +++ b/src/cmd/compile/internal/gc/inl.go @@ -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 diff --git a/src/cmd/compile/internal/gc/lex.go b/src/cmd/compile/internal/gc/lex.go index 6ea1482313..c37befdafb 100644 --- a/src/cmd/compile/internal/gc/lex.go +++ b/src/cmd/compile/internal/gc/lex.go @@ -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") diff --git a/src/cmd/compile/internal/gc/syntax.go b/src/cmd/compile/internal/gc/syntax.go index c94d727488..87480044ff 100644 --- a/src/cmd/compile/internal/gc/syntax.go +++ b/src/cmd/compile/internal/gc/syntax.go @@ -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 diff --git a/src/cmd/compile/internal/gc/y.go b/src/cmd/compile/internal/gc/y.go index 5e5b5f4a46..7e6ae02c7f 100644 --- a/src/cmd/compile/internal/gc/y.go +++ b/src/cmd/compile/internal/gc/y.go @@ -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) } diff --git a/test/inline.go b/test/inline.go index 54f7b3efb1..fb20fab329 100644 --- a/test/inline.go +++ b/test/inline.go @@ -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 +} -- 2.48.1