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 <todd@tneal.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
This commit is contained in:
Todd Neal 2015-08-24 19:45:59 -05:00
parent c9b8cab16c
commit a92543e1a1
7 changed files with 144 additions and 119 deletions

View file

@ -657,10 +657,11 @@ var instrumenting bool
// Pending annotations for next func declaration. // Pending annotations for next func declaration.
var ( var (
noescape bool noescape bool
noinline bool
norace bool
nosplit bool nosplit bool
nowritebarrier bool nowritebarrier bool
systemstack bool systemstack bool
norace bool
) )
var debuglive int var debuglive int

View file

@ -1393,6 +1393,7 @@ xfndcl:
$$.Noescape = noescape; $$.Noescape = noescape;
$$.Func.Norace = norace; $$.Func.Norace = norace;
$$.Func.Nosplit = nosplit; $$.Func.Nosplit = nosplit;
$$.Func.Noinline = noinline;
$$.Func.Nowritebarrier = nowritebarrier; $$.Func.Nowritebarrier = nowritebarrier;
$$.Func.Systemstack = systemstack; $$.Func.Systemstack = systemstack;
funcbody($$); funcbody($$);
@ -1579,8 +1580,9 @@ xdcl_list:
if nsyntaxerrors == 0 { if nsyntaxerrors == 0 {
testdclstack(); testdclstack();
} }
nointerface = false
noescape = false noescape = false
noinline = false
nointerface = false
norace = false norace = false
nosplit = false nosplit = false
nowritebarrier = false nowritebarrier = false

View file

@ -106,6 +106,11 @@ func caninl(fn *Node) {
Fatalf("caninl no nname %v", Nconv(fn, obj.FmtSign)) 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 has no body (is defined outside of Go), cannot inline it.
if fn.Nbody == nil { if fn.Nbody == nil {
return return

View file

@ -1662,6 +1662,11 @@ func getlinepragma() int {
return c return c
} }
if verb == "go:noinline" {
noinline = true
return c
}
if verb == "go:systemstack" { if verb == "go:systemstack" {
if compiling_runtime == 0 { if compiling_runtime == 0 {
Yyerror("//go:systemstack only allowed in runtime") Yyerror("//go:systemstack only allowed in runtime")

View file

@ -171,6 +171,7 @@ type Func struct {
Norace bool // func must not have race detector annotations Norace bool // func must not have race detector annotations
Nosplit bool // func should not execute on separate stack 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 Nowritebarrier bool // emit compiler error instead of write barrier
Dupok bool // duplicate definitions ok Dupok bool // duplicate definitions ok
Wrapper bool // is method wrapper Wrapper bool // is method wrapper

View file

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

View 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" 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" 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
}