]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/gc, cmd/yacc: merge yaccerrors.go into cmd/yacc
authorMatthew Dempsky <mdempsky@google.com>
Tue, 7 Apr 2015 18:57:52 +0000 (11:57 -0700)
committerMatthew Dempsky <mdempsky@google.com>
Fri, 15 May 2015 17:29:26 +0000 (17:29 +0000)
This extends cmd/yacc with support for

%error { tokens } : message

syntax to specify custom error messages to use instead of the default
generic ones.  This allows merging go.errors into go.y and removing
the yaccerrors.go tool.

Updates #9968.

Change-Id: I781219c568b86472755f877f48401eaeab00ead5
Reviewed-on: https://go-review.googlesource.com/8563
Reviewed-by: Russ Cox <rsc@golang.org>
src/cmd/internal/gc/go.errors [deleted file]
src/cmd/internal/gc/go.y
src/cmd/internal/gc/lex.go
src/cmd/internal/gc/subr.go
src/cmd/internal/gc/y.go
src/cmd/internal/gc/y.output
src/cmd/internal/gc/yaccerrors.go [deleted file]
src/cmd/internal/gc/yymsg.go [deleted file]
src/cmd/yacc/yacc.go

diff --git a/src/cmd/internal/gc/go.errors b/src/cmd/internal/gc/go.errors
deleted file mode 100644 (file)
index 8370a20..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright 2010 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.
-
-// Example-based syntax error messages.
-// See yaccerrors.go.
-
-package gc
-
-var yymsg = []struct {
-       yystate int
-       yychar  int
-       msg     string
-}{
-       // Each line of the form % token list
-       // is converted by yaccerrors.go into the yystate and yychar caused
-       // by that token list.
-
-       % loadsys package LIMPORT '(' LLITERAL import_package import_there ','
-               "unexpected comma during import block"},
-
-       % loadsys package LIMPORT LNAME ';'
-               "missing import path; require quoted string"},
-
-       % loadsys package imports LFUNC LNAME '(' ')' '{' LIF if_header ';'
-               "missing { after if clause"},
-
-       % loadsys package imports LFUNC LNAME '(' ')' '{' LSWITCH if_header ';'
-               "missing { after switch clause"},
-
-       % loadsys package imports LFUNC LNAME '(' ')' '{' LFOR for_header ';'
-               "missing { after for clause"},
-
-       % loadsys package imports LFUNC LNAME '(' ')' '{' LFOR ';' LBODY
-               "missing { after for clause"},
-
-       % loadsys package imports LFUNC LNAME '(' ')' ';' '{'
-               "unexpected semicolon or newline before {"},
-
-       % loadsys package imports LTYPE LNAME ';'
-               "unexpected semicolon or newline in type declaration"},
-
-       % loadsys package imports LCHAN '}'
-               "unexpected } in channel type"},
-
-       % loadsys package imports LCHAN ')'
-               "unexpected ) in channel type"},
-
-       % loadsys package imports LCHAN ','
-               "unexpected comma in channel type"},
-
-       % loadsys package imports LFUNC LNAME '(' ')' '{' if_stmt ';' LELSE
-               "unexpected semicolon or newline before else"},
-
-       % loadsys package imports LTYPE LNAME LINTERFACE '{' LNAME ',' LNAME
-               "name list not allowed in interface type"},
-
-       % loadsys package imports LFUNC LNAME '(' ')' '{' LFOR LVAR LNAME '=' LNAME
-               "var declaration not allowed in for initializer"},
-
-       % loadsys package imports LVAR LNAME '[' ']' LNAME '{'
-               "unexpected { at end of statement"},
-
-       % loadsys package imports LFUNC LNAME '(' ')' '{' LVAR LNAME '[' ']' LNAME '{'
-               "unexpected { at end of statement"},
-
-       % loadsys package imports LFUNC LNAME '(' ')' '{' LDEFER LNAME ';'
-               "argument to go/defer must be function call"},
-
-       % loadsys package imports LVAR LNAME '=' LNAME '{' LNAME ';'
-               "need trailing comma before newline in composite literal"},
-
-       % loadsys package imports LVAR LNAME '=' comptype '{' LNAME ';'
-               "need trailing comma before newline in composite literal"},
-
-       % loadsys package imports LFUNC LNAME '(' ')' '{' LFUNC LNAME
-               "nested func not allowed"},
-
-       % loadsys package imports LFUNC LNAME '(' ')' '{' LIF if_header loop_body LELSE ';'
-               "else must be followed by if or statement block"},
-}
index e2e4331a7794e8e5ce4e27c8c8bc34f39d8d29f9..7d523ae7c0ff16fb69313ab359ccf343a31bba6e 100644 (file)
@@ -117,7 +117,68 @@ import (
 %left          ')'
 %left          PreferToRightParen
 
-// TODO(rsc): Add %error-verbose
+%error loadsys package LIMPORT '(' LLITERAL import_package import_there ',':
+       "unexpected comma during import block"
+
+%error loadsys package LIMPORT LNAME ';':
+       "missing import path; require quoted string"
+
+%error loadsys package imports LFUNC LNAME '(' ')' '{' LIF if_header ';':
+       "missing { after if clause"
+
+%error loadsys package imports LFUNC LNAME '(' ')' '{' LSWITCH if_header ';':
+       "missing { after switch clause"
+
+%error loadsys package imports LFUNC LNAME '(' ')' '{' LFOR for_header ';':
+       "missing { after for clause"
+
+%error loadsys package imports LFUNC LNAME '(' ')' '{' LFOR ';' LBODY:
+       "missing { after for clause"
+
+%error loadsys package imports LFUNC LNAME '(' ')' ';' '{':
+       "unexpected semicolon or newline before {"
+
+%error loadsys package imports LTYPE LNAME ';':
+       "unexpected semicolon or newline in type declaration"
+
+%error loadsys package imports LCHAN '}':
+       "unexpected } in channel type"
+
+%error loadsys package imports LCHAN ')':
+       "unexpected ) in channel type"
+
+%error loadsys package imports LCHAN ',':
+       "unexpected comma in channel type"
+
+%error loadsys package imports LFUNC LNAME '(' ')' '{' if_stmt ';' LELSE:
+       "unexpected semicolon or newline before else"
+
+%error loadsys package imports LTYPE LNAME LINTERFACE '{' LNAME ',' LNAME:
+       "name list not allowed in interface type"
+
+%error loadsys package imports LFUNC LNAME '(' ')' '{' LFOR LVAR LNAME '=' LNAME:
+       "var declaration not allowed in for initializer"
+
+%error loadsys package imports LVAR LNAME '[' ']' LNAME '{':
+       "unexpected { at end of statement"
+
+%error loadsys package imports LFUNC LNAME '(' ')' '{' LVAR LNAME '[' ']' LNAME '{':
+       "unexpected { at end of statement"
+
+%error loadsys package imports LFUNC LNAME '(' ')' '{' LDEFER LNAME ';':
+       "argument to go/defer must be function call"
+
+%error loadsys package imports LVAR LNAME '=' LNAME '{' LNAME ';':
+       "need trailing comma before newline in composite literal"
+
+%error loadsys package imports LVAR LNAME '=' comptype '{' LNAME ';':
+       "need trailing comma before newline in composite literal"
+
+%error loadsys package imports LFUNC LNAME '(' ')' '{' LFUNC LNAME:
+       "nested func not allowed"
+
+%error loadsys package imports LFUNC LNAME '(' ')' '{' LIF if_header loop_body LELSE ';':
+       "else must be followed by if or statement block"
 
 %%
 file:
index 1bf07580004bf77462c3b1abe11166ecd4c729f2..9e2baec220331ef31639dfd358a5b4a633000269 100644 (file)
@@ -3,7 +3,6 @@
 // license that can be found in the LICENSE file.
 
 //go:generate go tool yacc go.y
-//go:generate go run yaccerrors.go
 //go:generate go run mkbuiltin.go runtime unsafe
 
 package gc
index 7f9e78810f7ce95f675bb27f7911be33d0bc3fe5..74415be49acbc08202cc300f0b86b319f234f21e 100644 (file)
@@ -125,13 +125,6 @@ func Yyerror(format string, args ...interface{}) {
        if strings.HasPrefix(msg, "syntax error") {
                nsyntaxerrors++
 
-               yystate := theparser.(*yyParserImpl).state()
-               yychar := theparser.Lookahead()
-
-               if Debug['x'] != 0 {
-                       fmt.Printf("yyerror: yystate=%d yychar=%d\n", yystate, yychar)
-               }
-
                // An unexpected EOF caused a syntax error. Use the previous
                // line number since getc generated a fake newline character.
                if curio.eofnl != 0 {
@@ -144,14 +137,6 @@ func Yyerror(format string, args ...interface{}) {
                }
                yyerror_lastsyntax = int(lexlineno)
 
-               // look for parse state-specific errors in list (see go.errors).
-               for i := range yymsg {
-                       if yymsg[i].yystate == yystate && yymsg[i].yychar == yychar {
-                               yyerrorl(int(lexlineno), "syntax error: %s", yymsg[i].msg)
-                               return
-                       }
-               }
-
                // plain "syntax error" gets "near foo" added
                if msg == "syntax error" {
                        yyerrorl(int(lexlineno), "syntax error near %s", lexbuf.String())
index 06f6b13eb677c5563ba2818057b7a2d1975c30da..72bce9a465cabb9b56d7173abecf25bd62efb435 100644 (file)
@@ -154,7 +154,7 @@ const yyEofCode = 1
 const yyErrCode = 2
 const yyMaxDepth = 200
 
-//line go.y:2243
+//line go.y:2304
 func fixlbrace(lbr int) {
        // If the opening brace was an LBODY,
        // set up for another one now that we're done.
@@ -857,6 +857,34 @@ var yyTok3 = [...]int{
        0,
 }
 
+var yyErrorMessages = [...]struct {
+       state int
+       token int
+       msg   string
+}{
+       {332, 76, "unexpected comma during import block"},
+       {89, 63, "missing import path; require quoted string"},
+       {390, 63, "missing { after if clause"},
+       {387, 63, "missing { after switch clause"},
+       {279, 63, "missing { after for clause"},
+       {498, 36, "missing { after for clause"},
+       {17, 68, "unexpected semicolon or newline before {"},
+       {111, 63, "unexpected semicolon or newline in type declaration"},
+       {78, 69, "unexpected } in channel type"},
+       {78, 61, "unexpected ) in channel type"},
+       {78, 76, "unexpected comma in channel type"},
+       {416, 15, "unexpected semicolon or newline before else"},
+       {329, 76, "name list not allowed in interface type"},
+       {279, 33, "var declaration not allowed in for initializer"},
+       {25, 68, "unexpected { at end of statement"},
+       {371, 68, "unexpected { at end of statement"},
+       {122, 63, "argument to go/defer must be function call"},
+       {398, 63, "need trailing comma before newline in composite literal"},
+       {414, 63, "need trailing comma before newline in composite literal"},
+       {124, 25, "nested func not allowed"},
+       {650, 63, "else must be followed by if or statement block"},
+}
+
 //line yaccpar:1
 
 /*     parser for yacc output  */
@@ -878,7 +906,6 @@ type yyParser interface {
 
 type yyParserImpl struct {
        lookahead func() int
-       state     func() int
 }
 
 func (p *yyParserImpl) Lookahead() int {
@@ -888,7 +915,6 @@ func (p *yyParserImpl) Lookahead() int {
 func yyNewParser() yyParser {
        p := &yyParserImpl{
                lookahead: func() int { return -1 },
-               state:     func() int { return -1 },
        }
        return p
 }
@@ -919,6 +945,13 @@ func yyErrorMessage(state, lookAhead int) string {
        if !yyErrorVerbose {
                return "syntax error"
        }
+
+       for _, e := range yyErrorMessages {
+               if e.state == state && e.token == lookAhead {
+                       return "syntax error: " + e.msg
+               }
+       }
+
        res := "syntax error: unexpected " + yyTokname(lookAhead)
 
        // To match Bison, suggest at most four expected tokens.
@@ -1021,7 +1054,6 @@ func (yyrcvr *yyParserImpl) Parse(yylex yyLexer) int {
        yystate := 0
        yychar := -1
        yytoken := -1 // yychar translated into internal numbering
-       yyrcvr.state = func() int { return yystate }
        yyrcvr.lookahead = func() int { return yychar }
        defer func() {
                // Make sure we report no lookahead when not parsing.
@@ -1188,13 +1220,13 @@ yydefault:
 
        case 1:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:128
+               //line go.y:189
                {
                        xtop = concat(xtop, yyDollar[4].list)
                }
        case 2:
                yyDollar = yyS[yypt-0 : yypt+1]
-               //line go.y:134
+               //line go.y:195
                {
                        prevlineno = lineno
                        Yyerror("package statement must be first")
@@ -1202,13 +1234,13 @@ yydefault:
                }
        case 3:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:140
+               //line go.y:201
                {
                        mkpackage(yyDollar[2].sym.Name)
                }
        case 4:
                yyDollar = yyS[yypt-0 : yypt+1]
-               //line go.y:150
+               //line go.y:211
                {
                        importpkg = Runtimepkg
 
@@ -1221,13 +1253,13 @@ yydefault:
                }
        case 5:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:162
+               //line go.y:223
                {
                        importpkg = nil
                }
        case 11:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:176
+               //line go.y:237
                {
                        ipkg := importpkg
                        my := importmyname
@@ -1264,7 +1296,7 @@ yydefault:
                }
        case 12:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:211
+               //line go.y:272
                {
                        // When an invalid import path is passed to importfile,
                        // it calls Yyerror and then sets up a fake import with
@@ -1276,7 +1308,7 @@ yydefault:
                }
        case 15:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:227
+               //line go.y:288
                {
                        // import with original name
                        yyVAL.i = parserline()
@@ -1285,7 +1317,7 @@ yydefault:
                }
        case 16:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:234
+               //line go.y:295
                {
                        // import with given name
                        yyVAL.i = parserline()
@@ -1294,7 +1326,7 @@ yydefault:
                }
        case 17:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:241
+               //line go.y:302
                {
                        // import into my name space
                        yyVAL.i = parserline()
@@ -1303,7 +1335,7 @@ yydefault:
                }
        case 18:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:250
+               //line go.y:311
                {
                        if importpkg.Name == "" {
                                importpkg.Name = yyDollar[2].sym.Name
@@ -1320,7 +1352,7 @@ yydefault:
                }
        case 20:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:267
+               //line go.y:328
                {
                        if yyDollar[1].sym.Name == "safe" {
                                curio.importsafe = true
@@ -1328,64 +1360,64 @@ yydefault:
                }
        case 21:
                yyDollar = yyS[yypt-0 : yypt+1]
-               //line go.y:274
+               //line go.y:335
                {
                        defercheckwidth()
                }
        case 22:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:278
+               //line go.y:339
                {
                        resumecheckwidth()
                        unimportfile()
                }
        case 23:
                yyDollar = yyS[yypt-0 : yypt+1]
-               //line go.y:287
+               //line go.y:348
                {
                        Yyerror("empty top-level declaration")
                        yyVAL.list = nil
                }
        case 25:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:293
+               //line go.y:354
                {
                        yyVAL.list = list1(yyDollar[1].node)
                }
        case 26:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:297
+               //line go.y:358
                {
                        Yyerror("non-declaration statement outside function body")
                        yyVAL.list = nil
                }
        case 27:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:302
+               //line go.y:363
                {
                        yyVAL.list = nil
                }
        case 28:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:308
+               //line go.y:369
                {
                        yyVAL.list = yyDollar[2].list
                }
        case 29:
                yyDollar = yyS[yypt-5 : yypt+1]
-               //line go.y:312
+               //line go.y:373
                {
                        yyVAL.list = yyDollar[3].list
                }
        case 30:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:316
+               //line go.y:377
                {
                        yyVAL.list = nil
                }
        case 31:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:320
+               //line go.y:381
                {
                        yyVAL.list = yyDollar[2].list
                        iota_ = -100000
@@ -1393,7 +1425,7 @@ yydefault:
                }
        case 32:
                yyDollar = yyS[yypt-5 : yypt+1]
-               //line go.y:326
+               //line go.y:387
                {
                        yyVAL.list = yyDollar[3].list
                        iota_ = -100000
@@ -1401,7 +1433,7 @@ yydefault:
                }
        case 33:
                yyDollar = yyS[yypt-7 : yypt+1]
-               //line go.y:332
+               //line go.y:393
                {
                        yyVAL.list = concat(yyDollar[3].list, yyDollar[5].list)
                        iota_ = -100000
@@ -1409,80 +1441,80 @@ yydefault:
                }
        case 34:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:338
+               //line go.y:399
                {
                        yyVAL.list = nil
                        iota_ = -100000
                }
        case 35:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:343
+               //line go.y:404
                {
                        yyVAL.list = list1(yyDollar[2].node)
                }
        case 36:
                yyDollar = yyS[yypt-5 : yypt+1]
-               //line go.y:347
+               //line go.y:408
                {
                        yyVAL.list = yyDollar[3].list
                }
        case 37:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:351
+               //line go.y:412
                {
                        yyVAL.list = nil
                }
        case 38:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:357
+               //line go.y:418
                {
                        iota_ = 0
                }
        case 39:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:363
+               //line go.y:424
                {
                        yyVAL.list = variter(yyDollar[1].list, yyDollar[2].node, nil)
                }
        case 40:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:367
+               //line go.y:428
                {
                        yyVAL.list = variter(yyDollar[1].list, yyDollar[2].node, yyDollar[4].list)
                }
        case 41:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:371
+               //line go.y:432
                {
                        yyVAL.list = variter(yyDollar[1].list, nil, yyDollar[3].list)
                }
        case 42:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:377
+               //line go.y:438
                {
                        yyVAL.list = constiter(yyDollar[1].list, yyDollar[2].node, yyDollar[4].list)
                }
        case 43:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:381
+               //line go.y:442
                {
                        yyVAL.list = constiter(yyDollar[1].list, nil, yyDollar[3].list)
                }
        case 45:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:388
+               //line go.y:449
                {
                        yyVAL.list = constiter(yyDollar[1].list, yyDollar[2].node, nil)
                }
        case 46:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:392
+               //line go.y:453
                {
                        yyVAL.list = constiter(yyDollar[1].list, nil, nil)
                }
        case 47:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:398
+               //line go.y:459
                {
                        // different from dclname because the name
                        // becomes visible right here, not at the end
@@ -1491,13 +1523,13 @@ yydefault:
                }
        case 48:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:407
+               //line go.y:468
                {
                        yyVAL.node = typedcl1(yyDollar[1].node, yyDollar[2].node, true)
                }
        case 49:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:413
+               //line go.y:474
                {
                        yyVAL.node = yyDollar[1].node
 
@@ -1513,14 +1545,14 @@ yydefault:
                }
        case 50:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:427
+               //line go.y:488
                {
                        yyVAL.node = Nod(OASOP, yyDollar[1].node, yyDollar[3].node)
                        yyVAL.node.Etype = uint8(yyDollar[2].i) // rathole to pass opcode
                }
        case 51:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:432
+               //line go.y:493
                {
                        if yyDollar[1].list.Next == nil && yyDollar[3].list.Next == nil {
                                // simple
@@ -1534,7 +1566,7 @@ yydefault:
                }
        case 52:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:444
+               //line go.y:505
                {
                        if yyDollar[3].list.N.Op == OTYPESW {
                                yyVAL.node = Nod(OTYPESW, nil, yyDollar[3].list.N.Right)
@@ -1554,7 +1586,7 @@ yydefault:
                }
        case 53:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:462
+               //line go.y:523
                {
                        yyVAL.node = Nod(OASOP, yyDollar[1].node, Nodintconst(1))
                        yyVAL.node.Implicit = true
@@ -1562,7 +1594,7 @@ yydefault:
                }
        case 54:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:468
+               //line go.y:529
                {
                        yyVAL.node = Nod(OASOP, yyDollar[1].node, Nodintconst(1))
                        yyVAL.node.Implicit = true
@@ -1570,7 +1602,7 @@ yydefault:
                }
        case 55:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:476
+               //line go.y:537
                {
                        var n, nn *Node
 
@@ -1595,7 +1627,7 @@ yydefault:
                }
        case 56:
                yyDollar = yyS[yypt-5 : yypt+1]
-               //line go.y:499
+               //line go.y:560
                {
                        var n *Node
 
@@ -1615,7 +1647,7 @@ yydefault:
                }
        case 57:
                yyDollar = yyS[yypt-5 : yypt+1]
-               //line go.y:517
+               //line go.y:578
                {
                        // will be converted to OCASE
                        // right will point to next case
@@ -1626,7 +1658,7 @@ yydefault:
                }
        case 58:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:526
+               //line go.y:587
                {
                        var n, nn *Node
 
@@ -1647,13 +1679,13 @@ yydefault:
                }
        case 59:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:547
+               //line go.y:608
                {
                        markdcl()
                }
        case 60:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:551
+               //line go.y:612
                {
                        if yyDollar[3].list == nil {
                                yyVAL.node = Nod(OEMPTY, nil, nil)
@@ -1664,7 +1696,7 @@ yydefault:
                }
        case 61:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:562
+               //line go.y:623
                {
                        // If the last token read by the lexer was consumed
                        // as part of the case, clear it (parser has cleared yychar).
@@ -1677,7 +1709,7 @@ yydefault:
                }
        case 62:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:573
+               //line go.y:634
                {
                        // This is the only place in the language where a statement
                        // list is not allowed to drop the final semicolon, because
@@ -1697,32 +1729,32 @@ yydefault:
                }
        case 63:
                yyDollar = yyS[yypt-0 : yypt+1]
-               //line go.y:592
+               //line go.y:653
                {
                        yyVAL.list = nil
                }
        case 64:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:596
+               //line go.y:657
                {
                        yyVAL.list = list(yyDollar[1].list, yyDollar[2].node)
                }
        case 65:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:602
+               //line go.y:663
                {
                        markdcl()
                }
        case 66:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:606
+               //line go.y:667
                {
                        yyVAL.list = yyDollar[3].list
                        popdcl()
                }
        case 67:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:613
+               //line go.y:674
                {
                        yyVAL.node = Nod(ORANGE, nil, yyDollar[4].node)
                        yyVAL.node.List = yyDollar[1].list
@@ -1730,7 +1762,7 @@ yydefault:
                }
        case 68:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:619
+               //line go.y:680
                {
                        yyVAL.node = Nod(ORANGE, nil, yyDollar[4].node)
                        yyVAL.node.List = yyDollar[1].list
@@ -1739,14 +1771,14 @@ yydefault:
                }
        case 69:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:626
+               //line go.y:687
                {
                        yyVAL.node = Nod(ORANGE, nil, yyDollar[2].node)
                        yyVAL.node.Etype = 0 // := flag
                }
        case 70:
                yyDollar = yyS[yypt-5 : yypt+1]
-               //line go.y:633
+               //line go.y:694
                {
                        // init ; test ; incr
                        if yyDollar[5].node != nil && yyDollar[5].node.Colas {
@@ -1761,7 +1793,7 @@ yydefault:
                }
        case 71:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:646
+               //line go.y:707
                {
                        // normal test
                        yyVAL.node = Nod(OFOR, nil, nil)
@@ -1769,27 +1801,27 @@ yydefault:
                }
        case 73:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:655
+               //line go.y:716
                {
                        yyVAL.node = yyDollar[1].node
                        yyVAL.node.Nbody = concat(yyVAL.node.Nbody, yyDollar[2].list)
                }
        case 74:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:662
+               //line go.y:723
                {
                        markdcl()
                }
        case 75:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:666
+               //line go.y:727
                {
                        yyVAL.node = yyDollar[3].node
                        popdcl()
                }
        case 76:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:673
+               //line go.y:734
                {
                        // test
                        yyVAL.node = Nod(OIF, nil, nil)
@@ -1797,7 +1829,7 @@ yydefault:
                }
        case 77:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:679
+               //line go.y:740
                {
                        // init ; test
                        yyVAL.node = Nod(OIF, nil, nil)
@@ -1808,13 +1840,13 @@ yydefault:
                }
        case 78:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:691
+               //line go.y:752
                {
                        markdcl()
                }
        case 79:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:695
+               //line go.y:756
                {
                        if yyDollar[3].node.Ntest == nil {
                                Yyerror("missing condition in if statement")
@@ -1822,13 +1854,13 @@ yydefault:
                }
        case 80:
                yyDollar = yyS[yypt-5 : yypt+1]
-               //line go.y:701
+               //line go.y:762
                {
                        yyDollar[3].node.Nbody = yyDollar[5].list
                }
        case 81:
                yyDollar = yyS[yypt-8 : yypt+1]
-               //line go.y:705
+               //line go.y:766
                {
                        var n *Node
                        var nn *NodeList
@@ -1846,13 +1878,13 @@ yydefault:
                }
        case 82:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:723
+               //line go.y:784
                {
                        markdcl()
                }
        case 83:
                yyDollar = yyS[yypt-5 : yypt+1]
-               //line go.y:727
+               //line go.y:788
                {
                        if yyDollar[4].node.Ntest == nil {
                                Yyerror("missing condition in if statement")
@@ -1862,25 +1894,25 @@ yydefault:
                }
        case 84:
                yyDollar = yyS[yypt-0 : yypt+1]
-               //line go.y:736
+               //line go.y:797
                {
                        yyVAL.list = nil
                }
        case 85:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:740
+               //line go.y:801
                {
                        yyVAL.list = concat(yyDollar[1].list, yyDollar[2].list)
                }
        case 86:
                yyDollar = yyS[yypt-0 : yypt+1]
-               //line go.y:745
+               //line go.y:806
                {
                        yyVAL.list = nil
                }
        case 87:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:749
+               //line go.y:810
                {
                        l := &NodeList{N: yyDollar[2].node}
                        l.End = l
@@ -1888,13 +1920,13 @@ yydefault:
                }
        case 88:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:757
+               //line go.y:818
                {
                        markdcl()
                }
        case 89:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:761
+               //line go.y:822
                {
                        var n *Node
                        n = yyDollar[3].node.Ntest
@@ -1905,7 +1937,7 @@ yydefault:
                }
        case 90:
                yyDollar = yyS[yypt-7 : yypt+1]
-               //line go.y:770
+               //line go.y:831
                {
                        yyVAL.node = yyDollar[3].node
                        yyVAL.node.Op = OSWITCH
@@ -1915,13 +1947,13 @@ yydefault:
                }
        case 91:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:780
+               //line go.y:841
                {
                        typesw = Nod(OXXX, typesw, nil)
                }
        case 92:
                yyDollar = yyS[yypt-5 : yypt+1]
-               //line go.y:784
+               //line go.y:845
                {
                        yyVAL.node = Nod(OSELECT, nil, nil)
                        yyVAL.node.Lineno = typesw.Lineno
@@ -1930,133 +1962,133 @@ yydefault:
                }
        case 94:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:797
+               //line go.y:858
                {
                        yyVAL.node = Nod(OOROR, yyDollar[1].node, yyDollar[3].node)
                }
        case 95:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:801
+               //line go.y:862
                {
                        yyVAL.node = Nod(OANDAND, yyDollar[1].node, yyDollar[3].node)
                }
        case 96:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:805
+               //line go.y:866
                {
                        yyVAL.node = Nod(OEQ, yyDollar[1].node, yyDollar[3].node)
                }
        case 97:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:809
+               //line go.y:870
                {
                        yyVAL.node = Nod(ONE, yyDollar[1].node, yyDollar[3].node)
                }
        case 98:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:813
+               //line go.y:874
                {
                        yyVAL.node = Nod(OLT, yyDollar[1].node, yyDollar[3].node)
                }
        case 99:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:817
+               //line go.y:878
                {
                        yyVAL.node = Nod(OLE, yyDollar[1].node, yyDollar[3].node)
                }
        case 100:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:821
+               //line go.y:882
                {
                        yyVAL.node = Nod(OGE, yyDollar[1].node, yyDollar[3].node)
                }
        case 101:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:825
+               //line go.y:886
                {
                        yyVAL.node = Nod(OGT, yyDollar[1].node, yyDollar[3].node)
                }
        case 102:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:829
+               //line go.y:890
                {
                        yyVAL.node = Nod(OADD, yyDollar[1].node, yyDollar[3].node)
                }
        case 103:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:833
+               //line go.y:894
                {
                        yyVAL.node = Nod(OSUB, yyDollar[1].node, yyDollar[3].node)
                }
        case 104:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:837
+               //line go.y:898
                {
                        yyVAL.node = Nod(OOR, yyDollar[1].node, yyDollar[3].node)
                }
        case 105:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:841
+               //line go.y:902
                {
                        yyVAL.node = Nod(OXOR, yyDollar[1].node, yyDollar[3].node)
                }
        case 106:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:845
+               //line go.y:906
                {
                        yyVAL.node = Nod(OMUL, yyDollar[1].node, yyDollar[3].node)
                }
        case 107:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:849
+               //line go.y:910
                {
                        yyVAL.node = Nod(ODIV, yyDollar[1].node, yyDollar[3].node)
                }
        case 108:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:853
+               //line go.y:914
                {
                        yyVAL.node = Nod(OMOD, yyDollar[1].node, yyDollar[3].node)
                }
        case 109:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:857
+               //line go.y:918
                {
                        yyVAL.node = Nod(OAND, yyDollar[1].node, yyDollar[3].node)
                }
        case 110:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:861
+               //line go.y:922
                {
                        yyVAL.node = Nod(OANDNOT, yyDollar[1].node, yyDollar[3].node)
                }
        case 111:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:865
+               //line go.y:926
                {
                        yyVAL.node = Nod(OLSH, yyDollar[1].node, yyDollar[3].node)
                }
        case 112:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:869
+               //line go.y:930
                {
                        yyVAL.node = Nod(ORSH, yyDollar[1].node, yyDollar[3].node)
                }
        case 113:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:874
+               //line go.y:935
                {
                        yyVAL.node = Nod(OSEND, yyDollar[1].node, yyDollar[3].node)
                }
        case 115:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:881
+               //line go.y:942
                {
                        yyVAL.node = Nod(OIND, yyDollar[2].node, nil)
                }
        case 116:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:885
+               //line go.y:946
                {
                        if yyDollar[2].node.Op == OCOMPLIT {
                                // Special case for &T{...}: turn into (*T){...}.
@@ -2069,57 +2101,57 @@ yydefault:
                }
        case 117:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:896
+               //line go.y:957
                {
                        yyVAL.node = Nod(OPLUS, yyDollar[2].node, nil)
                }
        case 118:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:900
+               //line go.y:961
                {
                        yyVAL.node = Nod(OMINUS, yyDollar[2].node, nil)
                }
        case 119:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:904
+               //line go.y:965
                {
                        yyVAL.node = Nod(ONOT, yyDollar[2].node, nil)
                }
        case 120:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:908
+               //line go.y:969
                {
                        Yyerror("the bitwise complement operator is ^")
                        yyVAL.node = Nod(OCOM, yyDollar[2].node, nil)
                }
        case 121:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:913
+               //line go.y:974
                {
                        yyVAL.node = Nod(OCOM, yyDollar[2].node, nil)
                }
        case 122:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:917
+               //line go.y:978
                {
                        yyVAL.node = Nod(ORECV, yyDollar[2].node, nil)
                }
        case 123:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:927
+               //line go.y:988
                {
                        yyVAL.node = Nod(OCALL, yyDollar[1].node, nil)
                }
        case 124:
                yyDollar = yyS[yypt-5 : yypt+1]
-               //line go.y:931
+               //line go.y:992
                {
                        yyVAL.node = Nod(OCALL, yyDollar[1].node, nil)
                        yyVAL.node.List = yyDollar[3].list
                }
        case 125:
                yyDollar = yyS[yypt-6 : yypt+1]
-               //line go.y:936
+               //line go.y:997
                {
                        yyVAL.node = Nod(OCALL, yyDollar[1].node, nil)
                        yyVAL.node.List = yyDollar[3].list
@@ -2127,13 +2159,13 @@ yydefault:
                }
        case 126:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:944
+               //line go.y:1005
                {
                        yyVAL.node = nodlit(yyDollar[1].val)
                }
        case 128:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:949
+               //line go.y:1010
                {
                        if yyDollar[1].node.Op == OPACK {
                                var s *Sym
@@ -2146,31 +2178,31 @@ yydefault:
                }
        case 129:
                yyDollar = yyS[yypt-5 : yypt+1]
-               //line go.y:960
+               //line go.y:1021
                {
                        yyVAL.node = Nod(ODOTTYPE, yyDollar[1].node, yyDollar[4].node)
                }
        case 130:
                yyDollar = yyS[yypt-5 : yypt+1]
-               //line go.y:964
+               //line go.y:1025
                {
                        yyVAL.node = Nod(OTYPESW, nil, yyDollar[1].node)
                }
        case 131:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:968
+               //line go.y:1029
                {
                        yyVAL.node = Nod(OINDEX, yyDollar[1].node, yyDollar[3].node)
                }
        case 132:
                yyDollar = yyS[yypt-6 : yypt+1]
-               //line go.y:972
+               //line go.y:1033
                {
                        yyVAL.node = Nod(OSLICE, yyDollar[1].node, Nod(OKEY, yyDollar[3].node, yyDollar[5].node))
                }
        case 133:
                yyDollar = yyS[yypt-8 : yypt+1]
-               //line go.y:976
+               //line go.y:1037
                {
                        if yyDollar[5].node == nil {
                                Yyerror("middle index required in 3-index slice")
@@ -2182,7 +2214,7 @@ yydefault:
                }
        case 135:
                yyDollar = yyS[yypt-5 : yypt+1]
-               //line go.y:987
+               //line go.y:1048
                {
                        // conversion
                        yyVAL.node = Nod(OCALL, yyDollar[1].node, nil)
@@ -2190,7 +2222,7 @@ yydefault:
                }
        case 136:
                yyDollar = yyS[yypt-5 : yypt+1]
-               //line go.y:993
+               //line go.y:1054
                {
                        yyVAL.node = yyDollar[3].node
                        yyVAL.node.Right = yyDollar[1].node
@@ -2199,7 +2231,7 @@ yydefault:
                }
        case 137:
                yyDollar = yyS[yypt-5 : yypt+1]
-               //line go.y:1000
+               //line go.y:1061
                {
                        yyVAL.node = yyDollar[3].node
                        yyVAL.node.Right = yyDollar[1].node
@@ -2207,7 +2239,7 @@ yydefault:
                }
        case 138:
                yyDollar = yyS[yypt-7 : yypt+1]
-               //line go.y:1006
+               //line go.y:1067
                {
                        Yyerror("cannot parenthesize type in composite literal")
                        yyVAL.node = yyDollar[5].node
@@ -2216,7 +2248,7 @@ yydefault:
                }
        case 140:
                yyDollar = yyS[yypt-0 : yypt+1]
-               //line go.y:1015
+               //line go.y:1076
                {
                        // composite expression.
                        // make node early so we get the right line number.
@@ -2224,13 +2256,13 @@ yydefault:
                }
        case 141:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1023
+               //line go.y:1084
                {
                        yyVAL.node = Nod(OKEY, yyDollar[1].node, yyDollar[3].node)
                }
        case 142:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1029
+               //line go.y:1090
                {
                        // These nodes do not carry line numbers.
                        // Since a composite literal commonly spans several lines,
@@ -2245,21 +2277,21 @@ yydefault:
                }
        case 143:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:1042
+               //line go.y:1103
                {
                        yyVAL.node = yyDollar[2].node
                        yyVAL.node.List = yyDollar[3].list
                }
        case 145:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:1050
+               //line go.y:1111
                {
                        yyVAL.node = yyDollar[2].node
                        yyVAL.node.List = yyDollar[3].list
                }
        case 147:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1058
+               //line go.y:1119
                {
                        yyVAL.node = yyDollar[2].node
 
@@ -2273,19 +2305,19 @@ yydefault:
                }
        case 151:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1079
+               //line go.y:1140
                {
                        yyVAL.i = LBODY
                }
        case 152:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1083
+               //line go.y:1144
                {
                        yyVAL.i = '{'
                }
        case 153:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1094
+               //line go.y:1155
                {
                        if yyDollar[1].sym == nil {
                                yyVAL.node = nil
@@ -2295,19 +2327,19 @@ yydefault:
                }
        case 154:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1104
+               //line go.y:1165
                {
                        yyVAL.node = dclname(yyDollar[1].sym)
                }
        case 155:
                yyDollar = yyS[yypt-0 : yypt+1]
-               //line go.y:1109
+               //line go.y:1170
                {
                        yyVAL.node = nil
                }
        case 157:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1116
+               //line go.y:1177
                {
                        yyVAL.sym = yyDollar[1].sym
                        // during imports, unqualified non-exported identifiers are from builtinpkg
@@ -2317,13 +2349,13 @@ yydefault:
                }
        case 159:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1125
+               //line go.y:1186
                {
                        yyVAL.sym = nil
                }
        case 160:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:1131
+               //line go.y:1192
                {
                        var p *Pkg
 
@@ -2339,7 +2371,7 @@ yydefault:
                }
        case 161:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:1145
+               //line go.y:1206
                {
                        var p *Pkg
 
@@ -2355,7 +2387,7 @@ yydefault:
                }
        case 162:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1161
+               //line go.y:1222
                {
                        yyVAL.node = oldname(yyDollar[1].sym)
                        if yyVAL.node.Pack != nil {
@@ -2364,38 +2396,38 @@ yydefault:
                }
        case 164:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1182
+               //line go.y:1243
                {
                        Yyerror("final argument in variadic function missing type")
                        yyVAL.node = Nod(ODDD, typenod(typ(TINTER)), nil)
                }
        case 165:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:1187
+               //line go.y:1248
                {
                        yyVAL.node = Nod(ODDD, yyDollar[2].node, nil)
                }
        case 171:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1198
+               //line go.y:1259
                {
                        yyVAL.node = yyDollar[2].node
                }
        case 175:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:1207
+               //line go.y:1268
                {
                        yyVAL.node = Nod(OIND, yyDollar[2].node, nil)
                }
        case 180:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1217
+               //line go.y:1278
                {
                        yyVAL.node = yyDollar[2].node
                }
        case 190:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1238
+               //line go.y:1299
                {
                        if yyDollar[1].node.Op == OPACK {
                                var s *Sym
@@ -2408,53 +2440,53 @@ yydefault:
                }
        case 191:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:1251
+               //line go.y:1312
                {
                        yyVAL.node = Nod(OTARRAY, yyDollar[2].node, yyDollar[4].node)
                }
        case 192:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:1255
+               //line go.y:1316
                {
                        // array literal of nelem
                        yyVAL.node = Nod(OTARRAY, Nod(ODDD, nil, nil), yyDollar[4].node)
                }
        case 193:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:1260
+               //line go.y:1321
                {
                        yyVAL.node = Nod(OTCHAN, yyDollar[2].node, nil)
                        yyVAL.node.Etype = Cboth
                }
        case 194:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1265
+               //line go.y:1326
                {
                        yyVAL.node = Nod(OTCHAN, yyDollar[3].node, nil)
                        yyVAL.node.Etype = Csend
                }
        case 195:
                yyDollar = yyS[yypt-5 : yypt+1]
-               //line go.y:1270
+               //line go.y:1331
                {
                        yyVAL.node = Nod(OTMAP, yyDollar[3].node, yyDollar[5].node)
                }
        case 198:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:1278
+               //line go.y:1339
                {
                        yyVAL.node = Nod(OIND, yyDollar[2].node, nil)
                }
        case 199:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1284
+               //line go.y:1345
                {
                        yyVAL.node = Nod(OTCHAN, yyDollar[3].node, nil)
                        yyVAL.node.Etype = Crecv
                }
        case 200:
                yyDollar = yyS[yypt-5 : yypt+1]
-               //line go.y:1291
+               //line go.y:1352
                {
                        yyVAL.node = Nod(OTSTRUCT, nil, nil)
                        yyVAL.node.List = yyDollar[3].list
@@ -2462,14 +2494,14 @@ yydefault:
                }
        case 201:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1297
+               //line go.y:1358
                {
                        yyVAL.node = Nod(OTSTRUCT, nil, nil)
                        fixlbrace(yyDollar[2].i)
                }
        case 202:
                yyDollar = yyS[yypt-5 : yypt+1]
-               //line go.y:1304
+               //line go.y:1365
                {
                        yyVAL.node = Nod(OTINTER, nil, nil)
                        yyVAL.node.List = yyDollar[3].list
@@ -2477,14 +2509,14 @@ yydefault:
                }
        case 203:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1310
+               //line go.y:1371
                {
                        yyVAL.node = Nod(OTINTER, nil, nil)
                        fixlbrace(yyDollar[2].i)
                }
        case 204:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1321
+               //line go.y:1382
                {
                        yyVAL.node = yyDollar[2].node
                        if yyVAL.node == nil {
@@ -2502,7 +2534,7 @@ yydefault:
                }
        case 205:
                yyDollar = yyS[yypt-5 : yypt+1]
-               //line go.y:1339
+               //line go.y:1400
                {
                        var t *Node
 
@@ -2535,7 +2567,7 @@ yydefault:
                }
        case 206:
                yyDollar = yyS[yypt-8 : yypt+1]
-               //line go.y:1370
+               //line go.y:1431
                {
                        var rcvr, t *Node
 
@@ -2573,7 +2605,7 @@ yydefault:
                }
        case 207:
                yyDollar = yyS[yypt-5 : yypt+1]
-               //line go.y:1408
+               //line go.y:1469
                {
                        var s *Sym
                        var t *Type
@@ -2600,7 +2632,7 @@ yydefault:
                }
        case 208:
                yyDollar = yyS[yypt-8 : yypt+1]
-               //line go.y:1433
+               //line go.y:1494
                {
                        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)
@@ -2618,7 +2650,7 @@ yydefault:
                }
        case 209:
                yyDollar = yyS[yypt-5 : yypt+1]
-               //line go.y:1451
+               //line go.y:1512
                {
                        yyDollar[3].list = checkarglist(yyDollar[3].list, 1)
                        yyVAL.node = Nod(OTFUNC, nil, nil)
@@ -2627,13 +2659,13 @@ yydefault:
                }
        case 210:
                yyDollar = yyS[yypt-0 : yypt+1]
-               //line go.y:1459
+               //line go.y:1520
                {
                        yyVAL.list = nil
                }
        case 211:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1463
+               //line go.y:1524
                {
                        yyVAL.list = yyDollar[2].list
                        if yyVAL.list == nil {
@@ -2642,51 +2674,51 @@ yydefault:
                }
        case 212:
                yyDollar = yyS[yypt-0 : yypt+1]
-               //line go.y:1472
+               //line go.y:1533
                {
                        yyVAL.list = nil
                }
        case 213:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1476
+               //line go.y:1537
                {
                        yyVAL.list = list1(Nod(ODCLFIELD, nil, yyDollar[1].node))
                }
        case 214:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1480
+               //line go.y:1541
                {
                        yyDollar[2].list = checkarglist(yyDollar[2].list, 0)
                        yyVAL.list = yyDollar[2].list
                }
        case 215:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1487
+               //line go.y:1548
                {
                        closurehdr(yyDollar[1].node)
                }
        case 216:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:1493
+               //line go.y:1554
                {
                        yyVAL.node = closurebody(yyDollar[3].list)
                        fixlbrace(yyDollar[2].i)
                }
        case 217:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:1498
+               //line go.y:1559
                {
                        yyVAL.node = closurebody(nil)
                }
        case 218:
                yyDollar = yyS[yypt-0 : yypt+1]
-               //line go.y:1509
+               //line go.y:1570
                {
                        yyVAL.list = nil
                }
        case 219:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1513
+               //line go.y:1574
                {
                        yyVAL.list = concat(yyDollar[1].list, yyDollar[2].list)
                        if nsyntaxerrors == 0 {
@@ -2699,49 +2731,49 @@ yydefault:
                }
        case 221:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1527
+               //line go.y:1588
                {
                        yyVAL.list = concat(yyDollar[1].list, yyDollar[3].list)
                }
        case 223:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1534
+               //line go.y:1595
                {
                        yyVAL.list = concat(yyDollar[1].list, yyDollar[3].list)
                }
        case 224:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1540
+               //line go.y:1601
                {
                        yyVAL.list = list1(yyDollar[1].node)
                }
        case 225:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1544
+               //line go.y:1605
                {
                        yyVAL.list = list(yyDollar[1].list, yyDollar[3].node)
                }
        case 227:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1551
+               //line go.y:1612
                {
                        yyVAL.list = concat(yyDollar[1].list, yyDollar[3].list)
                }
        case 228:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1557
+               //line go.y:1618
                {
                        yyVAL.list = list1(yyDollar[1].node)
                }
        case 229:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1561
+               //line go.y:1622
                {
                        yyVAL.list = list(yyDollar[1].list, yyDollar[3].node)
                }
        case 230:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1567
+               //line go.y:1628
                {
                        var l *NodeList
 
@@ -2767,14 +2799,14 @@ yydefault:
                }
        case 231:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:1591
+               //line go.y:1652
                {
                        yyDollar[1].node.Val = yyDollar[2].val
                        yyVAL.list = list1(yyDollar[1].node)
                }
        case 232:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:1596
+               //line go.y:1657
                {
                        yyDollar[2].node.Val = yyDollar[4].val
                        yyVAL.list = list1(yyDollar[2].node)
@@ -2782,7 +2814,7 @@ yydefault:
                }
        case 233:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1602
+               //line go.y:1663
                {
                        yyDollar[2].node.Right = Nod(OIND, yyDollar[2].node.Right, nil)
                        yyDollar[2].node.Val = yyDollar[3].val
@@ -2790,7 +2822,7 @@ yydefault:
                }
        case 234:
                yyDollar = yyS[yypt-5 : yypt+1]
-               //line go.y:1608
+               //line go.y:1669
                {
                        yyDollar[3].node.Right = Nod(OIND, yyDollar[3].node.Right, nil)
                        yyDollar[3].node.Val = yyDollar[5].val
@@ -2799,7 +2831,7 @@ yydefault:
                }
        case 235:
                yyDollar = yyS[yypt-5 : yypt+1]
-               //line go.y:1615
+               //line go.y:1676
                {
                        yyDollar[3].node.Right = Nod(OIND, yyDollar[3].node.Right, nil)
                        yyDollar[3].node.Val = yyDollar[5].val
@@ -2808,7 +2840,7 @@ yydefault:
                }
        case 236:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1624
+               //line go.y:1685
                {
                        var n *Node
 
@@ -2820,7 +2852,7 @@ yydefault:
                }
        case 237:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1634
+               //line go.y:1695
                {
                        var pkg *Pkg
 
@@ -2835,33 +2867,33 @@ yydefault:
                }
        case 238:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1649
+               //line go.y:1710
                {
                        yyVAL.node = embedded(yyDollar[1].sym, localpkg)
                }
        case 239:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:1655
+               //line go.y:1716
                {
                        yyVAL.node = Nod(ODCLFIELD, yyDollar[1].node, yyDollar[2].node)
                        ifacedcl(yyVAL.node)
                }
        case 240:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1660
+               //line go.y:1721
                {
                        yyVAL.node = Nod(ODCLFIELD, nil, oldname(yyDollar[1].sym))
                }
        case 241:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1664
+               //line go.y:1725
                {
                        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:1671
+               //line go.y:1732
                {
                        // without func keyword
                        yyDollar[2].list = checkarglist(yyDollar[2].list, 1)
@@ -2871,7 +2903,7 @@ yydefault:
                }
        case 244:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:1685
+               //line go.y:1746
                {
                        yyVAL.node = Nod(ONONAME, nil, nil)
                        yyVAL.node.Sym = yyDollar[1].sym
@@ -2879,7 +2911,7 @@ yydefault:
                }
        case 245:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:1691
+               //line go.y:1752
                {
                        yyVAL.node = Nod(ONONAME, nil, nil)
                        yyVAL.node.Sym = yyDollar[1].sym
@@ -2887,56 +2919,56 @@ yydefault:
                }
        case 247:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1700
+               //line go.y:1761
                {
                        yyVAL.list = list1(yyDollar[1].node)
                }
        case 248:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1704
+               //line go.y:1765
                {
                        yyVAL.list = list(yyDollar[1].list, yyDollar[3].node)
                }
        case 249:
                yyDollar = yyS[yypt-0 : yypt+1]
-               //line go.y:1709
+               //line go.y:1770
                {
                        yyVAL.list = nil
                }
        case 250:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:1713
+               //line go.y:1774
                {
                        yyVAL.list = yyDollar[1].list
                }
        case 251:
                yyDollar = yyS[yypt-0 : yypt+1]
-               //line go.y:1721
+               //line go.y:1782
                {
                        yyVAL.node = nil
                }
        case 253:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1726
+               //line go.y:1787
                {
                        yyVAL.node = liststmt(yyDollar[1].list)
                }
        case 255:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1731
+               //line go.y:1792
                {
                        yyVAL.node = nil
                }
        case 261:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:1742
+               //line go.y:1803
                {
                        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:1747
+               //line go.y:1808
                {
                        var l *NodeList
 
@@ -2949,7 +2981,7 @@ yydefault:
                }
        case 263:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1758
+               //line go.y:1819
                {
                        // will be converted to OFALL
                        yyVAL.node = Nod(OXFALL, nil, nil)
@@ -2957,38 +2989,38 @@ yydefault:
                }
        case 264:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:1764
+               //line go.y:1825
                {
                        yyVAL.node = Nod(OBREAK, yyDollar[2].node, nil)
                }
        case 265:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:1768
+               //line go.y:1829
                {
                        yyVAL.node = Nod(OCONTINUE, yyDollar[2].node, nil)
                }
        case 266:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:1772
+               //line go.y:1833
                {
                        yyVAL.node = Nod(OPROC, yyDollar[2].node, nil)
                }
        case 267:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:1776
+               //line go.y:1837
                {
                        yyVAL.node = Nod(ODEFER, yyDollar[2].node, nil)
                }
        case 268:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:1780
+               //line go.y:1841
                {
                        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:1785
+               //line go.y:1846
                {
                        yyVAL.node = Nod(ORETURN, nil, nil)
                        yyVAL.node.List = yyDollar[2].list
@@ -3010,7 +3042,7 @@ yydefault:
                }
        case 270:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1807
+               //line go.y:1868
                {
                        yyVAL.list = nil
                        if yyDollar[1].node != nil {
@@ -3019,7 +3051,7 @@ yydefault:
                }
        case 271:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1814
+               //line go.y:1875
                {
                        yyVAL.list = yyDollar[1].list
                        if yyDollar[3].node != nil {
@@ -3028,163 +3060,163 @@ yydefault:
                }
        case 272:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1823
+               //line go.y:1884
                {
                        yyVAL.list = list1(yyDollar[1].node)
                }
        case 273:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1827
+               //line go.y:1888
                {
                        yyVAL.list = list(yyDollar[1].list, yyDollar[3].node)
                }
        case 274:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1833
+               //line go.y:1894
                {
                        yyVAL.list = list1(yyDollar[1].node)
                }
        case 275:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1837
+               //line go.y:1898
                {
                        yyVAL.list = list(yyDollar[1].list, yyDollar[3].node)
                }
        case 276:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1843
+               //line go.y:1904
                {
                        yyVAL.list = list1(yyDollar[1].node)
                }
        case 277:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1847
+               //line go.y:1908
                {
                        yyVAL.list = list(yyDollar[1].list, yyDollar[3].node)
                }
        case 278:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1853
+               //line go.y:1914
                {
                        yyVAL.list = list1(yyDollar[1].node)
                }
        case 279:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1857
+               //line go.y:1918
                {
                        yyVAL.list = list(yyDollar[1].list, yyDollar[3].node)
                }
        case 280:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1866
+               //line go.y:1927
                {
                        yyVAL.list = list1(yyDollar[1].node)
                }
        case 281:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1870
+               //line go.y:1931
                {
                        yyVAL.list = list1(yyDollar[1].node)
                }
        case 282:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1874
+               //line go.y:1935
                {
                        yyVAL.list = list(yyDollar[1].list, yyDollar[3].node)
                }
        case 283:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:1878
+               //line go.y:1939
                {
                        yyVAL.list = list(yyDollar[1].list, yyDollar[3].node)
                }
        case 284:
                yyDollar = yyS[yypt-0 : yypt+1]
-               //line go.y:1883
+               //line go.y:1944
                {
                        yyVAL.list = nil
                }
        case 285:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:1887
+               //line go.y:1948
                {
                        yyVAL.list = yyDollar[1].list
                }
        case 290:
                yyDollar = yyS[yypt-0 : yypt+1]
-               //line go.y:1901
+               //line go.y:1962
                {
                        yyVAL.node = nil
                }
        case 292:
                yyDollar = yyS[yypt-0 : yypt+1]
-               //line go.y:1907
+               //line go.y:1968
                {
                        yyVAL.list = nil
                }
        case 294:
                yyDollar = yyS[yypt-0 : yypt+1]
-               //line go.y:1913
+               //line go.y:1974
                {
                        yyVAL.node = nil
                }
        case 296:
                yyDollar = yyS[yypt-0 : yypt+1]
-               //line go.y:1919
+               //line go.y:1980
                {
                        yyVAL.list = nil
                }
        case 298:
                yyDollar = yyS[yypt-0 : yypt+1]
-               //line go.y:1925
+               //line go.y:1986
                {
                        yyVAL.list = nil
                }
        case 300:
                yyDollar = yyS[yypt-0 : yypt+1]
-               //line go.y:1931
+               //line go.y:1992
                {
                        yyVAL.list = nil
                }
        case 302:
                yyDollar = yyS[yypt-0 : yypt+1]
-               //line go.y:1937
+               //line go.y:1998
                {
                        yyVAL.val.Ctype = CTxxx
                }
        case 304:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:1947
+               //line go.y:2008
                {
                        importimport(yyDollar[2].sym, yyDollar[3].val.U.(string))
                }
        case 305:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:1951
+               //line go.y:2012
                {
                        importvar(yyDollar[2].sym, yyDollar[3].typ)
                }
        case 306:
                yyDollar = yyS[yypt-5 : yypt+1]
-               //line go.y:1955
+               //line go.y:2016
                {
                        importconst(yyDollar[2].sym, Types[TIDEAL], yyDollar[4].node)
                }
        case 307:
                yyDollar = yyS[yypt-6 : yypt+1]
-               //line go.y:1959
+               //line go.y:2020
                {
                        importconst(yyDollar[2].sym, yyDollar[3].typ, yyDollar[5].node)
                }
        case 308:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:1963
+               //line go.y:2024
                {
                        importtype(yyDollar[2].typ, yyDollar[3].typ)
                }
        case 309:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:1967
+               //line go.y:2028
                {
                        if yyDollar[2].node == nil {
                                dclcontext = PEXTERN // since we skip the funcbody below
@@ -3205,27 +3237,27 @@ yydefault:
                }
        case 310:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1988
+               //line go.y:2049
                {
                        yyVAL.sym = yyDollar[1].sym
                        structpkg = yyVAL.sym.Pkg
                }
        case 311:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:1995
+               //line go.y:2056
                {
                        yyVAL.typ = pkgtype(yyDollar[1].sym)
                        importsym(yyDollar[1].sym, OTYPE)
                }
        case 317:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:2015
+               //line go.y:2076
                {
                        yyVAL.typ = pkgtype(yyDollar[1].sym)
                }
        case 318:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:2019
+               //line go.y:2080
                {
                        // predefined name like uint8
                        yyDollar[1].sym = Pkglookup(yyDollar[1].sym.Name, builtinpkg)
@@ -3238,43 +3270,43 @@ yydefault:
                }
        case 319:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:2030
+               //line go.y:2091
                {
                        yyVAL.typ = aindex(nil, yyDollar[3].typ)
                }
        case 320:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:2034
+               //line go.y:2095
                {
                        yyVAL.typ = aindex(nodlit(yyDollar[2].val), yyDollar[4].typ)
                }
        case 321:
                yyDollar = yyS[yypt-5 : yypt+1]
-               //line go.y:2038
+               //line go.y:2099
                {
                        yyVAL.typ = maptype(yyDollar[3].typ, yyDollar[5].typ)
                }
        case 322:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:2042
+               //line go.y:2103
                {
                        yyVAL.typ = tostruct(yyDollar[3].list)
                }
        case 323:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:2046
+               //line go.y:2107
                {
                        yyVAL.typ = tointerface(yyDollar[3].list)
                }
        case 324:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:2050
+               //line go.y:2111
                {
                        yyVAL.typ = Ptrto(yyDollar[2].typ)
                }
        case 325:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:2054
+               //line go.y:2115
                {
                        yyVAL.typ = typ(TCHAN)
                        yyVAL.typ.Type = yyDollar[2].typ
@@ -3282,7 +3314,7 @@ yydefault:
                }
        case 326:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:2060
+               //line go.y:2121
                {
                        yyVAL.typ = typ(TCHAN)
                        yyVAL.typ.Type = yyDollar[3].typ
@@ -3290,7 +3322,7 @@ yydefault:
                }
        case 327:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:2066
+               //line go.y:2127
                {
                        yyVAL.typ = typ(TCHAN)
                        yyVAL.typ.Type = yyDollar[3].typ
@@ -3298,7 +3330,7 @@ yydefault:
                }
        case 328:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:2074
+               //line go.y:2135
                {
                        yyVAL.typ = typ(TCHAN)
                        yyVAL.typ.Type = yyDollar[3].typ
@@ -3306,13 +3338,13 @@ yydefault:
                }
        case 329:
                yyDollar = yyS[yypt-5 : yypt+1]
-               //line go.y:2082
+               //line go.y:2143
                {
                        yyVAL.typ = functype(nil, yyDollar[3].list, yyDollar[5].list)
                }
        case 330:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:2088
+               //line go.y:2149
                {
                        yyVAL.node = Nod(ODCLFIELD, nil, typenod(yyDollar[2].typ))
                        if yyDollar[1].sym != nil {
@@ -3322,7 +3354,7 @@ yydefault:
                }
        case 331:
                yyDollar = yyS[yypt-4 : yypt+1]
-               //line go.y:2096
+               //line go.y:2157
                {
                        var t *Type
 
@@ -3339,7 +3371,7 @@ yydefault:
                }
        case 332:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:2113
+               //line go.y:2174
                {
                        var s *Sym
                        var p *Pkg
@@ -3363,43 +3395,43 @@ yydefault:
                }
        case 333:
                yyDollar = yyS[yypt-5 : yypt+1]
-               //line go.y:2137
+               //line go.y:2198
                {
                        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:2141
+               //line go.y:2202
                {
                        yyVAL.node = Nod(ODCLFIELD, nil, typenod(yyDollar[1].typ))
                }
        case 335:
                yyDollar = yyS[yypt-0 : yypt+1]
-               //line go.y:2146
+               //line go.y:2207
                {
                        yyVAL.list = nil
                }
        case 337:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:2153
+               //line go.y:2214
                {
                        yyVAL.list = yyDollar[2].list
                }
        case 338:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:2157
+               //line go.y:2218
                {
                        yyVAL.list = list1(Nod(ODCLFIELD, nil, typenod(yyDollar[1].typ)))
                }
        case 339:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:2167
+               //line go.y:2228
                {
                        yyVAL.node = nodlit(yyDollar[1].val)
                }
        case 340:
                yyDollar = yyS[yypt-2 : yypt+1]
-               //line go.y:2171
+               //line go.y:2232
                {
                        yyVAL.node = nodlit(yyDollar[2].val)
                        switch yyVAL.node.Val.Ctype {
@@ -3419,7 +3451,7 @@ yydefault:
                }
        case 341:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:2189
+               //line go.y:2250
                {
                        yyVAL.node = oldname(Pkglookup(yyDollar[1].sym.Name, builtinpkg))
                        if yyVAL.node.Op != OLITERAL {
@@ -3428,7 +3460,7 @@ yydefault:
                }
        case 343:
                yyDollar = yyS[yypt-5 : yypt+1]
-               //line go.y:2199
+               //line go.y:2260
                {
                        if yyDollar[2].node.Val.Ctype == CTRUNE && yyDollar[4].node.Val.Ctype == CTINT {
                                yyVAL.node = yyDollar[2].node
@@ -3441,37 +3473,37 @@ yydefault:
                }
        case 346:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:2215
+               //line go.y:2276
                {
                        yyVAL.list = list1(yyDollar[1].node)
                }
        case 347:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:2219
+               //line go.y:2280
                {
                        yyVAL.list = list(yyDollar[1].list, yyDollar[3].node)
                }
        case 348:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:2225
+               //line go.y:2286
                {
                        yyVAL.list = list1(yyDollar[1].node)
                }
        case 349:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:2229
+               //line go.y:2290
                {
                        yyVAL.list = list(yyDollar[1].list, yyDollar[3].node)
                }
        case 350:
                yyDollar = yyS[yypt-1 : yypt+1]
-               //line go.y:2235
+               //line go.y:2296
                {
                        yyVAL.list = list1(yyDollar[1].node)
                }
        case 351:
                yyDollar = yyS[yypt-3 : yypt+1]
-               //line go.y:2239
+               //line go.y:2300
                {
                        yyVAL.list = list(yyDollar[1].list, yyDollar[3].node)
                }
index f105838a7f8cc8fb1cf522c68ef56e79a6ac1bd4..2821702aea92fe0613769229e4fd4b42acca2a61 100644 (file)
@@ -3,7 +3,7 @@ state 0
        $accept: .file $end 
        $$4: .    (4)
 
-       .  reduce 4 (src line 149)
+       .  reduce 4 (src line 210)
 
        file  goto 1
        loadsys  goto 2
@@ -21,7 +21,7 @@ state 2
        package: .    (2)
 
        LPACKAGE  shift 5
-       .  reduce 2 (src line 132)
+       .  reduce 2 (src line 193)
 
        package  goto 4
 
@@ -37,7 +37,7 @@ state 4
        file:  loadsys package.imports xdcl_list 
        imports: .    (6)
 
-       .  reduce 6 (src line 166)
+       .  reduce 6 (src line 227)
 
        imports  goto 8
 
@@ -56,7 +56,7 @@ state 6
        loadsys:  $$4 import_package.import_there 
        $$21: .    (21)
 
-       .  reduce 21 (src line 273)
+       .  reduce 21 (src line 334)
 
        import_there  goto 14
        $$21  goto 15
@@ -74,7 +74,7 @@ state 8
        xdcl_list: .    (218)
 
        LIMPORT  shift 19
-       .  reduce 218 (src line 1508)
+       .  reduce 218 (src line 1569)
 
        xdcl_list  goto 17
        import  goto 18
@@ -89,19 +89,19 @@ state 9
 state 10
        sym:  LNAME.    (157)
 
-       .  reduce 157 (src line 1114)
+       .  reduce 157 (src line 1175)
 
 
 state 11
        sym:  hidden_importsym.    (158)
 
-       .  reduce 158 (src line 1123)
+       .  reduce 158 (src line 1184)
 
 
 state 12
        sym:  '?'.    (159)
 
-       .  reduce 159 (src line 1124)
+       .  reduce 159 (src line 1185)
 
 
 state 13
@@ -115,14 +115,14 @@ state 13
 state 14
        loadsys:  $$4 import_package import_there.    (5)
 
-       .  reduce 5 (src line 160)
+       .  reduce 5 (src line 221)
 
 
 state 15
        import_there:  $$21.hidden_import_list '$' '$' 
        hidden_import_list: .    (344)
 
-       .  reduce 344 (src line 2210)
+       .  reduce 344 (src line 2271)
 
        hidden_import_list  goto 22
 
@@ -131,7 +131,7 @@ state 16
        import_safety: .    (19)
 
        LNAME  shift 24
-       .  reduce 19 (src line 265)
+       .  reduce 19 (src line 326)
 
        import_safety  goto 23
 
@@ -140,7 +140,7 @@ state 17
        xdcl_list:  xdcl_list.xdcl ';' 
        xdcl: .    (23)
 
-       $end  reduce 1 (src line 123)
+       $end  reduce 1 (src line 184)
        error  shift 29
        LLITERAL  shift 68
        LBREAK  shift 41
@@ -170,7 +170,7 @@ state 17
        '*'  shift 58
        '&'  shift 59
        '('  shift 67
-       ';'  reduce 23 (src line 286)
+       ';'  reduce 23 (src line 347)
        '!'  shift 62
        '~'  shift 63
        '['  shift 77
@@ -236,7 +236,7 @@ state 19
 state 20
        package:  LPACKAGE sym ';'.    (3)
 
-       .  reduce 3 (src line 139)
+       .  reduce 3 (src line 200)
 
 
 state 21
@@ -271,7 +271,7 @@ state 23
 state 24
        import_safety:  LNAME.    (20)
 
-       .  reduce 20 (src line 266)
+       .  reduce 20 (src line 327)
 
 
 state 25
@@ -284,25 +284,25 @@ state 25
 state 26
        xdcl:  common_dcl.    (24)
 
-       .  reduce 24 (src line 291)
+       .  reduce 24 (src line 352)
 
 
 state 27
        xdcl:  xfndcl.    (25)
 
-       .  reduce 25 (src line 292)
+       .  reduce 25 (src line 353)
 
 
 state 28
        xdcl:  non_dcl_stmt.    (26)
 
-       .  reduce 26 (src line 296)
+       .  reduce 26 (src line 357)
 
 
 state 29
        xdcl:  error.    (27)
 
-       .  reduce 27 (src line 301)
+       .  reduce 27 (src line 362)
 
 
 state 30
@@ -373,31 +373,31 @@ state 33
 state 34
        non_dcl_stmt:  simple_stmt.    (256)
 
-       .  reduce 256 (src line 1735)
+       .  reduce 256 (src line 1796)
 
 
 state 35
        non_dcl_stmt:  for_stmt.    (257)
 
-       .  reduce 257 (src line 1737)
+       .  reduce 257 (src line 1798)
 
 
 state 36
        non_dcl_stmt:  switch_stmt.    (258)
 
-       .  reduce 258 (src line 1738)
+       .  reduce 258 (src line 1799)
 
 
 state 37
        non_dcl_stmt:  select_stmt.    (259)
 
-       .  reduce 259 (src line 1739)
+       .  reduce 259 (src line 1800)
 
 
 state 38
        non_dcl_stmt:  if_stmt.    (260)
 
-       .  reduce 260 (src line 1740)
+       .  reduce 260 (src line 1801)
 
 
 state 39
@@ -410,7 +410,7 @@ state 39
 state 40
        non_dcl_stmt:  LFALL.    (263)
 
-       .  reduce 263 (src line 1757)
+       .  reduce 263 (src line 1818)
 
 
 state 41
@@ -420,7 +420,7 @@ state 41
        LNAME  shift 10
        '?'  shift 12
        '@'  shift 13
-       .  reduce 155 (src line 1108)
+       .  reduce 155 (src line 1169)
 
        sym  goto 119
        new_name  goto 118
@@ -434,7 +434,7 @@ state 42
        LNAME  shift 10
        '?'  shift 12
        '@'  shift 13
-       .  reduce 155 (src line 1108)
+       .  reduce 155 (src line 1169)
 
        sym  goto 119
        new_name  goto 118
@@ -538,7 +538,7 @@ state 46
        '['  shift 77
        '?'  shift 12
        '@'  shift 13
-       .  reduce 292 (src line 1906)
+       .  reduce 292 (src line 1967)
 
        sym  goto 123
        expr  goto 129
@@ -562,7 +562,7 @@ state 46
 state 47
        lconst:  LCONST.    (38)
 
-       .  reduce 38 (src line 355)
+       .  reduce 38 (src line 416)
 
 
 state 48
@@ -593,7 +593,7 @@ state 48
        expr_list:  expr.    (276)
 
        LASOP  shift 130
-       LCOLAS  reduce 276 (src line 1841)
+       LCOLAS  reduce 276 (src line 1902)
        LANDAND  shift 134
        LANDNOT  shift 149
        LCOMM  shift 152
@@ -616,9 +616,9 @@ state 48
        '/'  shift 146
        '%'  shift 147
        '&'  shift 148
-       '='  reduce 276 (src line 1841)
-       ','  reduce 276 (src line 1841)
-       .  reduce 49 (src line 411)
+       '='  reduce 276 (src line 1902)
+       ','  reduce 276 (src line 1902)
+       .  reduce 49 (src line 472)
 
 
 state 49
@@ -636,7 +636,7 @@ state 50
        for_stmt:  LFOR.$$74 for_body 
        $$74: .    (74)
 
-       .  reduce 74 (src line 660)
+       .  reduce 74 (src line 721)
 
        $$74  goto 156
 
@@ -644,7 +644,7 @@ state 51
        switch_stmt:  LSWITCH.$$88 if_header $$89 LBODY caseblock_list '}' 
        $$88: .    (88)
 
-       .  reduce 88 (src line 755)
+       .  reduce 88 (src line 816)
 
        $$88  goto 157
 
@@ -652,7 +652,7 @@ state 52
        select_stmt:  LSELECT.$$91 LBODY caseblock_list '}' 
        $$91: .    (91)
 
-       .  reduce 91 (src line 778)
+       .  reduce 91 (src line 839)
 
        $$91  goto 158
 
@@ -660,28 +660,28 @@ state 53
        if_stmt:  LIF.$$78 if_header $$79 loop_body $$80 elseif_list else 
        $$78: .    (78)
 
-       .  reduce 78 (src line 689)
+       .  reduce 78 (src line 750)
 
        $$78  goto 159
 
 state 54
        labelname:  new_name.    (163)
 
-       .  reduce 163 (src line 1168)
+       .  reduce 163 (src line 1229)
 
 
 state 55
        expr:  uexpr.    (93)
 
-       .  reduce 93 (src line 794)
+       .  reduce 93 (src line 855)
 
 
 state 56
        new_name:  sym.    (153)
        name:  sym.    (162)
 
-       ':'  reduce 153 (src line 1092)
-       .  reduce 162 (src line 1159)
+       ':'  reduce 153 (src line 1153)
+       .  reduce 162 (src line 1220)
 
 
 state 57
@@ -699,7 +699,7 @@ state 57
        '('  shift 160
        '.'  shift 161
        '['  shift 162
-       .  reduce 114 (src line 878)
+       .  reduce 114 (src line 939)
 
 
 state 58
@@ -1027,7 +1027,7 @@ state 66
        pexpr:  pexpr_no_paren.    (146)
 
        '{'  shift 171
-       .  reduce 146 (src line 1055)
+       .  reduce 146 (src line 1116)
 
 
 state 67
@@ -1078,19 +1078,19 @@ state 67
 state 68
        pexpr_no_paren:  LLITERAL.    (126)
 
-       .  reduce 126 (src line 942)
+       .  reduce 126 (src line 1003)
 
 
 state 69
        pexpr_no_paren:  name.    (127)
 
-       .  reduce 127 (src line 947)
+       .  reduce 127 (src line 1008)
 
 
 state 70
        pexpr_no_paren:  pseudocall.    (134)
 
-       .  reduce 134 (src line 985)
+       .  reduce 134 (src line 1046)
 
 
 state 71
@@ -1112,23 +1112,23 @@ state 72
 state 73
        pexpr_no_paren:  fnliteral.    (139)
 
-       .  reduce 139 (src line 1012)
+       .  reduce 139 (src line 1073)
 
 
 state 74
        convtype:  fntype.    (181)
        fnlitdcl:  fntype.    (215)
 
-       '('  reduce 181 (src line 1221)
-       .  reduce 215 (src line 1485)
+       '('  reduce 181 (src line 1282)
+       .  reduce 215 (src line 1546)
 
 
 state 75
        convtype:  othertype.    (182)
        comptype:  othertype.    (183)
 
-       '('  reduce 182 (src line 1223)
-       .  reduce 183 (src line 1225)
+       '('  reduce 182 (src line 1284)
+       .  reduce 183 (src line 1286)
 
 
 state 76
@@ -1167,7 +1167,7 @@ state 77
        '['  shift 77
        '?'  shift 12
        '@'  shift 13
-       .  reduce 290 (src line 1900)
+       .  reduce 290 (src line 1961)
 
        sym  goto 123
        expr  goto 188
@@ -1226,13 +1226,13 @@ state 79
 state 80
        othertype:  structtype.    (196)
 
-       .  reduce 196 (src line 1273)
+       .  reduce 196 (src line 1334)
 
 
 state 81
        othertype:  interfacetype.    (197)
 
-       .  reduce 197 (src line 1274)
+       .  reduce 197 (src line 1335)
 
 
 state 82
@@ -1258,13 +1258,13 @@ state 83
 state 84
        imports:  imports import ';'.    (7)
 
-       .  reduce 7 (src line 167)
+       .  reduce 7 (src line 228)
 
 
 state 85
        import:  LIMPORT import_stmt.    (8)
 
-       .  reduce 8 (src line 169)
+       .  reduce 8 (src line 230)
 
 
 state 86
@@ -1291,7 +1291,7 @@ state 87
        $$21: .    (21)
 
        LPACKAGE  shift 7
-       .  reduce 21 (src line 273)
+       .  reduce 21 (src line 334)
 
        import_package  goto 204
        import_there  goto 205
@@ -1300,7 +1300,7 @@ state 87
 state 88
        import_here:  LLITERAL.    (15)
 
-       .  reduce 15 (src line 225)
+       .  reduce 15 (src line 286)
 
 
 state 89
@@ -1336,7 +1336,7 @@ state 92
 state 93
        hidden_import_list:  hidden_import_list hidden_import.    (345)
 
-       .  reduce 345 (src line 2211)
+       .  reduce 345 (src line 2272)
 
 
 state 94
@@ -1389,19 +1389,19 @@ state 98
 state 99
        import_package:  LPACKAGE LNAME import_safety ';'.    (18)
 
-       .  reduce 18 (src line 248)
+       .  reduce 18 (src line 309)
 
 
 state 100
        xdcl_list:  xdcl_list xdcl ';'.    (219)
 
-       .  reduce 219 (src line 1512)
+       .  reduce 219 (src line 1573)
 
 
 state 101
        common_dcl:  LVAR vardcl.    (28)
 
-       .  reduce 28 (src line 306)
+       .  reduce 28 (src line 367)
 
 
 state 102
@@ -1458,19 +1458,19 @@ state 103
 state 104
        dcl_name_list:  dcl_name.    (274)
 
-       .  reduce 274 (src line 1831)
+       .  reduce 274 (src line 1892)
 
 
 state 105
        dcl_name:  sym.    (154)
 
-       .  reduce 154 (src line 1102)
+       .  reduce 154 (src line 1163)
 
 
 state 106
        common_dcl:  lconst constdcl.    (31)
 
-       .  reduce 31 (src line 319)
+       .  reduce 31 (src line 380)
 
 
 state 107
@@ -1526,7 +1526,7 @@ state 108
 state 109
        common_dcl:  LTYPE typedcl.    (35)
 
-       .  reduce 35 (src line 342)
+       .  reduce 35 (src line 403)
 
 
 state 110
@@ -1577,7 +1577,7 @@ state 111
 state 112
        typedclname:  sym.    (47)
 
-       .  reduce 47 (src line 396)
+       .  reduce 47 (src line 457)
 
 
 state 113
@@ -1585,7 +1585,7 @@ state 113
        fnbody: .    (210)
 
        '{'  shift 242
-       .  reduce 210 (src line 1458)
+       .  reduce 210 (src line 1519)
 
        fnbody  goto 241
 
@@ -1607,7 +1607,7 @@ state 114
        '['  shift 77
        '?'  shift 12
        '@'  shift 13
-       .  reduce 249 (src line 1708)
+       .  reduce 249 (src line 1769)
 
        sym  goto 247
        ntype  goto 249
@@ -1637,43 +1637,43 @@ state 116
        non_dcl_stmt:  labelname ':'.$$261 stmt 
        $$261: .    (261)
 
-       .  reduce 261 (src line 1741)
+       .  reduce 261 (src line 1802)
 
        $$261  goto 252
 
 state 117
        non_dcl_stmt:  LBREAK onew_name.    (264)
 
-       .  reduce 264 (src line 1763)
+       .  reduce 264 (src line 1824)
 
 
 state 118
        onew_name:  new_name.    (156)
 
-       .  reduce 156 (src line 1112)
+       .  reduce 156 (src line 1173)
 
 
 state 119
        new_name:  sym.    (153)
 
-       .  reduce 153 (src line 1092)
+       .  reduce 153 (src line 1153)
 
 
 state 120
        non_dcl_stmt:  LCONTINUE onew_name.    (265)
 
-       .  reduce 265 (src line 1767)
+       .  reduce 265 (src line 1828)
 
 
 state 121
        pexpr_no_paren:  pseudocall.    (134)
        non_dcl_stmt:  LGO pseudocall.    (266)
 
-       '('  reduce 134 (src line 985)
-       '.'  reduce 134 (src line 985)
-       '{'  reduce 134 (src line 985)
-       '['  reduce 134 (src line 985)
-       .  reduce 266 (src line 1771)
+       '('  reduce 134 (src line 1046)
+       '.'  reduce 134 (src line 1046)
+       '{'  reduce 134 (src line 1046)
+       '['  reduce 134 (src line 1046)
+       .  reduce 266 (src line 1832)
 
 
 state 122
@@ -1696,7 +1696,7 @@ state 122
 state 123
        name:  sym.    (162)
 
-       .  reduce 162 (src line 1159)
+       .  reduce 162 (src line 1220)
 
 
 state 124
@@ -1710,23 +1710,23 @@ state 125
        pexpr_no_paren:  pseudocall.    (134)
        non_dcl_stmt:  LDEFER pseudocall.    (267)
 
-       '('  reduce 134 (src line 985)
-       '.'  reduce 134 (src line 985)
-       '{'  reduce 134 (src line 985)
-       '['  reduce 134 (src line 985)
-       .  reduce 267 (src line 1775)
+       '('  reduce 134 (src line 1046)
+       '.'  reduce 134 (src line 1046)
+       '{'  reduce 134 (src line 1046)
+       '['  reduce 134 (src line 1046)
+       .  reduce 267 (src line 1836)
 
 
 state 126
        non_dcl_stmt:  LGOTO new_name.    (268)
 
-       .  reduce 268 (src line 1779)
+       .  reduce 268 (src line 1840)
 
 
 state 127
        non_dcl_stmt:  LRETURN oexpr_list.    (269)
 
-       .  reduce 269 (src line 1784)
+       .  reduce 269 (src line 1845)
 
 
 state 128
@@ -1734,7 +1734,7 @@ state 128
        oexpr_list:  expr_list.    (293)
 
        ','  shift 155
-       .  reduce 293 (src line 1910)
+       .  reduce 293 (src line 1971)
 
 
 state 129
@@ -1780,7 +1780,7 @@ state 129
        '/'  shift 146
        '%'  shift 147
        '&'  shift 148
-       .  reduce 276 (src line 1841)
+       .  reduce 276 (src line 1902)
 
 
 state 130
@@ -1827,13 +1827,13 @@ state 130
 state 131
        simple_stmt:  expr LINC.    (53)
 
-       .  reduce 53 (src line 461)
+       .  reduce 53 (src line 522)
 
 
 state 132
        simple_stmt:  expr LDEC.    (54)
 
-       .  reduce 54 (src line 467)
+       .  reduce 54 (src line 528)
 
 
 state 133
@@ -2805,7 +2805,7 @@ state 156
        '['  shift 77
        '?'  shift 12
        '@'  shift 13
-       .  reduce 294 (src line 1912)
+       .  reduce 294 (src line 1973)
 
        sym  goto 123
        expr  goto 48
@@ -2853,7 +2853,7 @@ state 157
        '['  shift 77
        '?'  shift 12
        '@'  shift 13
-       .  reduce 294 (src line 1912)
+       .  reduce 294 (src line 1973)
 
        sym  goto 123
        expr  goto 48
@@ -2906,7 +2906,7 @@ state 159
        '['  shift 77
        '?'  shift 12
        '@'  shift 13
-       .  reduce 294 (src line 1912)
+       .  reduce 294 (src line 1973)
 
        sym  goto 123
        expr  goto 48
@@ -3016,7 +3016,7 @@ state 162
        '['  shift 77
        '?'  shift 12
        '@'  shift 13
-       .  reduce 290 (src line 1900)
+       .  reduce 290 (src line 1961)
 
        sym  goto 123
        expr  goto 294
@@ -3039,56 +3039,56 @@ state 162
 state 163
        uexpr:  '*' uexpr.    (115)
 
-       .  reduce 115 (src line 880)
+       .  reduce 115 (src line 941)
 
 
 state 164
        uexpr:  '&' uexpr.    (116)
 
-       .  reduce 116 (src line 884)
+       .  reduce 116 (src line 945)
 
 
 state 165
        uexpr:  '+' uexpr.    (117)
 
-       .  reduce 117 (src line 895)
+       .  reduce 117 (src line 956)
 
 
 state 166
        uexpr:  '-' uexpr.    (118)
 
-       .  reduce 118 (src line 899)
+       .  reduce 118 (src line 960)
 
 
 state 167
        uexpr:  '!' uexpr.    (119)
 
-       .  reduce 119 (src line 903)
+       .  reduce 119 (src line 964)
 
 
 state 168
        uexpr:  '~' uexpr.    (120)
 
-       .  reduce 120 (src line 907)
+       .  reduce 120 (src line 968)
 
 
 state 169
        uexpr:  '^' uexpr.    (121)
 
-       .  reduce 121 (src line 912)
+       .  reduce 121 (src line 973)
 
 
 state 170
        uexpr:  LCOMM uexpr.    (122)
 
-       .  reduce 122 (src line 916)
+       .  reduce 122 (src line 977)
 
 
 state 171
        pexpr_no_paren:  pexpr_no_paren '{'.start_complit braced_keyval_list '}' 
        start_complit: .    (140)
 
-       .  reduce 140 (src line 1014)
+       .  reduce 140 (src line 1075)
 
        start_complit  goto 296
 
@@ -3143,19 +3143,19 @@ state 173
        '/'  shift 146
        '%'  shift 147
        '&'  shift 148
-       .  reduce 148 (src line 1070)
+       .  reduce 148 (src line 1131)
 
 
 state 174
        expr_or_type:  non_expr_type.    (149)
 
-       .  reduce 149 (src line 1072)
+       .  reduce 149 (src line 1133)
 
 
 state 175
        non_expr_type:  recvchantype.    (172)
 
-       .  reduce 172 (src line 1202)
+       .  reduce 172 (src line 1263)
 
 
 state 176
@@ -3163,11 +3163,11 @@ state 176
        convtype:  fntype.    (181)
        fnlitdcl:  fntype.    (215)
 
-       error  reduce 215 (src line 1485)
-       LBODY  reduce 215 (src line 1485)
-       '('  reduce 181 (src line 1221)
-       '{'  reduce 215 (src line 1485)
-       .  reduce 173 (src line 1204)
+       error  reduce 215 (src line 1546)
+       LBODY  reduce 215 (src line 1546)
+       '('  reduce 181 (src line 1282)
+       '{'  reduce 215 (src line 1546)
+       .  reduce 173 (src line 1265)
 
 
 state 177
@@ -3175,10 +3175,10 @@ state 177
        convtype:  othertype.    (182)
        comptype:  othertype.    (183)
 
-       LBODY  reduce 183 (src line 1225)
-       '('  reduce 182 (src line 1223)
-       '{'  reduce 183 (src line 1225)
-       .  reduce 174 (src line 1205)
+       LBODY  reduce 183 (src line 1286)
+       '('  reduce 182 (src line 1284)
+       '{'  reduce 183 (src line 1286)
+       .  reduce 174 (src line 1266)
 
 
 state 178
@@ -3310,20 +3310,20 @@ state 181
        pexpr_no_paren:  comptype lbrace.start_complit braced_keyval_list '}' 
        start_complit: .    (140)
 
-       .  reduce 140 (src line 1014)
+       .  reduce 140 (src line 1075)
 
        start_complit  goto 301
 
 state 182
        lbrace:  LBODY.    (151)
 
-       .  reduce 151 (src line 1077)
+       .  reduce 151 (src line 1138)
 
 
 state 183
        lbrace:  '{'.    (152)
 
-       .  reduce 152 (src line 1082)
+       .  reduce 152 (src line 1143)
 
 
 state 184
@@ -3359,9 +3359,9 @@ state 184
        '*'  shift 58
        '&'  shift 59
        '('  shift 67
-       ';'  reduce 251 (src line 1720)
+       ';'  reduce 251 (src line 1781)
        '{'  shift 308
-       '}'  reduce 251 (src line 1720)
+       '}'  reduce 251 (src line 1781)
        '!'  shift 62
        '~'  shift 63
        '['  shift 77
@@ -3403,7 +3403,7 @@ state 184
 state 185
        fnliteral:  fnlitdcl error.    (217)
 
-       .  reduce 217 (src line 1497)
+       .  reduce 217 (src line 1558)
 
 
 state 186
@@ -3463,13 +3463,13 @@ state 188
        '/'  shift 146
        '%'  shift 147
        '&'  shift 148
-       .  reduce 291 (src line 1904)
+       .  reduce 291 (src line 1965)
 
 
 state 189
        othertype:  LCHAN non_recvchantype.    (193)
 
-       .  reduce 193 (src line 1259)
+       .  reduce 193 (src line 1320)
 
 
 state 190
@@ -3504,25 +3504,25 @@ state 190
 state 191
        non_recvchantype:  fntype.    (176)
 
-       .  reduce 176 (src line 1211)
+       .  reduce 176 (src line 1272)
 
 
 state 192
        non_recvchantype:  othertype.    (177)
 
-       .  reduce 177 (src line 1213)
+       .  reduce 177 (src line 1274)
 
 
 state 193
        non_recvchantype:  ptrtype.    (178)
 
-       .  reduce 178 (src line 1214)
+       .  reduce 178 (src line 1275)
 
 
 state 194
        non_recvchantype:  dotname.    (179)
 
-       .  reduce 179 (src line 1215)
+       .  reduce 179 (src line 1276)
 
 
 state 195
@@ -3588,7 +3588,7 @@ state 197
        dotname:  name.'.' sym 
 
        '.'  shift 314
-       .  reduce 189 (src line 1235)
+       .  reduce 189 (src line 1296)
 
 
 state 198
@@ -3665,27 +3665,27 @@ state 201
        osemi: .    (286)
 
        ';'  shift 333
-       .  reduce 286 (src line 1894)
+       .  reduce 286 (src line 1955)
 
        osemi  goto 332
 
 state 202
        import:  LIMPORT '(' ')'.    (10)
 
-       .  reduce 10 (src line 172)
+       .  reduce 10 (src line 233)
 
 
 state 203
        import_stmt_list:  import_stmt.    (13)
 
-       .  reduce 13 (src line 221)
+       .  reduce 13 (src line 282)
 
 
 state 204
        import_stmt:  import_here import_package.import_there 
        $$21: .    (21)
 
-       .  reduce 21 (src line 273)
+       .  reduce 21 (src line 334)
 
        import_there  goto 334
        $$21  goto 15
@@ -3693,37 +3693,37 @@ state 204
 state 205
        import_stmt:  import_here import_there.    (12)
 
-       .  reduce 12 (src line 210)
+       .  reduce 12 (src line 271)
 
 
 state 206
        import_here:  sym LLITERAL.    (16)
 
-       .  reduce 16 (src line 233)
+       .  reduce 16 (src line 294)
 
 
 state 207
        import_here:  '.' LLITERAL.    (17)
 
-       .  reduce 17 (src line 240)
+       .  reduce 17 (src line 301)
 
 
 state 208
        hidden_importsym:  '@' LLITERAL '.' LNAME.    (160)
 
-       .  reduce 160 (src line 1129)
+       .  reduce 160 (src line 1190)
 
 
 state 209
        hidden_importsym:  '@' LLITERAL '.' '?'.    (161)
 
-       .  reduce 161 (src line 1144)
+       .  reduce 161 (src line 1205)
 
 
 state 210
        import_there:  $$21 hidden_import_list '$' '$'.    (22)
 
-       .  reduce 22 (src line 277)
+       .  reduce 22 (src line 338)
 
 
 state 211
@@ -3757,7 +3757,7 @@ state 212
 state 213
        hidden_pkg_importsym:  hidden_importsym.    (310)
 
-       .  reduce 310 (src line 1986)
+       .  reduce 310 (src line 2047)
 
 
 state 214
@@ -3807,7 +3807,7 @@ state 215
 state 216
        hidden_pkgtype:  hidden_pkg_importsym.    (311)
 
-       .  reduce 311 (src line 1993)
+       .  reduce 311 (src line 2054)
 
 
 state 217
@@ -3815,7 +3815,7 @@ state 217
        fnbody: .    (210)
 
        '{'  shift 242
-       .  reduce 210 (src line 1458)
+       .  reduce 210 (src line 1519)
 
        fnbody  goto 353
 
@@ -3845,20 +3845,20 @@ state 220
        osemi: .    (286)
 
        ';'  shift 359
-       .  reduce 286 (src line 1894)
+       .  reduce 286 (src line 1955)
 
        osemi  goto 358
 
 state 221
        common_dcl:  LVAR '(' ')'.    (30)
 
-       .  reduce 30 (src line 315)
+       .  reduce 30 (src line 376)
 
 
 state 222
        vardcl_list:  vardcl.    (220)
 
-       .  reduce 220 (src line 1524)
+       .  reduce 220 (src line 1585)
 
 
 state 223
@@ -3866,7 +3866,7 @@ state 223
        vardcl:  dcl_name_list ntype.'=' expr_list 
 
        '='  shift 360
-       .  reduce 39 (src line 361)
+       .  reduce 39 (src line 422)
 
 
 state 224
@@ -3926,31 +3926,31 @@ state 225
 state 226
        ntype:  recvchantype.    (166)
 
-       .  reduce 166 (src line 1191)
+       .  reduce 166 (src line 1252)
 
 
 state 227
        ntype:  fntype.    (167)
 
-       .  reduce 167 (src line 1193)
+       .  reduce 167 (src line 1254)
 
 
 state 228
        ntype:  othertype.    (168)
 
-       .  reduce 168 (src line 1194)
+       .  reduce 168 (src line 1255)
 
 
 state 229
        ntype:  ptrtype.    (169)
 
-       .  reduce 169 (src line 1195)
+       .  reduce 169 (src line 1256)
 
 
 state 230
        ntype:  dotname.    (170)
 
-       .  reduce 170 (src line 1196)
+       .  reduce 170 (src line 1257)
 
 
 state 231
@@ -3995,14 +3995,14 @@ state 233
        osemi: .    (286)
 
        ';'  shift 366
-       .  reduce 286 (src line 1894)
+       .  reduce 286 (src line 1955)
 
        osemi  goto 365
 
 state 234
        common_dcl:  lconst '(' ')'.    (34)
 
-       .  reduce 34 (src line 337)
+       .  reduce 34 (src line 398)
 
 
 state 235
@@ -4060,32 +4060,32 @@ state 237
        osemi: .    (286)
 
        ';'  shift 370
-       .  reduce 286 (src line 1894)
+       .  reduce 286 (src line 1955)
 
        osemi  goto 369
 
 state 238
        common_dcl:  LTYPE '(' ')'.    (37)
 
-       .  reduce 37 (src line 350)
+       .  reduce 37 (src line 411)
 
 
 state 239
        typedcl_list:  typedcl.    (224)
 
-       .  reduce 224 (src line 1538)
+       .  reduce 224 (src line 1599)
 
 
 state 240
        typedcl:  typedclname ntype.    (48)
 
-       .  reduce 48 (src line 405)
+       .  reduce 48 (src line 466)
 
 
 state 241
        xfndcl:  LFUNC fndcl fnbody.    (204)
 
-       .  reduce 204 (src line 1319)
+       .  reduce 204 (src line 1380)
 
 
 state 242
@@ -4121,9 +4121,9 @@ state 242
        '*'  shift 58
        '&'  shift 59
        '('  shift 67
-       ';'  reduce 251 (src line 1720)
+       ';'  reduce 251 (src line 1781)
        '{'  shift 308
-       '}'  reduce 251 (src line 1720)
+       '}'  reduce 251 (src line 1781)
        '!'  shift 62
        '~'  shift 63
        '['  shift 77
@@ -4176,20 +4176,20 @@ state 244
        ocomma: .    (288)
 
        ','  shift 373
-       .  reduce 288 (src line 1897)
+       .  reduce 288 (src line 1958)
 
        ocomma  goto 374
 
 state 245
        arg_type_list:  arg_type.    (247)
 
-       .  reduce 247 (src line 1698)
+       .  reduce 247 (src line 1759)
 
 
 state 246
        arg_type:  name_or_type.    (243)
 
-       .  reduce 243 (src line 1682)
+       .  reduce 243 (src line 1743)
 
 
 state 247
@@ -4210,7 +4210,7 @@ state 247
        '['  shift 77
        '?'  shift 12
        '@'  shift 13
-       .  reduce 162 (src line 1159)
+       .  reduce 162 (src line 1220)
 
        sym  goto 123
        ntype  goto 249
@@ -4229,13 +4229,13 @@ state 247
 state 248
        arg_type:  dotdotdot.    (246)
 
-       .  reduce 246 (src line 1696)
+       .  reduce 246 (src line 1757)
 
 
 state 249
        name_or_type:  ntype.    (150)
 
-       .  reduce 150 (src line 1074)
+       .  reduce 150 (src line 1135)
 
 
 state 250
@@ -4254,7 +4254,7 @@ state 250
        '['  shift 77
        '?'  shift 12
        '@'  shift 13
-       .  reduce 164 (src line 1180)
+       .  reduce 164 (src line 1241)
 
        sym  goto 123
        ntype  goto 377
@@ -4285,7 +4285,7 @@ state 251
        '['  shift 77
        '?'  shift 12
        '@'  shift 13
-       .  reduce 249 (src line 1708)
+       .  reduce 249 (src line 1769)
 
        sym  goto 247
        ntype  goto 249
@@ -4311,11 +4311,11 @@ state 252
        error  shift 307
        LLITERAL  shift 68
        LBREAK  shift 41
-       LCASE  reduce 251 (src line 1720)
+       LCASE  reduce 251 (src line 1781)
        LCHAN  shift 78
        LCONST  shift 47
        LCONTINUE  shift 42
-       LDEFAULT  reduce 251 (src line 1720)
+       LDEFAULT  reduce 251 (src line 1781)
        LDEFER  shift 44
        LFALL  shift 40
        LFOR  shift 50
@@ -4339,9 +4339,9 @@ state 252
        '*'  shift 58
        '&'  shift 59
        '('  shift 67
-       ';'  reduce 251 (src line 1720)
+       ';'  reduce 251 (src line 1781)
        '{'  shift 308
-       '}'  reduce 251 (src line 1720)
+       '}'  reduce 251 (src line 1781)
        '!'  shift 62
        '~'  shift 63
        '['  shift 77
@@ -4396,7 +4396,7 @@ state 253
        '['  shift 77
        '?'  shift 12
        '@'  shift 13
-       .  reduce 249 (src line 1708)
+       .  reduce 249 (src line 1769)
 
        sym  goto 247
        ntype  goto 249
@@ -4458,7 +4458,7 @@ state 254
        '/'  shift 146
        '%'  shift 147
        '&'  shift 148
-       .  reduce 50 (src line 426)
+       .  reduce 50 (src line 487)
 
 
 state 255
@@ -4502,7 +4502,7 @@ state 255
        '/'  shift 146
        '%'  shift 147
        '&'  shift 148
-       .  reduce 94 (src line 796)
+       .  reduce 94 (src line 857)
 
 
 state 256
@@ -4545,7 +4545,7 @@ state 256
        '/'  shift 146
        '%'  shift 147
        '&'  shift 148
-       .  reduce 95 (src line 800)
+       .  reduce 95 (src line 861)
 
 
 state 257
@@ -4582,7 +4582,7 @@ state 257
        '/'  shift 146
        '%'  shift 147
        '&'  shift 148
-       .  reduce 96 (src line 804)
+       .  reduce 96 (src line 865)
 
 
 state 258
@@ -4619,7 +4619,7 @@ state 258
        '/'  shift 146
        '%'  shift 147
        '&'  shift 148
-       .  reduce 97 (src line 808)
+       .  reduce 97 (src line 869)
 
 
 state 259
@@ -4656,7 +4656,7 @@ state 259
        '/'  shift 146
        '%'  shift 147
        '&'  shift 148
-       .  reduce 98 (src line 812)
+       .  reduce 98 (src line 873)
 
 
 state 260
@@ -4693,7 +4693,7 @@ state 260
        '/'  shift 146
        '%'  shift 147
        '&'  shift 148
-       .  reduce 99 (src line 816)
+       .  reduce 99 (src line 877)
 
 
 state 261
@@ -4730,7 +4730,7 @@ state 261
        '/'  shift 146
        '%'  shift 147
        '&'  shift 148
-       .  reduce 100 (src line 820)
+       .  reduce 100 (src line 881)
 
 
 state 262
@@ -4767,7 +4767,7 @@ state 262
        '/'  shift 146
        '%'  shift 147
        '&'  shift 148
-       .  reduce 101 (src line 824)
+       .  reduce 101 (src line 885)
 
 
 state 263
@@ -4800,7 +4800,7 @@ state 263
        '/'  shift 146
        '%'  shift 147
        '&'  shift 148
-       .  reduce 102 (src line 828)
+       .  reduce 102 (src line 889)
 
 
 state 264
@@ -4833,7 +4833,7 @@ state 264
        '/'  shift 146
        '%'  shift 147
        '&'  shift 148
-       .  reduce 103 (src line 832)
+       .  reduce 103 (src line 893)
 
 
 state 265
@@ -4866,7 +4866,7 @@ state 265
        '/'  shift 146
        '%'  shift 147
        '&'  shift 148
-       .  reduce 104 (src line 836)
+       .  reduce 104 (src line 897)
 
 
 state 266
@@ -4899,7 +4899,7 @@ state 266
        '/'  shift 146
        '%'  shift 147
        '&'  shift 148
-       .  reduce 105 (src line 840)
+       .  reduce 105 (src line 901)
 
 
 state 267
@@ -4925,7 +4925,7 @@ state 267
        expr:  expr.LRSH expr 
        expr:  expr.LCOMM expr 
 
-       .  reduce 106 (src line 844)
+       .  reduce 106 (src line 905)
 
 
 state 268
@@ -4951,7 +4951,7 @@ state 268
        expr:  expr.LRSH expr 
        expr:  expr.LCOMM expr 
 
-       .  reduce 107 (src line 848)
+       .  reduce 107 (src line 909)
 
 
 state 269
@@ -4977,7 +4977,7 @@ state 269
        expr:  expr.LRSH expr 
        expr:  expr.LCOMM expr 
 
-       .  reduce 108 (src line 852)
+       .  reduce 108 (src line 913)
 
 
 state 270
@@ -5003,7 +5003,7 @@ state 270
        expr:  expr.LRSH expr 
        expr:  expr.LCOMM expr 
 
-       .  reduce 109 (src line 856)
+       .  reduce 109 (src line 917)
 
 
 state 271
@@ -5029,7 +5029,7 @@ state 271
        expr:  expr.LRSH expr 
        expr:  expr.LCOMM expr 
 
-       .  reduce 110 (src line 860)
+       .  reduce 110 (src line 921)
 
 
 state 272
@@ -5055,7 +5055,7 @@ state 272
        expr:  expr.LRSH expr 
        expr:  expr.LCOMM expr 
 
-       .  reduce 111 (src line 864)
+       .  reduce 111 (src line 925)
 
 
 state 273
@@ -5081,7 +5081,7 @@ state 273
        expr:  expr LRSH expr.    (112)
        expr:  expr.LCOMM expr 
 
-       .  reduce 112 (src line 868)
+       .  reduce 112 (src line 929)
 
 
 state 274
@@ -5126,7 +5126,7 @@ state 274
        '/'  shift 146
        '%'  shift 147
        '&'  shift 148
-       .  reduce 113 (src line 873)
+       .  reduce 113 (src line 934)
 
 
 state 275
@@ -5134,7 +5134,7 @@ state 275
        expr_list:  expr_list.',' expr 
 
        ','  shift 155
-       .  reduce 51 (src line 431)
+       .  reduce 51 (src line 492)
 
 
 state 276
@@ -5142,7 +5142,7 @@ state 276
        expr_list:  expr_list.',' expr 
 
        ','  shift 155
-       .  reduce 52 (src line 443)
+       .  reduce 52 (src line 504)
 
 
 state 277
@@ -5188,13 +5188,13 @@ state 277
        '/'  shift 146
        '%'  shift 147
        '&'  shift 148
-       .  reduce 277 (src line 1846)
+       .  reduce 277 (src line 1907)
 
 
 state 278
        for_stmt:  LFOR $$74 for_body.    (75)
 
-       .  reduce 75 (src line 665)
+       .  reduce 75 (src line 726)
 
 
 state 279
@@ -5210,19 +5210,19 @@ state 280
        for_header:  osimple_stmt.    (71)
 
        ';'  shift 383
-       .  reduce 71 (src line 645)
+       .  reduce 71 (src line 706)
 
 
 state 281
        for_header:  range_stmt.    (72)
 
-       .  reduce 72 (src line 651)
+       .  reduce 72 (src line 712)
 
 
 state 282
        osimple_stmt:  simple_stmt.    (295)
 
-       .  reduce 295 (src line 1916)
+       .  reduce 295 (src line 1977)
 
 
 state 283
@@ -5283,7 +5283,7 @@ state 285
        switch_stmt:  LSWITCH $$88 if_header.$$89 LBODY caseblock_list '}' 
        $$89: .    (89)
 
-       .  reduce 89 (src line 760)
+       .  reduce 89 (src line 821)
 
        $$89  goto 387
 
@@ -5292,14 +5292,14 @@ state 286
        if_header:  osimple_stmt.';' osimple_stmt 
 
        ';'  shift 388
-       .  reduce 76 (src line 671)
+       .  reduce 76 (src line 732)
 
 
 state 287
        select_stmt:  LSELECT $$91 LBODY.caseblock_list '}' 
        caseblock_list: .    (63)
 
-       .  reduce 63 (src line 591)
+       .  reduce 63 (src line 652)
 
        caseblock_list  goto 389
 
@@ -5307,14 +5307,14 @@ state 288
        if_stmt:  LIF $$78 if_header.$$79 loop_body $$80 elseif_list else 
        $$79: .    (79)
 
-       .  reduce 79 (src line 694)
+       .  reduce 79 (src line 755)
 
        $$79  goto 390
 
 state 289
        pseudocall:  pexpr '(' ')'.    (123)
 
-       .  reduce 123 (src line 925)
+       .  reduce 123 (src line 986)
 
 
 state 290
@@ -5325,20 +5325,20 @@ state 290
 
        LDDD  shift 392
        ','  shift 393
-       .  reduce 288 (src line 1897)
+       .  reduce 288 (src line 1958)
 
        ocomma  goto 391
 
 state 291
        expr_or_type_list:  expr_or_type.    (278)
 
-       .  reduce 278 (src line 1851)
+       .  reduce 278 (src line 1912)
 
 
 state 292
        pexpr_no_paren:  pexpr '.' sym.    (128)
 
-       .  reduce 128 (src line 948)
+       .  reduce 128 (src line 1009)
 
 
 state 293
@@ -5432,7 +5432,7 @@ state 294
        '%'  shift 147
        '&'  shift 148
        ']'  shift 396
-       .  reduce 291 (src line 1904)
+       .  reduce 291 (src line 1965)
 
 
 state 295
@@ -5467,7 +5467,7 @@ state 296
        '['  shift 77
        '?'  shift 12
        '@'  shift 13
-       .  reduce 284 (src line 1882)
+       .  reduce 284 (src line 1943)
 
        sym  goto 123
        expr  goto 402
@@ -5495,13 +5495,13 @@ state 297
        pexpr:  '(' expr_or_type ')'.    (147)
 
        '{'  shift 404
-       .  reduce 147 (src line 1057)
+       .  reduce 147 (src line 1118)
 
 
 state 298
        non_expr_type:  '*' non_expr_type.    (175)
 
-       .  reduce 175 (src line 1206)
+       .  reduce 175 (src line 1267)
 
 
 state 299
@@ -5581,7 +5581,7 @@ state 300
        '%'  shift 147
        '&'  shift 148
        ','  shift 413
-       .  reduce 288 (src line 1897)
+       .  reduce 288 (src line 1958)
 
        ocomma  goto 412
 
@@ -5609,7 +5609,7 @@ state 301
        '['  shift 77
        '?'  shift 12
        '@'  shift 13
-       .  reduce 284 (src line 1882)
+       .  reduce 284 (src line 1943)
 
        sym  goto 123
        expr  goto 402
@@ -5644,38 +5644,38 @@ state 302
 state 303
        stmt_list:  stmt.    (270)
 
-       .  reduce 270 (src line 1805)
+       .  reduce 270 (src line 1866)
 
 
 state 304
        stmt:  compound_stmt.    (252)
 
-       .  reduce 252 (src line 1724)
+       .  reduce 252 (src line 1785)
 
 
 state 305
        stmt:  common_dcl.    (253)
 
-       .  reduce 253 (src line 1725)
+       .  reduce 253 (src line 1786)
 
 
 state 306
        stmt:  non_dcl_stmt.    (254)
 
-       .  reduce 254 (src line 1729)
+       .  reduce 254 (src line 1790)
 
 
 state 307
        stmt:  error.    (255)
 
-       .  reduce 255 (src line 1730)
+       .  reduce 255 (src line 1791)
 
 
 state 308
        compound_stmt:  '{'.$$59 stmt_list '}' 
        $$59: .    (59)
 
-       .  reduce 59 (src line 545)
+       .  reduce 59 (src line 606)
 
        $$59  goto 417
 
@@ -5740,7 +5740,7 @@ state 310
 state 311
        othertype:  LCHAN LCOMM ntype.    (194)
 
-       .  reduce 194 (src line 1264)
+       .  reduce 194 (src line 1325)
 
 
 state 312
@@ -5753,7 +5753,7 @@ state 312
 state 313
        ptrtype:  '*' ntype.    (198)
 
-       .  reduce 198 (src line 1276)
+       .  reduce 198 (src line 1337)
 
 
 state 314
@@ -5780,20 +5780,20 @@ state 316
        osemi: .    (286)
 
        ';'  shift 424
-       .  reduce 286 (src line 1894)
+       .  reduce 286 (src line 1955)
 
        osemi  goto 423
 
 state 317
        structtype:  LSTRUCT lbrace '}'.    (201)
 
-       .  reduce 201 (src line 1296)
+       .  reduce 201 (src line 1357)
 
 
 state 318
        structdcl_list:  structdcl.    (226)
 
-       .  reduce 226 (src line 1548)
+       .  reduce 226 (src line 1609)
 
 
 state 319
@@ -5832,7 +5832,7 @@ state 320
        oliteral: .    (302)
 
        LLITERAL  shift 428
-       .  reduce 302 (src line 1936)
+       .  reduce 302 (src line 1997)
 
        oliteral  goto 427
 
@@ -5861,13 +5861,13 @@ state 322
 state 323
        new_name_list:  new_name.    (272)
 
-       .  reduce 272 (src line 1821)
+       .  reduce 272 (src line 1882)
 
 
 state 324
        embed:  packname.    (238)
 
-       .  reduce 238 (src line 1647)
+       .  reduce 238 (src line 1708)
 
 
 state 325
@@ -5875,11 +5875,11 @@ state 325
        packname:  LNAME.    (236)
        packname:  LNAME.'.' sym 
 
-       LLITERAL  reduce 236 (src line 1622)
-       ';'  reduce 236 (src line 1622)
+       LLITERAL  reduce 236 (src line 1683)
+       ';'  reduce 236 (src line 1683)
        '.'  shift 434
-       '}'  reduce 236 (src line 1622)
-       .  reduce 157 (src line 1114)
+       '}'  reduce 236 (src line 1683)
+       .  reduce 157 (src line 1175)
 
 
 state 326
@@ -5888,20 +5888,20 @@ state 326
        osemi: .    (286)
 
        ';'  shift 436
-       .  reduce 286 (src line 1894)
+       .  reduce 286 (src line 1955)
 
        osemi  goto 435
 
 state 327
        interfacetype:  LINTERFACE lbrace '}'.    (203)
 
-       .  reduce 203 (src line 1309)
+       .  reduce 203 (src line 1370)
 
 
 state 328
        interfacedcl_list:  interfacedcl.    (228)
 
-       .  reduce 228 (src line 1555)
+       .  reduce 228 (src line 1616)
 
 
 state 329
@@ -5915,7 +5915,7 @@ state 329
 state 330
        interfacedcl:  packname.    (240)
 
-       .  reduce 240 (src line 1659)
+       .  reduce 240 (src line 1720)
 
 
 state 331
@@ -5942,7 +5942,7 @@ state 333
        '.'  shift 90
        '?'  shift 12
        '@'  shift 13
-       .  reduce 287 (src line 1895)
+       .  reduce 287 (src line 1956)
 
        import_here  goto 87
        sym  goto 89
@@ -5952,7 +5952,7 @@ state 333
 state 334
        import_stmt:  import_here import_package import_there.    (11)
 
-       .  reduce 11 (src line 174)
+       .  reduce 11 (src line 235)
 
 
 state 335
@@ -5972,31 +5972,31 @@ state 336
 state 337
        hidden_type:  hidden_type_misc.    (312)
 
-       .  reduce 312 (src line 2004)
+       .  reduce 312 (src line 2065)
 
 
 state 338
        hidden_type:  hidden_type_recv_chan.    (313)
 
-       .  reduce 313 (src line 2006)
+       .  reduce 313 (src line 2067)
 
 
 state 339
        hidden_type:  hidden_type_func.    (314)
 
-       .  reduce 314 (src line 2007)
+       .  reduce 314 (src line 2068)
 
 
 state 340
        hidden_type_misc:  hidden_importsym.    (317)
 
-       .  reduce 317 (src line 2013)
+       .  reduce 317 (src line 2074)
 
 
 state 341
        hidden_type_misc:  LNAME.    (318)
 
-       .  reduce 318 (src line 2018)
+       .  reduce 318 (src line 2079)
 
 
 state 342
@@ -6131,7 +6131,7 @@ state 354
        LNAME  shift 10
        '?'  shift 12
        '@'  shift 13
-       .  reduce 296 (src line 1918)
+       .  reduce 296 (src line 1979)
 
        sym  goto 357
        hidden_importsym  goto 11
@@ -6151,7 +6151,7 @@ state 355
 state 356
        hidden_funarg_list:  hidden_funarg.    (346)
 
-       .  reduce 346 (src line 2213)
+       .  reduce 346 (src line 2274)
 
 
 state 357
@@ -6191,7 +6191,7 @@ state 359
        LNAME  shift 10
        '?'  shift 12
        '@'  shift 13
-       .  reduce 287 (src line 1895)
+       .  reduce 287 (src line 1956)
 
        sym  goto 105
        dcl_name  goto 104
@@ -6246,13 +6246,13 @@ state 361
        expr_list:  expr_list.',' expr 
 
        ','  shift 155
-       .  reduce 41 (src line 370)
+       .  reduce 41 (src line 431)
 
 
 state 362
        dcl_name_list:  dcl_name_list ',' dcl_name.    (275)
 
-       .  reduce 275 (src line 1836)
+       .  reduce 275 (src line 1897)
 
 
 state 363
@@ -6305,7 +6305,7 @@ state 366
        LNAME  shift 10
        '?'  shift 12
        '@'  shift 13
-       .  reduce 287 (src line 1895)
+       .  reduce 287 (src line 1956)
 
        sym  goto 105
        dcl_name  goto 104
@@ -6362,7 +6362,7 @@ state 368
        expr_list:  expr_list.',' expr 
 
        ','  shift 155
-       .  reduce 43 (src line 380)
+       .  reduce 43 (src line 441)
 
 
 state 369
@@ -6379,7 +6379,7 @@ state 370
        LNAME  shift 10
        '?'  shift 12
        '@'  shift 13
-       .  reduce 287 (src line 1895)
+       .  reduce 287 (src line 1956)
 
        sym  goto 112
        typedclname  goto 111
@@ -6412,7 +6412,7 @@ state 372
        '['  shift 77
        '?'  shift 12
        '@'  shift 13
-       .  reduce 212 (src line 1470)
+       .  reduce 212 (src line 1531)
 
        sym  goto 485
        dotname  goto 493
@@ -6444,7 +6444,7 @@ state 373
        '['  shift 77
        '?'  shift 12
        '@'  shift 13
-       .  reduce 289 (src line 1898)
+       .  reduce 289 (src line 1959)
 
        sym  goto 247
        ntype  goto 249
@@ -6464,25 +6464,25 @@ state 373
 state 374
        oarg_type_list_ocomma:  arg_type_list ocomma.    (250)
 
-       .  reduce 250 (src line 1712)
+       .  reduce 250 (src line 1773)
 
 
 state 375
        arg_type:  sym name_or_type.    (244)
 
-       .  reduce 244 (src line 1684)
+       .  reduce 244 (src line 1745)
 
 
 state 376
        arg_type:  sym dotdotdot.    (245)
 
-       .  reduce 245 (src line 1690)
+       .  reduce 245 (src line 1751)
 
 
 state 377
        dotdotdot:  LDDD ntype.    (165)
 
-       .  reduce 165 (src line 1186)
+       .  reduce 165 (src line 1247)
 
 
 state 378
@@ -6495,7 +6495,7 @@ state 378
 state 379
        non_dcl_stmt:  labelname ':' $$261 stmt.    (262)
 
-       .  reduce 262 (src line 1746)
+       .  reduce 262 (src line 1807)
 
 
 state 380
@@ -6508,14 +6508,14 @@ state 380
 state 381
        for_body:  for_header loop_body.    (73)
 
-       .  reduce 73 (src line 653)
+       .  reduce 73 (src line 714)
 
 
 state 382
        loop_body:  LBODY.$$65 stmt_list '}' 
        $$65: .    (65)
 
-       .  reduce 65 (src line 600)
+       .  reduce 65 (src line 661)
 
        $$65  goto 497
 
@@ -6542,7 +6542,7 @@ state 383
        '['  shift 77
        '?'  shift 12
        '@'  shift 13
-       .  reduce 294 (src line 1912)
+       .  reduce 294 (src line 1973)
 
        sym  goto 123
        expr  goto 48
@@ -6695,7 +6695,7 @@ state 386
        '/'  shift 146
        '%'  shift 147
        '&'  shift 148
-       .  reduce 69 (src line 625)
+       .  reduce 69 (src line 686)
 
 
 state 387
@@ -6728,7 +6728,7 @@ state 388
        '['  shift 77
        '?'  shift 12
        '@'  shift 13
-       .  reduce 294 (src line 1912)
+       .  reduce 294 (src line 1973)
 
        sym  goto 123
        expr  goto 48
@@ -6782,7 +6782,7 @@ state 392
        ocomma: .    (288)
 
        ','  shift 413
-       .  reduce 288 (src line 1897)
+       .  reduce 288 (src line 1958)
 
        ocomma  goto 510
 
@@ -6809,7 +6809,7 @@ state 393
        '['  shift 77
        '?'  shift 12
        '@'  shift 13
-       .  reduce 289 (src line 1898)
+       .  reduce 289 (src line 1959)
 
        sym  goto 123
        expr  goto 173
@@ -6848,7 +6848,7 @@ state 395
 state 396
        pexpr_no_paren:  pexpr '[' expr ']'.    (131)
 
-       .  reduce 131 (src line 967)
+       .  reduce 131 (src line 1028)
 
 
 state 397
@@ -6875,7 +6875,7 @@ state 397
        '['  shift 77
        '?'  shift 12
        '@'  shift 13
-       .  reduce 290 (src line 1900)
+       .  reduce 290 (src line 1961)
 
        sym  goto 123
        expr  goto 188
@@ -6909,20 +6909,20 @@ state 399
        ocomma: .    (288)
 
        ','  shift 516
-       .  reduce 288 (src line 1897)
+       .  reduce 288 (src line 1958)
 
        ocomma  goto 517
 
 state 400
        keyval_list:  keyval.    (280)
 
-       .  reduce 280 (src line 1864)
+       .  reduce 280 (src line 1925)
 
 
 state 401
        keyval_list:  bare_complitexpr.    (281)
 
-       .  reduce 281 (src line 1869)
+       .  reduce 281 (src line 1930)
 
 
 state 402
@@ -6970,14 +6970,14 @@ state 402
        '%'  shift 147
        '&'  shift 148
        ':'  shift 518
-       .  reduce 142 (src line 1027)
+       .  reduce 142 (src line 1088)
 
 
 state 403
        bare_complitexpr:  '{'.start_complit braced_keyval_list '}' 
        start_complit: .    (140)
 
-       .  reduce 140 (src line 1014)
+       .  reduce 140 (src line 1075)
 
        start_complit  goto 519
 
@@ -6985,7 +6985,7 @@ state 404
        pexpr_no_paren:  '(' expr_or_type ')' '{'.start_complit braced_keyval_list '}' 
        start_complit: .    (140)
 
-       .  reduce 140 (src line 1014)
+       .  reduce 140 (src line 1075)
 
        start_complit  goto 520
 
@@ -7022,47 +7022,47 @@ state 405
 state 406
        recvchantype:  LCOMM LCHAN ntype.    (199)
 
-       .  reduce 199 (src line 1282)
+       .  reduce 199 (src line 1343)
 
 
 state 407
        ntype:  fntype.    (167)
        non_recvchantype:  fntype.    (176)
 
-       LBODY  reduce 176 (src line 1211)
-       '('  reduce 176 (src line 1211)
-       '{'  reduce 176 (src line 1211)
-       .  reduce 167 (src line 1193)
+       LBODY  reduce 176 (src line 1272)
+       '('  reduce 176 (src line 1272)
+       '{'  reduce 176 (src line 1272)
+       .  reduce 167 (src line 1254)
 
 
 state 408
        ntype:  othertype.    (168)
        non_recvchantype:  othertype.    (177)
 
-       LBODY  reduce 177 (src line 1213)
-       '('  reduce 177 (src line 1213)
-       '{'  reduce 177 (src line 1213)
-       .  reduce 168 (src line 1194)
+       LBODY  reduce 177 (src line 1274)
+       '('  reduce 177 (src line 1274)
+       '{'  reduce 177 (src line 1274)
+       .  reduce 168 (src line 1255)
 
 
 state 409
        ntype:  ptrtype.    (169)
        non_recvchantype:  ptrtype.    (178)
 
-       LBODY  reduce 178 (src line 1214)
-       '('  reduce 178 (src line 1214)
-       '{'  reduce 178 (src line 1214)
-       .  reduce 169 (src line 1195)
+       LBODY  reduce 178 (src line 1275)
+       '('  reduce 178 (src line 1275)
+       '{'  reduce 178 (src line 1275)
+       .  reduce 169 (src line 1256)
 
 
 state 410
        ntype:  dotname.    (170)
        non_recvchantype:  dotname.    (179)
 
-       LBODY  reduce 179 (src line 1215)
-       '('  reduce 179 (src line 1215)
-       '{'  reduce 179 (src line 1215)
-       .  reduce 170 (src line 1196)
+       LBODY  reduce 179 (src line 1276)
+       '('  reduce 179 (src line 1276)
+       '{'  reduce 179 (src line 1276)
+       .  reduce 170 (src line 1257)
 
 
 state 411
@@ -7105,7 +7105,7 @@ state 412
 state 413
        ocomma:  ','.    (289)
 
-       .  reduce 289 (src line 1898)
+       .  reduce 289 (src line 1959)
 
 
 state 414
@@ -7118,7 +7118,7 @@ state 414
 state 415
        fnliteral:  fnlitdcl lbrace stmt_list '}'.    (216)
 
-       .  reduce 216 (src line 1491)
+       .  reduce 216 (src line 1552)
 
 
 state 416
@@ -7128,11 +7128,11 @@ state 416
        error  shift 307
        LLITERAL  shift 68
        LBREAK  shift 41
-       LCASE  reduce 251 (src line 1720)
+       LCASE  reduce 251 (src line 1781)
        LCHAN  shift 78
        LCONST  shift 47
        LCONTINUE  shift 42
-       LDEFAULT  reduce 251 (src line 1720)
+       LDEFAULT  reduce 251 (src line 1781)
        LDEFER  shift 44
        LFALL  shift 40
        LFOR  shift 50
@@ -7156,9 +7156,9 @@ state 416
        '*'  shift 58
        '&'  shift 59
        '('  shift 67
-       ';'  reduce 251 (src line 1720)
+       ';'  reduce 251 (src line 1781)
        '{'  shift 308
-       '}'  reduce 251 (src line 1720)
+       '}'  reduce 251 (src line 1781)
        '!'  shift 62
        '~'  shift 63
        '['  shift 77
@@ -7229,9 +7229,9 @@ state 417
        '*'  shift 58
        '&'  shift 59
        '('  shift 67
-       ';'  reduce 251 (src line 1720)
+       ';'  reduce 251 (src line 1781)
        '{'  shift 308
-       '}'  reduce 251 (src line 1720)
+       '}'  reduce 251 (src line 1781)
        '!'  shift 62
        '~'  shift 63
        '['  shift 77
@@ -7273,25 +7273,25 @@ state 417
 state 418
        othertype:  '[' oexpr ']' ntype.    (191)
 
-       .  reduce 191 (src line 1249)
+       .  reduce 191 (src line 1310)
 
 
 state 419
        othertype:  '[' LDDD ']' ntype.    (192)
 
-       .  reduce 192 (src line 1254)
+       .  reduce 192 (src line 1315)
 
 
 state 420
        non_recvchantype:  '(' ntype ')'.    (180)
 
-       .  reduce 180 (src line 1216)
+       .  reduce 180 (src line 1277)
 
 
 state 421
        dotname:  name '.' sym.    (190)
 
-       .  reduce 190 (src line 1237)
+       .  reduce 190 (src line 1298)
 
 
 state 422
@@ -7339,7 +7339,7 @@ state 424
        '('  shift 321
        '?'  shift 12
        '@'  shift 13
-       .  reduce 287 (src line 1895)
+       .  reduce 287 (src line 1956)
 
        sym  goto 119
        packname  goto 324
@@ -7354,7 +7354,7 @@ state 425
        oliteral: .    (302)
 
        LLITERAL  shift 428
-       .  reduce 302 (src line 1936)
+       .  reduce 302 (src line 1997)
 
        oliteral  goto 529
 
@@ -7373,13 +7373,13 @@ state 426
 state 427
        structdcl:  embed oliteral.    (231)
 
-       .  reduce 231 (src line 1590)
+       .  reduce 231 (src line 1651)
 
 
 state 428
        oliteral:  LLITERAL.    (303)
 
-       .  reduce 303 (src line 1940)
+       .  reduce 303 (src line 2001)
 
 
 state 429
@@ -7403,7 +7403,7 @@ state 431
        packname:  LNAME.'.' sym 
 
        '.'  shift 434
-       .  reduce 236 (src line 1622)
+       .  reduce 236 (src line 1683)
 
 
 state 432
@@ -7411,7 +7411,7 @@ state 432
        oliteral: .    (302)
 
        LLITERAL  shift 428
-       .  reduce 302 (src line 1936)
+       .  reduce 302 (src line 1997)
 
        oliteral  goto 533
 
@@ -7450,7 +7450,7 @@ state 436
        '('  shift 331
        '?'  shift 12
        '@'  shift 13
-       .  reduce 287 (src line 1895)
+       .  reduce 287 (src line 1956)
 
        sym  goto 119
        packname  goto 330
@@ -7461,7 +7461,7 @@ state 436
 state 437
        interfacedcl:  new_name indcl.    (239)
 
-       .  reduce 239 (src line 1653)
+       .  reduce 239 (src line 1714)
 
 
 state 438
@@ -7481,7 +7481,7 @@ state 438
        '['  shift 77
        '?'  shift 12
        '@'  shift 13
-       .  reduce 249 (src line 1708)
+       .  reduce 249 (src line 1769)
 
        sym  goto 247
        ntype  goto 249
@@ -7510,25 +7510,25 @@ state 439
 state 440
        import:  LIMPORT '(' import_stmt_list osemi ')'.    (9)
 
-       .  reduce 9 (src line 171)
+       .  reduce 9 (src line 232)
 
 
 state 441
        import_stmt_list:  import_stmt_list ';' import_stmt.    (14)
 
-       .  reduce 14 (src line 223)
+       .  reduce 14 (src line 284)
 
 
 state 442
        hidden_import:  LIMPORT LNAME LLITERAL ';'.    (304)
 
-       .  reduce 304 (src line 1945)
+       .  reduce 304 (src line 2006)
 
 
 state 443
        hidden_import:  LVAR hidden_pkg_importsym hidden_type ';'.    (305)
 
-       .  reduce 305 (src line 1950)
+       .  reduce 305 (src line 2011)
 
 
 state 444
@@ -7587,7 +7587,7 @@ state 447
        LNAME  shift 10
        '?'  shift 12
        '@'  shift 13
-       .  reduce 298 (src line 1924)
+       .  reduce 298 (src line 1985)
 
        sym  goto 546
        hidden_importsym  goto 11
@@ -7610,7 +7610,7 @@ state 448
        '['  shift 342
        '?'  shift 12
        '@'  shift 13
-       .  reduce 300 (src line 1930)
+       .  reduce 300 (src line 1991)
 
        sym  goto 550
        hidden_importsym  goto 553
@@ -7625,13 +7625,13 @@ state 448
 state 449
        hidden_type_misc:  '*' hidden_type.    (324)
 
-       .  reduce 324 (src line 2049)
+       .  reduce 324 (src line 2110)
 
 
 state 450
        hidden_type_misc:  LCHAN hidden_type_non_recv_chan.    (325)
 
-       .  reduce 325 (src line 2053)
+       .  reduce 325 (src line 2114)
 
 
 state 451
@@ -7666,13 +7666,13 @@ state 452
 state 453
        hidden_type_non_recv_chan:  hidden_type_misc.    (315)
 
-       .  reduce 315 (src line 2009)
+       .  reduce 315 (src line 2070)
 
 
 state 454
        hidden_type_non_recv_chan:  hidden_type_func.    (316)
 
-       .  reduce 316 (src line 2011)
+       .  reduce 316 (src line 2072)
 
 
 state 455
@@ -7703,7 +7703,7 @@ state 456
        LNAME  shift 10
        '?'  shift 12
        '@'  shift 13
-       .  reduce 296 (src line 1918)
+       .  reduce 296 (src line 1979)
 
        sym  goto 357
        hidden_importsym  goto 11
@@ -7721,7 +7721,7 @@ state 457
 state 458
        hidden_constant:  hidden_literal.    (342)
 
-       .  reduce 342 (src line 2196)
+       .  reduce 342 (src line 2257)
 
 
 state 459
@@ -7741,7 +7741,7 @@ state 459
 state 460
        hidden_literal:  LLITERAL.    (339)
 
-       .  reduce 339 (src line 2165)
+       .  reduce 339 (src line 2226)
 
 
 state 461
@@ -7754,7 +7754,7 @@ state 461
 state 462
        hidden_literal:  sym.    (341)
 
-       .  reduce 341 (src line 2188)
+       .  reduce 341 (src line 2249)
 
 
 state 463
@@ -7776,13 +7776,13 @@ state 463
 state 464
        hidden_import:  LTYPE hidden_pkgtype hidden_type ';'.    (308)
 
-       .  reduce 308 (src line 1962)
+       .  reduce 308 (src line 2023)
 
 
 state 465
        hidden_import:  LFUNC hidden_fndcl fnbody ';'.    (309)
 
-       .  reduce 309 (src line 1966)
+       .  reduce 309 (src line 2027)
 
 
 state 466
@@ -7797,7 +7797,7 @@ state 467
        hidden_funarg_list:  hidden_funarg_list.',' hidden_funarg 
 
        ','  shift 469
-       .  reduce 297 (src line 1922)
+       .  reduce 297 (src line 1983)
 
 
 state 468
@@ -7828,7 +7828,7 @@ state 470
        oliteral: .    (302)
 
        LLITERAL  shift 428
-       .  reduce 302 (src line 1936)
+       .  reduce 302 (src line 1997)
 
        oliteral  goto 565
 
@@ -7856,13 +7856,13 @@ state 471
 state 472
        common_dcl:  LVAR '(' vardcl_list osemi ')'.    (29)
 
-       .  reduce 29 (src line 311)
+       .  reduce 29 (src line 372)
 
 
 state 473
        vardcl_list:  vardcl_list ';' vardcl.    (221)
 
-       .  reduce 221 (src line 1526)
+       .  reduce 221 (src line 1587)
 
 
 state 474
@@ -7870,19 +7870,19 @@ state 474
        expr_list:  expr_list.',' expr 
 
        ','  shift 155
-       .  reduce 40 (src line 366)
+       .  reduce 40 (src line 427)
 
 
 state 475
        ntype:  '(' ntype ')'.    (171)
 
-       .  reduce 171 (src line 1197)
+       .  reduce 171 (src line 1258)
 
 
 state 476
        common_dcl:  lconst '(' constdcl osemi ')'.    (32)
 
-       .  reduce 32 (src line 325)
+       .  reduce 32 (src line 386)
 
 
 state 477
@@ -7891,20 +7891,20 @@ state 477
        osemi: .    (286)
 
        ';'  shift 568
-       .  reduce 286 (src line 1894)
+       .  reduce 286 (src line 1955)
 
        osemi  goto 567
 
 state 478
        constdcl_list:  constdcl1.    (222)
 
-       .  reduce 222 (src line 1531)
+       .  reduce 222 (src line 1592)
 
 
 state 479
        constdcl1:  constdcl.    (44)
 
-       .  reduce 44 (src line 385)
+       .  reduce 44 (src line 446)
 
 
 state 480
@@ -7928,7 +7928,7 @@ state 480
        '?'  shift 12
        '@'  shift 13
        ','  shift 225
-       .  reduce 46 (src line 391)
+       .  reduce 46 (src line 452)
 
        sym  goto 123
        ntype  goto 569
@@ -7947,25 +7947,25 @@ state 481
        expr_list:  expr_list.',' expr 
 
        ','  shift 155
-       .  reduce 42 (src line 375)
+       .  reduce 42 (src line 436)
 
 
 state 482
        common_dcl:  LTYPE '(' typedcl_list osemi ')'.    (36)
 
-       .  reduce 36 (src line 346)
+       .  reduce 36 (src line 407)
 
 
 state 483
        typedcl_list:  typedcl_list ';' typedcl.    (225)
 
-       .  reduce 225 (src line 1543)
+       .  reduce 225 (src line 1604)
 
 
 state 484
        fnbody:  '{' stmt_list '}'.    (211)
 
-       .  reduce 211 (src line 1462)
+       .  reduce 211 (src line 1523)
 
 
 state 485
@@ -7973,19 +7973,19 @@ state 485
        fndcl:  '(' oarg_type_list_ocomma ')' sym.'(' oarg_type_list_ocomma ')' fnres 
 
        '('  shift 570
-       .  reduce 162 (src line 1159)
+       .  reduce 162 (src line 1220)
 
 
 state 486
        fntype:  LFUNC '(' oarg_type_list_ocomma ')' fnres.    (209)
 
-       .  reduce 209 (src line 1449)
+       .  reduce 209 (src line 1510)
 
 
 state 487
        fnres:  fnret_type.    (213)
 
-       .  reduce 213 (src line 1475)
+       .  reduce 213 (src line 1536)
 
 
 state 488
@@ -8005,7 +8005,7 @@ state 488
        '['  shift 77
        '?'  shift 12
        '@'  shift 13
-       .  reduce 249 (src line 1708)
+       .  reduce 249 (src line 1769)
 
        sym  goto 247
        ntype  goto 249
@@ -8027,37 +8027,37 @@ state 488
 state 489
        fnret_type:  recvchantype.    (184)
 
-       .  reduce 184 (src line 1228)
+       .  reduce 184 (src line 1289)
 
 
 state 490
        fnret_type:  fntype.    (185)
 
-       .  reduce 185 (src line 1230)
+       .  reduce 185 (src line 1291)
 
 
 state 491
        fnret_type:  othertype.    (186)
 
-       .  reduce 186 (src line 1231)
+       .  reduce 186 (src line 1292)
 
 
 state 492
        fnret_type:  ptrtype.    (187)
 
-       .  reduce 187 (src line 1232)
+       .  reduce 187 (src line 1293)
 
 
 state 493
        fnret_type:  dotname.    (188)
 
-       .  reduce 188 (src line 1233)
+       .  reduce 188 (src line 1294)
 
 
 state 494
        arg_type_list:  arg_type_list ',' arg_type.    (248)
 
-       .  reduce 248 (src line 1703)
+       .  reduce 248 (src line 1764)
 
 
 state 495
@@ -8076,7 +8076,7 @@ state 495
        '['  shift 77
        '?'  shift 12
        '@'  shift 13
-       .  reduce 212 (src line 1470)
+       .  reduce 212 (src line 1531)
 
        sym  goto 123
        dotname  goto 493
@@ -8107,7 +8107,7 @@ state 496
        '['  shift 77
        '?'  shift 12
        '@'  shift 13
-       .  reduce 212 (src line 1470)
+       .  reduce 212 (src line 1531)
 
        sym  goto 123
        dotname  goto 493
@@ -8155,9 +8155,9 @@ state 497
        '*'  shift 58
        '&'  shift 59
        '('  shift 67
-       ';'  reduce 251 (src line 1720)
+       ';'  reduce 251 (src line 1781)
        '{'  shift 308
-       '}'  reduce 251 (src line 1720)
+       '}'  reduce 251 (src line 1781)
        '!'  shift 62
        '~'  shift 63
        '['  shift 77
@@ -8289,33 +8289,33 @@ state 501
        switch_stmt:  LSWITCH $$88 if_header $$89 LBODY.caseblock_list '}' 
        caseblock_list: .    (63)
 
-       .  reduce 63 (src line 591)
+       .  reduce 63 (src line 652)
 
        caseblock_list  goto 577
 
 state 502
        if_header:  osimple_stmt ';' osimple_stmt.    (77)
 
-       .  reduce 77 (src line 678)
+       .  reduce 77 (src line 739)
 
 
 state 503
        caseblock_list:  caseblock_list caseblock.    (64)
 
-       .  reduce 64 (src line 595)
+       .  reduce 64 (src line 656)
 
 
 state 504
        select_stmt:  LSELECT $$91 LBODY caseblock_list '}'.    (92)
 
-       .  reduce 92 (src line 783)
+       .  reduce 92 (src line 844)
 
 
 state 505
        caseblock:  case.$$61 stmt_list 
        $$61: .    (61)
 
-       .  reduce 61 (src line 560)
+       .  reduce 61 (src line 621)
 
        $$61  goto 578
 
@@ -8377,14 +8377,14 @@ state 508
        if_stmt:  LIF $$78 if_header $$79 loop_body.$$80 elseif_list else 
        $$80: .    (80)
 
-       .  reduce 80 (src line 700)
+       .  reduce 80 (src line 761)
 
        $$80  goto 581
 
 state 509
        pseudocall:  pexpr '(' expr_or_type_list ocomma ')'.    (124)
 
-       .  reduce 124 (src line 930)
+       .  reduce 124 (src line 991)
 
 
 state 510
@@ -8397,19 +8397,19 @@ state 510
 state 511
        expr_or_type_list:  expr_or_type_list ',' expr_or_type.    (279)
 
-       .  reduce 279 (src line 1856)
+       .  reduce 279 (src line 1917)
 
 
 state 512
        pexpr_no_paren:  pexpr '.' '(' expr_or_type ')'.    (129)
 
-       .  reduce 129 (src line 959)
+       .  reduce 129 (src line 1020)
 
 
 state 513
        pexpr_no_paren:  pexpr '.' '(' LTYPE ')'.    (130)
 
-       .  reduce 130 (src line 963)
+       .  reduce 130 (src line 1024)
 
 
 state 514
@@ -8424,7 +8424,7 @@ state 514
 state 515
        pexpr_no_paren:  pexpr_no_paren '{' start_complit braced_keyval_list '}'.    (137)
 
-       .  reduce 137 (src line 999)
+       .  reduce 137 (src line 1060)
 
 
 state 516
@@ -8452,7 +8452,7 @@ state 516
        '['  shift 77
        '?'  shift 12
        '@'  shift 13
-       .  reduce 289 (src line 1898)
+       .  reduce 289 (src line 1959)
 
        sym  goto 123
        expr  goto 402
@@ -8476,7 +8476,7 @@ state 516
 state 517
        braced_keyval_list:  keyval_list ocomma.    (285)
 
-       .  reduce 285 (src line 1886)
+       .  reduce 285 (src line 1947)
 
 
 state 518
@@ -8546,7 +8546,7 @@ state 519
        '['  shift 77
        '?'  shift 12
        '@'  shift 13
-       .  reduce 284 (src line 1882)
+       .  reduce 284 (src line 1943)
 
        sym  goto 123
        expr  goto 402
@@ -8593,7 +8593,7 @@ state 520
        '['  shift 77
        '?'  shift 12
        '@'  shift 13
-       .  reduce 284 (src line 1882)
+       .  reduce 284 (src line 1943)
 
        sym  goto 123
        expr  goto 402
@@ -8627,19 +8627,19 @@ state 521
 state 522
        pexpr_no_paren:  convtype '(' expr ocomma ')'.    (135)
 
-       .  reduce 135 (src line 986)
+       .  reduce 135 (src line 1047)
 
 
 state 523
        pexpr_no_paren:  comptype lbrace start_complit braced_keyval_list '}'.    (136)
 
-       .  reduce 136 (src line 992)
+       .  reduce 136 (src line 1053)
 
 
 state 524
        stmt_list:  stmt_list ';' stmt.    (271)
 
-       .  reduce 271 (src line 1813)
+       .  reduce 271 (src line 1874)
 
 
 state 525
@@ -8654,31 +8654,31 @@ state 525
 state 526
        othertype:  LMAP '[' ntype ']' ntype.    (195)
 
-       .  reduce 195 (src line 1269)
+       .  reduce 195 (src line 1330)
 
 
 state 527
        structtype:  LSTRUCT lbrace structdcl_list osemi '}'.    (200)
 
-       .  reduce 200 (src line 1289)
+       .  reduce 200 (src line 1350)
 
 
 state 528
        structdcl_list:  structdcl_list ';' structdcl.    (227)
 
-       .  reduce 227 (src line 1550)
+       .  reduce 227 (src line 1611)
 
 
 state 529
        structdcl:  new_name_list ntype oliteral.    (230)
 
-       .  reduce 230 (src line 1565)
+       .  reduce 230 (src line 1626)
 
 
 state 530
        new_name_list:  new_name_list ',' new_name.    (273)
 
-       .  reduce 273 (src line 1826)
+       .  reduce 273 (src line 1887)
 
 
 state 531
@@ -8686,7 +8686,7 @@ state 531
        oliteral: .    (302)
 
        LLITERAL  shift 428
-       .  reduce 302 (src line 1936)
+       .  reduce 302 (src line 1997)
 
        oliteral  goto 594
 
@@ -8700,7 +8700,7 @@ state 532
 state 533
        structdcl:  '*' embed oliteral.    (233)
 
-       .  reduce 233 (src line 1601)
+       .  reduce 233 (src line 1662)
 
 
 state 534
@@ -8713,19 +8713,19 @@ state 534
 state 535
        packname:  LNAME '.' sym.    (237)
 
-       .  reduce 237 (src line 1633)
+       .  reduce 237 (src line 1694)
 
 
 state 536
        interfacetype:  LINTERFACE lbrace interfacedcl_list osemi '}'.    (202)
 
-       .  reduce 202 (src line 1302)
+       .  reduce 202 (src line 1363)
 
 
 state 537
        interfacedcl_list:  interfacedcl_list ';' interfacedcl.    (229)
 
-       .  reduce 229 (src line 1560)
+       .  reduce 229 (src line 1621)
 
 
 state 538
@@ -8738,13 +8738,13 @@ state 538
 state 539
        interfacedcl:  '(' packname ')'.    (241)
 
-       .  reduce 241 (src line 1663)
+       .  reduce 241 (src line 1724)
 
 
 state 540
        hidden_type_misc:  '[' ']' hidden_type.    (319)
 
-       .  reduce 319 (src line 2029)
+       .  reduce 319 (src line 2090)
 
 
 state 541
@@ -8787,13 +8787,13 @@ state 544
        hidden_structdcl_list:  hidden_structdcl_list.';' hidden_structdcl 
 
        ';'  shift 601
-       .  reduce 299 (src line 1928)
+       .  reduce 299 (src line 1989)
 
 
 state 545
        hidden_structdcl_list:  hidden_structdcl.    (348)
 
-       .  reduce 348 (src line 2223)
+       .  reduce 348 (src line 2284)
 
 
 state 546
@@ -8829,13 +8829,13 @@ state 548
        hidden_interfacedcl_list:  hidden_interfacedcl_list.';' hidden_interfacedcl 
 
        ';'  shift 604
-       .  reduce 301 (src line 1934)
+       .  reduce 301 (src line 1995)
 
 
 state 549
        hidden_interfacedcl_list:  hidden_interfacedcl.    (350)
 
-       .  reduce 350 (src line 2233)
+       .  reduce 350 (src line 2294)
 
 
 state 550
@@ -8848,23 +8848,23 @@ state 550
 state 551
        hidden_interfacedcl:  hidden_type.    (334)
 
-       .  reduce 334 (src line 2140)
+       .  reduce 334 (src line 2201)
 
 
 state 552
        sym:  LNAME.    (157)
        hidden_type_misc:  LNAME.    (318)
 
-       '('  reduce 157 (src line 1114)
-       .  reduce 318 (src line 2018)
+       '('  reduce 157 (src line 1175)
+       .  reduce 318 (src line 2079)
 
 
 state 553
        sym:  hidden_importsym.    (158)
        hidden_type_misc:  hidden_importsym.    (317)
 
-       '('  reduce 158 (src line 1123)
-       .  reduce 317 (src line 2013)
+       '('  reduce 158 (src line 1184)
+       .  reduce 317 (src line 2074)
 
 
 state 554
@@ -8877,13 +8877,13 @@ state 554
 state 555
        hidden_type_misc:  LCHAN LCOMM hidden_type.    (327)
 
-       .  reduce 327 (src line 2065)
+       .  reduce 327 (src line 2126)
 
 
 state 556
        hidden_type_recv_chan:  LCOMM LCHAN hidden_type.    (328)
 
-       .  reduce 328 (src line 2072)
+       .  reduce 328 (src line 2133)
 
 
 state 557
@@ -8896,7 +8896,7 @@ state 557
 state 558
        hidden_import:  LCONST hidden_pkg_importsym '=' hidden_constant ';'.    (306)
 
-       .  reduce 306 (src line 1954)
+       .  reduce 306 (src line 2015)
 
 
 state 559
@@ -8909,7 +8909,7 @@ state 559
 state 560
        hidden_literal:  '-' LLITERAL.    (340)
 
-       .  reduce 340 (src line 2170)
+       .  reduce 340 (src line 2231)
 
 
 state 561
@@ -8934,7 +8934,7 @@ state 562
        '('  shift 612
        '['  shift 342
        '@'  shift 13
-       .  reduce 335 (src line 2145)
+       .  reduce 335 (src line 2206)
 
        hidden_importsym  goto 340
        hidden_funres  goto 611
@@ -8954,13 +8954,13 @@ state 563
 state 564
        hidden_funarg_list:  hidden_funarg_list ',' hidden_funarg.    (347)
 
-       .  reduce 347 (src line 2218)
+       .  reduce 347 (src line 2279)
 
 
 state 565
        hidden_funarg:  sym hidden_type oliteral.    (330)
 
-       .  reduce 330 (src line 2086)
+       .  reduce 330 (src line 2147)
 
 
 state 566
@@ -8968,7 +8968,7 @@ state 566
        oliteral: .    (302)
 
        LLITERAL  shift 428
-       .  reduce 302 (src line 1936)
+       .  reduce 302 (src line 1997)
 
        oliteral  goto 615
 
@@ -8986,7 +8986,7 @@ state 568
        LNAME  shift 10
        '?'  shift 12
        '@'  shift 13
-       .  reduce 287 (src line 1895)
+       .  reduce 287 (src line 1956)
 
        sym  goto 105
        dcl_name  goto 104
@@ -9000,7 +9000,7 @@ state 569
        constdcl1:  dcl_name_list ntype.    (45)
 
        '='  shift 367
-       .  reduce 45 (src line 387)
+       .  reduce 45 (src line 448)
 
 
 state 570
@@ -9020,7 +9020,7 @@ state 570
        '['  shift 77
        '?'  shift 12
        '@'  shift 13
-       .  reduce 249 (src line 1708)
+       .  reduce 249 (src line 1769)
 
        sym  goto 247
        ntype  goto 249
@@ -9049,7 +9049,7 @@ state 571
 state 572
        fndcl:  sym '(' oarg_type_list_ocomma ')' fnres.    (205)
 
-       .  reduce 205 (src line 1337)
+       .  reduce 205 (src line 1398)
 
 
 state 573
@@ -9084,7 +9084,7 @@ state 574
        '['  shift 77
        '?'  shift 12
        '@'  shift 13
-       .  reduce 294 (src line 1912)
+       .  reduce 294 (src line 1973)
 
        sym  goto 123
        expr  goto 48
@@ -9149,7 +9149,7 @@ state 575
        '/'  shift 146
        '%'  shift 147
        '&'  shift 148
-       .  reduce 67 (src line 611)
+       .  reduce 67 (src line 672)
 
 
 state 576
@@ -9195,7 +9195,7 @@ state 576
        '/'  shift 146
        '%'  shift 147
        '&'  shift 148
-       .  reduce 68 (src line 618)
+       .  reduce 68 (src line 679)
 
 
 state 577
@@ -9217,11 +9217,11 @@ state 578
        error  shift 307
        LLITERAL  shift 68
        LBREAK  shift 41
-       LCASE  reduce 251 (src line 1720)
+       LCASE  reduce 251 (src line 1781)
        LCHAN  shift 78
        LCONST  shift 47
        LCONTINUE  shift 42
-       LDEFAULT  reduce 251 (src line 1720)
+       LDEFAULT  reduce 251 (src line 1781)
        LDEFER  shift 44
        LFALL  shift 40
        LFOR  shift 50
@@ -9245,9 +9245,9 @@ state 578
        '*'  shift 58
        '&'  shift 59
        '('  shift 67
-       ';'  reduce 251 (src line 1720)
+       ';'  reduce 251 (src line 1781)
        '{'  shift 308
-       '}'  reduce 251 (src line 1720)
+       '}'  reduce 251 (src line 1781)
        '!'  shift 62
        '~'  shift 63
        '['  shift 77
@@ -9302,27 +9302,27 @@ state 579
 state 580
        case:  LDEFAULT ':'.    (58)
 
-       .  reduce 58 (src line 525)
+       .  reduce 58 (src line 586)
 
 
 state 581
        if_stmt:  LIF $$78 if_header $$79 loop_body $$80.elseif_list else 
        elseif_list: .    (84)
 
-       .  reduce 84 (src line 735)
+       .  reduce 84 (src line 796)
 
        elseif_list  goto 628
 
 state 582
        pseudocall:  pexpr '(' expr_or_type_list LDDD ocomma ')'.    (125)
 
-       .  reduce 125 (src line 935)
+       .  reduce 125 (src line 996)
 
 
 state 583
        pexpr_no_paren:  pexpr '[' oexpr ':' oexpr ']'.    (132)
 
-       .  reduce 132 (src line 971)
+       .  reduce 132 (src line 1032)
 
 
 state 584
@@ -9348,7 +9348,7 @@ state 584
        '['  shift 77
        '?'  shift 12
        '@'  shift 13
-       .  reduce 290 (src line 1900)
+       .  reduce 290 (src line 1961)
 
        sym  goto 123
        expr  goto 188
@@ -9371,19 +9371,19 @@ state 584
 state 585
        keyval_list:  keyval_list ',' keyval.    (282)
 
-       .  reduce 282 (src line 1873)
+       .  reduce 282 (src line 1934)
 
 
 state 586
        keyval_list:  keyval_list ',' bare_complitexpr.    (283)
 
-       .  reduce 283 (src line 1877)
+       .  reduce 283 (src line 1938)
 
 
 state 587
        keyval:  expr ':' complitexpr.    (141)
 
-       .  reduce 141 (src line 1021)
+       .  reduce 141 (src line 1082)
 
 
 state 588
@@ -9429,14 +9429,14 @@ state 588
        '/'  shift 146
        '%'  shift 147
        '&'  shift 148
-       .  reduce 144 (src line 1047)
+       .  reduce 144 (src line 1108)
 
 
 state 589
        complitexpr:  '{'.start_complit braced_keyval_list '}' 
        start_complit: .    (140)
 
-       .  reduce 140 (src line 1014)
+       .  reduce 140 (src line 1075)
 
        start_complit  goto 630
 
@@ -9458,22 +9458,22 @@ state 592
        ntype:  '(' ntype ')'.    (171)
        non_recvchantype:  '(' ntype ')'.    (180)
 
-       LBODY  reduce 180 (src line 1216)
-       '('  reduce 180 (src line 1216)
-       '{'  reduce 180 (src line 1216)
-       .  reduce 171 (src line 1197)
+       LBODY  reduce 180 (src line 1277)
+       '('  reduce 180 (src line 1277)
+       '{'  reduce 180 (src line 1277)
+       .  reduce 171 (src line 1258)
 
 
 state 593
        compound_stmt:  '{' $$59 stmt_list '}'.    (60)
 
-       .  reduce 60 (src line 550)
+       .  reduce 60 (src line 611)
 
 
 state 594
        structdcl:  '(' embed ')' oliteral.    (232)
 
-       .  reduce 232 (src line 1595)
+       .  reduce 232 (src line 1656)
 
 
 state 595
@@ -9481,7 +9481,7 @@ state 595
        oliteral: .    (302)
 
        LLITERAL  shift 428
-       .  reduce 302 (src line 1936)
+       .  reduce 302 (src line 1997)
 
        oliteral  goto 633
 
@@ -9490,7 +9490,7 @@ state 596
        oliteral: .    (302)
 
        LLITERAL  shift 428
-       .  reduce 302 (src line 1936)
+       .  reduce 302 (src line 1997)
 
        oliteral  goto 634
 
@@ -9510,7 +9510,7 @@ state 597
        '['  shift 77
        '?'  shift 12
        '@'  shift 13
-       .  reduce 212 (src line 1470)
+       .  reduce 212 (src line 1531)
 
        sym  goto 123
        dotname  goto 493
@@ -9528,7 +9528,7 @@ state 597
 state 598
        hidden_type_misc:  '[' LLITERAL ']' hidden_type.    (320)
 
-       .  reduce 320 (src line 2033)
+       .  reduce 320 (src line 2094)
 
 
 state 599
@@ -9555,7 +9555,7 @@ state 599
 state 600
        hidden_type_misc:  LSTRUCT '{' ohidden_structdcl_list '}'.    (322)
 
-       .  reduce 322 (src line 2041)
+       .  reduce 322 (src line 2102)
 
 
 state 601
@@ -9575,14 +9575,14 @@ state 602
        oliteral: .    (302)
 
        LLITERAL  shift 428
-       .  reduce 302 (src line 1936)
+       .  reduce 302 (src line 1997)
 
        oliteral  goto 638
 
 state 603
        hidden_type_misc:  LINTERFACE '{' ohidden_interfacedcl_list '}'.    (323)
 
-       .  reduce 323 (src line 2045)
+       .  reduce 323 (src line 2106)
 
 
 state 604
@@ -9616,7 +9616,7 @@ state 605
        LNAME  shift 10
        '?'  shift 12
        '@'  shift 13
-       .  reduce 296 (src line 1918)
+       .  reduce 296 (src line 1979)
 
        sym  goto 357
        hidden_importsym  goto 11
@@ -9627,7 +9627,7 @@ state 605
 state 606
        hidden_type_misc:  LCHAN '(' hidden_type_recv_chan ')'.    (326)
 
-       .  reduce 326 (src line 2059)
+       .  reduce 326 (src line 2120)
 
 
 state 607
@@ -9645,7 +9645,7 @@ state 607
        '('  shift 612
        '['  shift 342
        '@'  shift 13
-       .  reduce 335 (src line 2145)
+       .  reduce 335 (src line 2206)
 
        hidden_importsym  goto 340
        hidden_funres  goto 611
@@ -9672,19 +9672,19 @@ state 608
 state 609
        hidden_import:  LCONST hidden_pkg_importsym hidden_type '=' hidden_constant ';'.    (307)
 
-       .  reduce 307 (src line 1958)
+       .  reduce 307 (src line 2019)
 
 
 state 610
        hidden_fndcl:  hidden_pkg_importsym '(' ohidden_funarg_list ')' ohidden_funres.    (207)
 
-       .  reduce 207 (src line 1406)
+       .  reduce 207 (src line 1467)
 
 
 state 611
        ohidden_funres:  hidden_funres.    (336)
 
-       .  reduce 336 (src line 2149)
+       .  reduce 336 (src line 2210)
 
 
 state 612
@@ -9694,7 +9694,7 @@ state 612
        LNAME  shift 10
        '?'  shift 12
        '@'  shift 13
-       .  reduce 296 (src line 1918)
+       .  reduce 296 (src line 1979)
 
        sym  goto 357
        hidden_importsym  goto 11
@@ -9705,7 +9705,7 @@ state 612
 state 613
        hidden_funres:  hidden_type.    (338)
 
-       .  reduce 338 (src line 2156)
+       .  reduce 338 (src line 2217)
 
 
 state 614
@@ -9715,7 +9715,7 @@ state 614
        LNAME  shift 10
        '?'  shift 12
        '@'  shift 13
-       .  reduce 296 (src line 1918)
+       .  reduce 296 (src line 1979)
 
        sym  goto 357
        hidden_importsym  goto 11
@@ -9726,19 +9726,19 @@ state 614
 state 615
        hidden_funarg:  sym LDDD hidden_type oliteral.    (331)
 
-       .  reduce 331 (src line 2095)
+       .  reduce 331 (src line 2156)
 
 
 state 616
        common_dcl:  lconst '(' constdcl ';' constdcl_list osemi ')'.    (33)
 
-       .  reduce 33 (src line 331)
+       .  reduce 33 (src line 392)
 
 
 state 617
        constdcl_list:  constdcl_list ';' constdcl1.    (223)
 
-       .  reduce 223 (src line 1533)
+       .  reduce 223 (src line 1594)
 
 
 state 618
@@ -9751,25 +9751,25 @@ state 618
 state 619
        fnres:  '(' oarg_type_list_ocomma ')'.    (214)
 
-       .  reduce 214 (src line 1479)
+       .  reduce 214 (src line 1540)
 
 
 state 620
        loop_body:  LBODY $$65 stmt_list '}'.    (66)
 
-       .  reduce 66 (src line 605)
+       .  reduce 66 (src line 666)
 
 
 state 621
        for_header:  osimple_stmt ';' osimple_stmt ';' osimple_stmt.    (70)
 
-       .  reduce 70 (src line 631)
+       .  reduce 70 (src line 692)
 
 
 state 622
        switch_stmt:  LSWITCH $$88 if_header $$89 LBODY caseblock_list '}'.    (90)
 
-       .  reduce 90 (src line 769)
+       .  reduce 90 (src line 830)
 
 
 state 623
@@ -9777,13 +9777,13 @@ state 623
        stmt_list:  stmt_list.';' stmt 
 
        ';'  shift 416
-       .  reduce 62 (src line 572)
+       .  reduce 62 (src line 633)
 
 
 state 624
        case:  LCASE expr_or_type_list ':'.    (55)
 
-       .  reduce 55 (src line 474)
+       .  reduce 55 (src line 535)
 
 
 state 625
@@ -9918,7 +9918,7 @@ state 628
        else: .    (86)
 
        LELSE  shift 650
-       .  reduce 86 (src line 744)
+       .  reduce 86 (src line 805)
 
        elseif  goto 649
        else  goto 648
@@ -9954,7 +9954,7 @@ state 630
        '['  shift 77
        '?'  shift 12
        '@'  shift 13
-       .  reduce 284 (src line 1882)
+       .  reduce 284 (src line 1943)
 
        sym  goto 123
        expr  goto 402
@@ -9980,55 +9980,55 @@ state 630
 state 631
        bare_complitexpr:  '{' start_complit braced_keyval_list '}'.    (143)
 
-       .  reduce 143 (src line 1041)
+       .  reduce 143 (src line 1102)
 
 
 state 632
        pexpr_no_paren:  '(' expr_or_type ')' '{' start_complit braced_keyval_list '}'.    (138)
 
-       .  reduce 138 (src line 1005)
+       .  reduce 138 (src line 1066)
 
 
 state 633
        structdcl:  '(' '*' embed ')' oliteral.    (234)
 
-       .  reduce 234 (src line 1607)
+       .  reduce 234 (src line 1668)
 
 
 state 634
        structdcl:  '*' '(' embed ')' oliteral.    (235)
 
-       .  reduce 235 (src line 1614)
+       .  reduce 235 (src line 1675)
 
 
 state 635
        indcl:  '(' oarg_type_list_ocomma ')' fnres.    (242)
 
-       .  reduce 242 (src line 1669)
+       .  reduce 242 (src line 1730)
 
 
 state 636
        hidden_type_misc:  LMAP '[' hidden_type ']' hidden_type.    (321)
 
-       .  reduce 321 (src line 2037)
+       .  reduce 321 (src line 2098)
 
 
 state 637
        hidden_structdcl_list:  hidden_structdcl_list ';' hidden_structdcl.    (349)
 
-       .  reduce 349 (src line 2228)
+       .  reduce 349 (src line 2289)
 
 
 state 638
        hidden_structdcl:  sym hidden_type oliteral.    (332)
 
-       .  reduce 332 (src line 2111)
+       .  reduce 332 (src line 2172)
 
 
 state 639
        hidden_interfacedcl_list:  hidden_interfacedcl_list ';' hidden_interfacedcl.    (351)
 
-       .  reduce 351 (src line 2238)
+       .  reduce 351 (src line 2299)
 
 
 state 640
@@ -10041,7 +10041,7 @@ state 640
 state 641
        hidden_type_func:  LFUNC '(' ohidden_funarg_list ')' ohidden_funres.    (329)
 
-       .  reduce 329 (src line 2080)
+       .  reduce 329 (src line 2141)
 
 
 state 642
@@ -10081,7 +10081,7 @@ state 645
        '['  shift 77
        '?'  shift 12
        '@'  shift 13
-       .  reduce 212 (src line 1470)
+       .  reduce 212 (src line 1531)
 
        sym  goto 123
        dotname  goto 493
@@ -10193,13 +10193,13 @@ state 647
 state 648
        if_stmt:  LIF $$78 if_header $$79 loop_body $$80 elseif_list else.    (81)
 
-       .  reduce 81 (src line 704)
+       .  reduce 81 (src line 765)
 
 
 state 649
        elseif_list:  elseif_list elseif.    (85)
 
-       .  reduce 85 (src line 739)
+       .  reduce 85 (src line 800)
 
 
 state 650
@@ -10215,7 +10215,7 @@ state 650
 state 651
        pexpr_no_paren:  pexpr '[' oexpr ':' oexpr ':' oexpr ']'.    (133)
 
-       .  reduce 133 (src line 975)
+       .  reduce 133 (src line 1036)
 
 
 state 652
@@ -10240,7 +10240,7 @@ state 653
        '('  shift 612
        '['  shift 342
        '@'  shift 13
-       .  reduce 335 (src line 2145)
+       .  reduce 335 (src line 2206)
 
        hidden_importsym  goto 340
        hidden_funres  goto 611
@@ -10253,13 +10253,13 @@ state 653
 state 654
        hidden_constant:  '(' hidden_literal '+' hidden_literal ')'.    (343)
 
-       .  reduce 343 (src line 2198)
+       .  reduce 343 (src line 2259)
 
 
 state 655
        hidden_funres:  '(' ohidden_funarg_list ')'.    (337)
 
-       .  reduce 337 (src line 2151)
+       .  reduce 337 (src line 2212)
 
 
 state 656
@@ -10277,7 +10277,7 @@ state 656
        '('  shift 612
        '['  shift 342
        '@'  shift 13
-       .  reduce 335 (src line 2145)
+       .  reduce 335 (src line 2206)
 
        hidden_importsym  goto 340
        hidden_funres  goto 611
@@ -10290,51 +10290,51 @@ state 656
 state 657
        fndcl:  '(' oarg_type_list_ocomma ')' sym '(' oarg_type_list_ocomma ')' fnres.    (206)
 
-       .  reduce 206 (src line 1369)
+       .  reduce 206 (src line 1430)
 
 
 state 658
        case:  LCASE expr_or_type_list '=' expr ':'.    (56)
 
-       .  reduce 56 (src line 498)
+       .  reduce 56 (src line 559)
 
 
 state 659
        case:  LCASE expr_or_type_list LCOLAS expr ':'.    (57)
 
-       .  reduce 57 (src line 516)
+       .  reduce 57 (src line 577)
 
 
 state 660
        elseif:  LELSE LIF.$$82 if_header loop_body 
        $$82: .    (82)
 
-       .  reduce 82 (src line 721)
+       .  reduce 82 (src line 782)
 
        $$82  goto 665
 
 state 661
        else:  LELSE compound_stmt.    (87)
 
-       .  reduce 87 (src line 748)
+       .  reduce 87 (src line 809)
 
 
 state 662
        complitexpr:  '{' start_complit braced_keyval_list '}'.    (145)
 
-       .  reduce 145 (src line 1049)
+       .  reduce 145 (src line 1110)
 
 
 state 663
        hidden_interfacedcl:  sym '(' ohidden_funarg_list ')' ohidden_funres.    (333)
 
-       .  reduce 333 (src line 2135)
+       .  reduce 333 (src line 2196)
 
 
 state 664
        hidden_fndcl:  '(' hidden_funarg_list ')' sym '(' ohidden_funarg_list ')' ohidden_funres.    (208)
 
-       .  reduce 208 (src line 1432)
+       .  reduce 208 (src line 1493)
 
 
 state 665
@@ -10360,7 +10360,7 @@ state 665
        '['  shift 77
        '?'  shift 12
        '@'  shift 13
-       .  reduce 294 (src line 1912)
+       .  reduce 294 (src line 1973)
 
        sym  goto 123
        expr  goto 48
@@ -10394,7 +10394,7 @@ state 666
 state 667
        elseif:  LELSE LIF $$82 if_header loop_body.    (83)
 
-       .  reduce 83 (src line 726)
+       .  reduce 83 (src line 787)
 
 
 76 terminals, 142 nonterminals
diff --git a/src/cmd/internal/gc/yaccerrors.go b/src/cmd/internal/gc/yaccerrors.go
deleted file mode 100644 (file)
index 9dc54d9..0000000
+++ /dev/null
@@ -1,194 +0,0 @@
-// Copyright 2010 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.
-
-// +build ignore
-
-// This program implements the core idea from
-//
-//     Clinton L. Jeffery, Generating LR syntax error messages from examples,
-//     ACM TOPLAS 25(5) (September 2003).  http://doi.acm.org/10.1145/937563.937566
-//
-// It reads Bison's summary of a grammar followed by a file
-// like go.errors, replacing lines beginning with % by the
-// yystate and yychar that will be active when an error happens
-// while parsing that line.
-//
-// Unlike the system described in the paper, the lines in go.errors
-// give grammar symbol name lists, not actual program fragments.
-// This is a little less programmer-friendly but doesn't require being
-// able to run the text through lex.c.
-
-package main
-
-import (
-       "bufio"
-       "fmt"
-       "io"
-       "log"
-       "os"
-       "strconv"
-       "strings"
-)
-
-func xatoi(s string) int {
-       n, err := strconv.Atoi(s)
-       if err != nil {
-               log.Fatal(err)
-       }
-       return n
-}
-
-func trimParen(s string) string {
-       s = strings.TrimPrefix(s, "(")
-       s = strings.TrimSuffix(s, ")")
-       return s
-}
-
-type action struct {
-       token string
-       n     int
-}
-
-var shift = map[int][]action{}
-var reduce = map[int][]action{}
-
-type rule struct {
-       lhs  string
-       size int
-}
-
-var rules = map[int]rule{}
-
-func readYaccOutput() {
-       r, err := os.Open("y.output")
-       if err != nil {
-               log.Fatal(err)
-       }
-       defer r.Close()
-
-       var state int
-
-       scanner := bufio.NewScanner(r)
-       for scanner.Scan() {
-               f := strings.Fields(scanner.Text())
-               nf := len(f)
-
-               if nf >= 4 && f[1] == "terminals," && f[3] == "nonterminals" {
-                       // We're done.
-                       break
-               }
-
-               if nf >= 2 && f[0] == "state" {
-                       state = xatoi(f[1])
-                       continue
-               }
-               if nf >= 3 && (f[1] == "shift" || f[1] == "goto") {
-                       shift[state] = append(shift[state], action{f[0], xatoi(f[2])})
-                       continue
-               }
-               if nf >= 3 && f[1] == "reduce" {
-                       reduce[state] = append(reduce[state], action{f[0], xatoi(f[2])})
-                       continue
-               }
-               if nf >= 3 && strings.HasSuffix(f[0], ":") && strings.HasPrefix(f[nf-1], "(") && strings.HasSuffix(f[nf-1], ")") {
-                       n := xatoi(trimParen(f[nf-1]))
-
-                       size := nf - 2
-                       if size == 1 && f[1] == "." {
-                               size = 0
-                       }
-
-                       rules[n] = rule{strings.TrimSuffix(f[0], ":"), size}
-                       continue
-               }
-       }
-}
-
-func runMachine(w io.Writer, s string) {
-       f := strings.Fields(s)
-
-       // Run it through the LR machine and print the induced "yystate, yychar,"
-       // at the point where the error happens.
-
-       var stack []int
-       state := 0
-       i := 1
-       tok := ""
-
-Loop:
-       if tok == "" && i < len(f) {
-               tok = f[i]
-               i++
-       }
-
-       for _, a := range shift[state] {
-               if a.token == tok {
-                       if false {
-                               fmt.Println("SHIFT ", tok, " ", state, " -> ", a)
-                       }
-                       stack = append(stack, state)
-                       state = a.n
-                       tok = ""
-                       goto Loop
-               }
-       }
-
-       for _, a := range reduce[state] {
-               if a.token == tok || a.token == "." {
-                       stack = append(stack, state)
-                       rule, ok := rules[a.n]
-                       if !ok {
-                               log.Fatal("missing rule")
-                       }
-                       stack = stack[:len(stack)-rule.size]
-                       state = stack[len(stack)-1]
-                       stack = stack[:len(stack)-1]
-                       if tok != "" {
-                               i--
-                       }
-                       tok = rule.lhs
-                       if false {
-                               fmt.Println("REDUCE ", stack, " ", state, " ", tok, " rule ", rule)
-                       }
-                       goto Loop
-               }
-       }
-
-       // No shift or reduce applied - found the error.
-       fmt.Fprintf(w, "\t{%d, %s,\n", state, tok)
-}
-
-func processGoErrors() {
-       r, err := os.Open("go.errors")
-       if err != nil {
-               log.Fatal(err)
-       }
-       defer r.Close()
-
-       w, err := os.Create("yymsg.go")
-       if err != nil {
-               log.Fatal(err)
-       }
-       defer w.Close()
-
-       fmt.Fprintf(w, "// DO NOT EDIT - generated with go generate\n\n")
-
-       scanner := bufio.NewScanner(r)
-       for scanner.Scan() {
-               s := scanner.Text()
-
-               // Treat % as first field on line as introducing a pattern (token sequence).
-               if strings.HasPrefix(strings.TrimSpace(s), "%") {
-                       runMachine(w, s)
-                       continue
-               }
-
-               fmt.Fprintln(w, s)
-       }
-}
-
-func main() {
-       readYaccOutput()
-       processGoErrors()
-}
diff --git a/src/cmd/internal/gc/yymsg.go b/src/cmd/internal/gc/yymsg.go
deleted file mode 100644 (file)
index cb45cb8..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-// DO NOT EDIT - generated with go generate
-
-// Copyright 2010 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.
-
-// Example-based syntax error messages.
-// See yaccerrors.go.
-
-package gc
-
-var yymsg = []struct {
-       yystate int
-       yychar  int
-       msg     string
-}{
-       // Each line of the form % token list
-       // is converted by yaccerrors.go into the yystate and yychar caused
-       // by that token list.
-
-       {332, ',',
-               "unexpected comma during import block"},
-
-       {89, ';',
-               "missing import path; require quoted string"},
-
-       {390, ';',
-               "missing { after if clause"},
-
-       {387, ';',
-               "missing { after switch clause"},
-
-       {279, ';',
-               "missing { after for clause"},
-
-       {498, LBODY,
-               "missing { after for clause"},
-
-       {17, '{',
-               "unexpected semicolon or newline before {"},
-
-       {111, ';',
-               "unexpected semicolon or newline in type declaration"},
-
-       {78, '}',
-               "unexpected } in channel type"},
-
-       {78, ')',
-               "unexpected ) in channel type"},
-
-       {78, ',',
-               "unexpected comma in channel type"},
-
-       {416, LELSE,
-               "unexpected semicolon or newline before else"},
-
-       {329, ',',
-               "name list not allowed in interface type"},
-
-       {279, LVAR,
-               "var declaration not allowed in for initializer"},
-
-       {25, '{',
-               "unexpected { at end of statement"},
-
-       {371, '{',
-               "unexpected { at end of statement"},
-
-       {122, ';',
-               "argument to go/defer must be function call"},
-
-       {398, ';',
-               "need trailing comma before newline in composite literal"},
-
-       {414, ';',
-               "need trailing comma before newline in composite literal"},
-
-       {124, LNAME,
-               "nested func not allowed"},
-
-       {650, ';',
-               "else must be followed by if or statement block"},
-}
index 5c7b0b71b1b96163bce6299d2f5c773f12fbd5be..53c0fab17451556cea79caf3100ade24c65d2bb1 100644 (file)
@@ -128,6 +128,7 @@ const (
        TYPEDEF
        TYPENAME
        UNION
+       ERROR
 )
 
 const ENDFILE = 0
@@ -325,8 +326,24 @@ var resrv = []Resrv{
        {"type", TYPEDEF},
        {"union", UNION},
        {"struct", UNION},
+       {"error", ERROR},
 }
 
+type Error struct {
+       lineno int
+       tokens []string
+       msg    string
+}
+
+var errors []Error
+
+type Row struct {
+       actions       []int
+       defaultAction int
+}
+
+var stateTable []Row
+
 var zznewstate = 0
 
 const EOF = -1
@@ -402,6 +419,27 @@ outer:
                        }
                        start = chfind(1, tokname)
 
+               case ERROR:
+                       lno := lineno
+                       var tokens []string
+                       for {
+                               t := gettok()
+                               if t == ':' {
+                                       break
+                               }
+                               if t != IDENTIFIER && t != IDENTCOLON {
+                                       errorf("bad syntax in %%error")
+                               }
+                               tokens = append(tokens, tokname)
+                               if t == IDENTCOLON {
+                                       break
+                               }
+                       }
+                       if gettok() != IDENTIFIER {
+                               errorf("bad syntax in %%error")
+                       }
+                       errors = append(errors, Error{lno, tokens, tokname})
+
                case TYPEDEF:
                        t = gettok()
                        if t != TYPENAME {
@@ -2155,6 +2193,10 @@ func output() {
        }
        fmt.Fprintf(ftable, "\nvar %sExca = [...]int{\n", prefix)
 
+       if len(errors) > 0 {
+               stateTable = make([]Row, nstate)
+       }
+
        noset := mkset()
 
        // output the stuff for state i
@@ -2368,6 +2410,15 @@ func wrstate(i int) {
        var j0, j1, u int
        var pp, qq int
 
+       if len(errors) > 0 {
+               actions := append([]int(nil), temp1...)
+               defaultAction := ERRCODE
+               if lastred != 0 {
+                       defaultAction = -lastred
+               }
+               stateTable[i] = Row{actions, defaultAction}
+       }
+
        if foutput == nil {
                return
        }
@@ -2914,6 +2965,20 @@ func others() {
        }
        fmt.Fprintf(ftable, "%d,\n}\n", 0)
 
+       // Custom error messages.
+       fmt.Fprintf(ftable, "\n")
+       fmt.Fprintf(ftable, "var %sErrorMessages = [...]struct {\n", prefix)
+       fmt.Fprintf(ftable, "\tstate int\n")
+       fmt.Fprintf(ftable, "\ttoken int\n")
+       fmt.Fprintf(ftable, "\tmsg   string\n")
+       fmt.Fprintf(ftable, "}{\n")
+       for _, error := range errors {
+               lineno = error.lineno
+               state, token := runMachine(error.tokens)
+               fmt.Fprintf(ftable, "\t{%v, %v, %s},\n", state, token, error.msg)
+       }
+       fmt.Fprintf(ftable, "}\n")
+
        // copy parser text
        ch := getrune(finput)
        for ch != EOF {
@@ -2932,6 +2997,59 @@ func others() {
        fmt.Fprintf(ftable, "%v", parts[1])
 }
 
+func runMachine(tokens []string) (state, token int) {
+       var stack []int
+       i := 0
+       token = -1
+
+Loop:
+       if token < 0 {
+               token = chfind(2, tokens[i])
+               i++
+       }
+
+       row := stateTable[state]
+
+       c := token
+       if token >= NTBASE {
+               c = token - NTBASE + ntokens
+       }
+       action := row.actions[c]
+       if action == 0 {
+               action = row.defaultAction
+       }
+
+       switch {
+       case action == ACCEPTCODE:
+               errorf("tokens are accepted")
+               return
+       case action == ERRCODE:
+               if token >= NTBASE {
+                       errorf("error at non-terminal token %s", symnam(token))
+               }
+               return
+       case action > 0:
+               // Shift to state action.
+               stack = append(stack, state)
+               state = action
+               token = -1
+               goto Loop
+       default:
+               // Reduce by production -action.
+               prod := prdptr[-action]
+               if rhsLen := len(prod) - 2; rhsLen > 0 {
+                       n := len(stack) - rhsLen
+                       state = stack[n]
+                       stack = stack[:n]
+               }
+               if token >= 0 {
+                       i--
+               }
+               token = prod[0]
+               goto Loop
+       }
+}
+
 func arout(s string, v []int, n int) {
        s = prefix + s
        fmt.Fprintf(ftable, "var %v = [...]int{\n", s)
@@ -3212,7 +3330,6 @@ type $$Parser interface {
 
 type $$ParserImpl struct {
        lookahead func() int
-       state     func() int
 }
 
 func (p *$$ParserImpl) Lookahead() int {
@@ -3222,7 +3339,6 @@ func (p *$$ParserImpl) Lookahead() int {
 func $$NewParser() $$Parser {
        p := &$$ParserImpl{
                lookahead: func() int { return -1 },
-               state:     func() int { return -1 },
        }
        return p
 }
@@ -3253,6 +3369,13 @@ func $$ErrorMessage(state, lookAhead int) string {
        if !$$ErrorVerbose {
                return "syntax error"
        }
+
+       for _, e := range $$ErrorMessages {
+               if e.state == state && e.token == lookAhead {
+                       return "syntax error: " + e.msg
+               }
+       }
+
        res := "syntax error: unexpected " + $$Tokname(lookAhead)
 
        // To match Bison, suggest at most four expected tokens.
@@ -3355,7 +3478,6 @@ func ($$rcvr *$$ParserImpl) Parse($$lex $$Lexer) int {
        $$state := 0
        $$char := -1
        $$token := -1 // $$char translated into internal numbering
-       $$rcvr.state = func() int { return $$state }
        $$rcvr.lookahead = func() int { return $$char }
        defer func() {
                // Make sure we report no lookahead when not parsing.