authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-11-17 01:38:35-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-11-17 01:38:35-05:00
log704374e51294e14285b0b54030c1cb6154868098
treea0e33d754ab4b5fe84961a48711cdeff23dc858b
parent38629628814aae6ba09bc2c25fdbac407a5d9e17
signaturelock-open Commit is signed but in an unrecognized format.

rename `section` keyword to `linksection`

add zig fmt support for this syntax closes #1152

11 files changed, 314 insertions(+), 240 deletions(-)

doc/docgen.zig+1-1
......@@ -764,7 +764,7 @@ fn tokenizeAndPrintRaw(docgen_tokenizer: *Tokenizer, out: var, source_token: Tok
764764 std.zig.Token.Id.Keyword_pub,
765765 std.zig.Token.Id.Keyword_resume,
766766 std.zig.Token.Id.Keyword_return,
767 std.zig.Token.Id.Keyword_section,
767 std.zig.Token.Id.Keyword_linksection,
768768 std.zig.Token.Id.Keyword_stdcallcc,
769769 std.zig.Token.Id.Keyword_struct,
770770 std.zig.Token.Id.Keyword_suspend,
doc/langref.html.in+221-223
......@@ -7713,36 +7713,35 @@ fn readU32Be() u32 {}
77137713 <p>For some discussion on the rationale behind these design decisions, see <a href="https://github.com/ziglang/zig/issues/663">issue #663</a></p>
77147714 {#header_close#}
77157715 {#header_open|Grammar#}
7716 <pre><code class="nohighlight">
7717Root <- skip ContainerMembers eof
7716 <pre><code>Root &lt;- skip ContainerMembers eof
77187717
77197718# *** Top level ***
77207719ContainerMembers
7721 <- TestDecl ContainerMembers
7720 &lt;- TestDecl ContainerMembers
77227721 / TopLevelComptime ContainerMembers
77237722 / KEYWORD_pub? TopLevelDecl ContainerMembers
77247723 / KEYWORD_pub? ContainerField COMMA ContainerMembers
77257724 / KEYWORD_pub? ContainerField
77267725 /
77277726
7728TestDecl <- KEYWORD_test STRINGLITERAL Block
7727TestDecl &lt;- KEYWORD_test STRINGLITERAL Block
77297728
7730TopLevelComptime <- KEYWORD_comptime BlockExpr
7729TopLevelComptime &lt;- KEYWORD_comptime BlockExpr
77317730
77327731TopLevelDecl
7733 <- (KEYWORD_export / KEYWORD_extern STRINGLITERAL? / KEYWORD_inline)? FnProto (SEMICOLON / Block)
7732 &lt;- (KEYWORD_export / KEYWORD_extern STRINGLITERAL? / KEYWORD_inline)? FnProto (SEMICOLON / Block)
77347733 / (KEYWORD_export / KEYWORD_extern STRINGLITERAL?)? VarDecl
77357734 / KEYWORD_use Expr SEMICOLON
77367735
7737FnProto <- FnCC? KEYWORD_fn IDENTIFIER? LPAREN ParamDeclList RPAREN ByteAlign? Section? EXCLAMATIONMARK? (KEYWORD_var / TypeExpr)
7736FnProto &lt;- FnCC? KEYWORD_fn IDENTIFIER? LPAREN ParamDeclList RPAREN ByteAlign? LinkSection? EXCLAMATIONMARK? (KEYWORD_var / TypeExpr)
77387737
7739VarDecl <- (KEYWORD_const / KEYWORD_var) IDENTIFIER (COLON TypeExpr)? ByteAlign? Section? (EQUAL Expr)? SEMICOLON
7738VarDecl &lt;- (KEYWORD_const / KEYWORD_var) IDENTIFIER (COLON TypeExpr)? ByteAlign? LinkSection? (EQUAL Expr)? SEMICOLON
77407739
7741ContainerField <- IDENTIFIER (COLON TypeExpr)? (EQUAL Expr)?
7740ContainerField &lt;- IDENTIFIER (COLON TypeExpr)? (EQUAL Expr)?
77427741
77437742# *** Block Level ***
77447743Statement
7745 <- KEYWORD_comptime? VarDecl
7744 &lt;- KEYWORD_comptime? VarDecl
77467745 / KEYWORD_comptime BlockExprStatement
77477746 / KEYWORD_suspend (SEMICOLON / BlockExprStatement)
77487747 / KEYWORD_defer BlockExprStatement
......@@ -7753,50 +7752,50 @@ Statement
77537752 / AssignExpr SEMICOLON
77547753
77557754IfStatement
7756 <- IfPrefix BlockExpr ( KEYWORD_else Payload? Statement )?
7755 &lt;- IfPrefix BlockExpr ( KEYWORD_else Payload? Statement )?
77577756 / IfPrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement )
77587757
7759LabeledStatement <- BlockLabel? (Block / LoopStatement)
7758LabeledStatement &lt;- BlockLabel? (Block / LoopStatement)
77607759
7761LoopStatement <- KEYWORD_inline? (ForStatement / WhileStatement)
7760LoopStatement &lt;- KEYWORD_inline? (ForStatement / WhileStatement)
77627761
77637762ForStatement
7764 <- ForPrefix BlockExpr ( KEYWORD_else Statement )?
7763 &lt;- ForPrefix BlockExpr ( KEYWORD_else Statement )?
77657764 / ForPrefix AssignExpr ( SEMICOLON / KEYWORD_else Statement )
77667765
77677766WhileStatement
7768 <- WhilePrefix BlockExpr ( KEYWORD_else Payload? Statement )?
7767 &lt;- WhilePrefix BlockExpr ( KEYWORD_else Payload? Statement )?
77697768 / WhilePrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement )
77707769
77717770BlockExprStatement
7772 <- BlockExpr
7771 &lt;- BlockExpr
77737772 / AssignExpr SEMICOLON
77747773
7775BlockExpr <- BlockLabel? Block
7774BlockExpr &lt;- BlockLabel? Block
77767775
77777776# *** Expression Level ***
7778AssignExpr <- Expr (AssignOp Expr)?
7777AssignExpr &lt;- Expr (AssignOp Expr)?
77797778
7780Expr <- KEYWORD_try* BoolOrExpr
7779Expr &lt;- KEYWORD_try* BoolOrExpr
77817780
7782BoolOrExpr <- BoolAndExpr (KEYWORD_or BoolAndExpr)*
7781BoolOrExpr &lt;- BoolAndExpr (KEYWORD_or BoolAndExpr)*
77837782
7784BoolAndExpr <- CompareExpr (KEYWORD_and CompareExpr)*
7783BoolAndExpr &lt;- CompareExpr (KEYWORD_and CompareExpr)*
77857784
7786CompareExpr <- BitwiseExpr (CompareOp BitwiseExpr)?
7785CompareExpr &lt;- BitwiseExpr (CompareOp BitwiseExpr)?
77877786
7788BitwiseExpr <- BitShiftExpr (BitwiseOp BitShiftExpr)*
7787BitwiseExpr &lt;- BitShiftExpr (BitwiseOp BitShiftExpr)*
77897788
7790BitShiftExpr <- AdditionExpr (BitShiftOp AdditionExpr)*
7789BitShiftExpr &lt;- AdditionExpr (BitShiftOp AdditionExpr)*
77917790
7792AdditionExpr <- MultiplyExpr (AdditionOp MultiplyExpr)*
7791AdditionExpr &lt;- MultiplyExpr (AdditionOp MultiplyExpr)*
77937792
7794MultiplyExpr <- PrefixExpr (MultiplyOp PrefixExpr)*
7793MultiplyExpr &lt;- PrefixExpr (MultiplyOp PrefixExpr)*
77957794
7796PrefixExpr <- PrefixOp* PrimaryExpr
7795PrefixExpr &lt;- PrefixOp* PrimaryExpr
77977796
77987797PrimaryExpr
7799 <- AsmExpr
7798 &lt;- AsmExpr
78007799 / IfExpr
78017800 / KEYWORD_break BreakLabel? Expr?
78027801 / KEYWORD_cancel Expr
......@@ -7807,35 +7806,35 @@ PrimaryExpr
78077806 / LabeledExpr
78087807 / CurlySuffixExpr
78097808
7810IfExpr <- IfPrefix Expr (KEYWORD_else Payload? Expr)?
7809IfExpr &lt;- IfPrefix Expr (KEYWORD_else Payload? Expr)?
78117810
7812LabeledExpr <- BlockLabel? (Block / LoopExpr)
7811LabeledExpr &lt;- BlockLabel? (Block / LoopExpr)
78137812
7814Block <- LBRACE Statement* RBRACE
7813Block &lt;- LBRACE Statement* RBRACE
78157814
7816LoopExpr <- KEYWORD_inline? (ForExpr / WhileExpr)
7815LoopExpr &lt;- KEYWORD_inline? (ForExpr / WhileExpr)
78177816
7818ForExpr <- ForPrefix Expr (KEYWORD_else Expr)?
7817ForExpr &lt;- ForPrefix Expr (KEYWORD_else Expr)?
78197818
7820WhileExpr <- WhilePrefix Expr (KEYWORD_else Payload? Expr)?
7819WhileExpr &lt;- WhilePrefix Expr (KEYWORD_else Payload? Expr)?
78217820
7822CurlySuffixExpr <- TypeExpr InitList?
7821CurlySuffixExpr &lt;- TypeExpr InitList?
78237822
78247823InitList
7825 <- LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE
7824 &lt;- LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE
78267825 / LBRACE Expr (COMMA Expr)* COMMA? RBRACE
78277826 / LBRACE RBRACE
78287827
7829TypeExpr <- PrefixTypeOp* ErrorUnionExpr
7828TypeExpr &lt;- PrefixTypeOp* ErrorUnionExpr
78307829
7831ErrorUnionExpr <- SuffixExpr (EXCLAMATIONMARK TypeExpr)?
7830ErrorUnionExpr &lt;- SuffixExpr (EXCLAMATIONMARK TypeExpr)?
78327831
78337832SuffixExpr
7834 <- AsyncPrefix PrimaryTypeExpr SuffixOp* FnCallArgumnets
7833 &lt;- AsyncPrefix PrimaryTypeExpr SuffixOp* FnCallArgumnets
78357834 / PrimaryTypeExpr (SuffixOp / FnCallArgumnets)*
78367835
78377836PrimaryTypeExpr
7838 <- BUILTININDENTIFIER FnCallArgumnets
7837 &lt;- BUILTININDENTIFIER FnCallArgumnets
78397838 / CHAR_LITERAL
78407839 / ContainerDecl
78417840 / ErrorSetDecl
......@@ -7858,91 +7857,91 @@ PrimaryTypeExpr
78587857 / STRINGLITERAL
78597858 / SwitchExpr
78607859
7861ContainerDecl <- (KEYWORD_extern / KEYWORD_packed)? ContainerDeclAuto
7860ContainerDecl &lt;- (KEYWORD_extern / KEYWORD_packed)? ContainerDeclAuto
78627861
7863ErrorSetDecl <- KEYWORD_error LBRACE IdentifierList RBRACE
7862ErrorSetDecl &lt;- KEYWORD_error LBRACE IdentifierList RBRACE
78647863
7865GroupedExpr <- LPAREN Expr RPAREN
7864GroupedExpr &lt;- LPAREN Expr RPAREN
78667865
7867IfTypeExpr <- IfPrefix TypeExpr (KEYWORD_else Payload? TypeExpr)?
7866IfTypeExpr &lt;- IfPrefix TypeExpr (KEYWORD_else Payload? TypeExpr)?
78687867
78697868LabeledTypeExpr
7870 <- BlockLabel Block
7869 &lt;- BlockLabel Block
78717870 / BlockLabel? LoopTypeExpr
78727871
7873LoopTypeExpr <- KEYWORD_inline? (ForTypeExpr / WhileTypeExpr)
7872LoopTypeExpr &lt;- KEYWORD_inline? (ForTypeExpr / WhileTypeExpr)
78747873
7875ForTypeExpr <- ForPrefix TypeExpr (KEYWORD_else TypeExpr)?
7874ForTypeExpr &lt;- ForPrefix TypeExpr (KEYWORD_else TypeExpr)?
78767875
7877WhileTypeExpr <- WhilePrefix TypeExpr (KEYWORD_else Payload? TypeExpr)?
7876WhileTypeExpr &lt;- WhilePrefix TypeExpr (KEYWORD_else Payload? TypeExpr)?
78787877
7879SwitchExpr <- KEYWORD_switch LPAREN Expr RPAREN LBRACE SwitchProngList RBRACE
7878SwitchExpr &lt;- KEYWORD_switch LPAREN Expr RPAREN LBRACE SwitchProngList RBRACE
78807879
78817880# *** Assembly ***
7882AsmExpr <- KEYWORD_asm KEYWORD_volatile? LPAREN STRINGLITERAL AsmOutput? RPAREN
7881AsmExpr &lt;- KEYWORD_asm KEYWORD_volatile? LPAREN STRINGLITERAL AsmOutput? RPAREN
78837882
7884AsmOutput <- COLON AsmOutputList AsmInput?
7883AsmOutput &lt;- COLON AsmOutputList AsmInput?
78857884
7886AsmOutputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN
7885AsmOutputItem &lt;- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN
78877886
7888AsmInput <- COLON AsmInputList AsmCloppers?
7887AsmInput &lt;- COLON AsmInputList AsmCloppers?
78897888
7890AsmInputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN
7889AsmInputItem &lt;- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN
78917890
7892AsmCloppers <- COLON StringList
7891AsmCloppers &lt;- COLON StringList
78937892
78947893# *** Helper grammar ***
7895BreakLabel <- COLON IDENTIFIER
7894BreakLabel &lt;- COLON IDENTIFIER
78967895
7897BlockLabel <- IDENTIFIER COLON
7896BlockLabel &lt;- IDENTIFIER COLON
78987897
7899FieldInit <- DOT IDENTIFIER EQUAL Expr
7898FieldInit &lt;- DOT IDENTIFIER EQUAL Expr
79007899
7901WhileContinueExpr <- COLON LPAREN AssignExpr RPAREN
7900WhileContinueExpr &lt;- COLON LPAREN AssignExpr RPAREN
79027901
7903Section <- KEYWORD_section LPAREN Expr RPAREN
7902LinkSection &lt;- KEYWORD_linksection LPAREN Expr RPAREN
79047903
79057904# Fn specific
79067905FnCC
7907 <- KEYWORD_nakedcc
7906 &lt;- KEYWORD_nakedcc
79087907 / KEYWORD_stdcallcc
79097908 / KEYWORD_extern
79107909 / KEYWORD_async (LARROW TypeExpr RARROW)?
79117910
7912ParamDecl <- (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType
7911ParamDecl &lt;- (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType
79137912
79147913ParamType
7915 <- KEYWORD_var
7914 &lt;- KEYWORD_var
79167915 / DOT3
79177916 / TypeExpr
79187917
79197918# Control flow prefixes
7920IfPrefix <- KEYWORD_if LPAREN Expr RPAREN PtrPayload?
7919IfPrefix &lt;- KEYWORD_if LPAREN Expr RPAREN PtrPayload?
79217920
7922WhilePrefix <- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr?
7921WhilePrefix &lt;- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr?
79237922
7924ForPrefix <- KEYWORD_for LPAREN Expr RPAREN PtrIndexPayload
7923ForPrefix &lt;- KEYWORD_for LPAREN Expr RPAREN PtrIndexPayload
79257924
79267925# Payloads
7927Payload <- PIPE IDENTIFIER PIPE
7926Payload &lt;- PIPE IDENTIFIER PIPE
79287927
7929PtrPayload <- PIPE ASTERISK? IDENTIFIER PIPE
7928PtrPayload &lt;- PIPE ASTERISK? IDENTIFIER PIPE
79307929
7931PtrIndexPayload <- PIPE ASTERISK? IDENTIFIER (COMMA IDENTIFIER)? PIPE
7930PtrIndexPayload &lt;- PIPE ASTERISK? IDENTIFIER (COMMA IDENTIFIER)? PIPE
79327931
79337932
79347933# Switch specific
7935SwitchProng <- SwitchCase EQUALRARROW PtrPayload? AssignExpr
7934SwitchProng &lt;- SwitchCase EQUALRARROW PtrPayload? AssignExpr
79367935
79377936SwitchCase
7938 <- SwitchItem (COMMA SwitchItem)* COMMA?
7937 &lt;- SwitchItem (COMMA SwitchItem)* COMMA?
79397938 / KEYWORD_else
79407939
7941SwitchItem <- Expr (DOT3 Expr)?
7940SwitchItem &lt;- Expr (DOT3 Expr)?
79427941
79437942# Operators
79447943AssignOp
7945 <- ASTERISKEQUAL
7944 &lt;- ASTERISKEQUAL
79467945 / SLASHEQUAL
79477946 / PERCENTEQUAL
79487947 / PLUSEQUAL
......@@ -7958,7 +7957,7 @@ AssignOp
79587957 / EQUAL
79597958
79607959CompareOp
7961 <- EQUALEQUAL
7960 &lt;- EQUALEQUAL
79627961 / EXCLAMATIONMARKEQUAL
79637962 / LARROW
79647963 / RARROW
......@@ -7966,25 +7965,25 @@ CompareOp
79667965 / RARROWEQUAL
79677966
79687967BitwiseOp
7969 <- AMPERSAND
7968 &lt;- AMPERSAND
79707969 / CARET
79717970 / PIPE
79727971 / KEYWORD_orelse
79737972 / KEYWORD_catch Payload?
79747973
79757974BitShiftOp
7976 <- LARROW2
7975 &lt;- LARROW2
79777976 / RARROW2
79787977
79797978AdditionOp
7980 <- PLUS
7979 &lt;- PLUS
79817980 / MINUS
79827981 / PLUS2
79837982 / PLUSPERCENT
79847983 / MINUSPERCENT
79857984
79867985MultiplyOp
7987 <- PIPE2
7986 &lt;- PIPE2
79887987 / ASTERISK
79897988 / SLASH
79907989 / PERCENT
......@@ -7992,7 +7991,7 @@ MultiplyOp
79927991 / ASTERISKPERCENT
79937992
79947993PrefixOp
7995 <- EXCLAMATIONMARK
7994 &lt;- EXCLAMATIONMARK
79967995 / MINUS
79977996 / TILDE
79987997 / MINUSPERCENT
......@@ -8001,77 +8000,77 @@ PrefixOp
80018000 / KEYWORD_await
80028001
80038002PrefixTypeOp
8004 <- QUESTIONMARK
8003 &lt;- QUESTIONMARK
80058004 / KEYWORD_promise MINUSRARROW
80068005 / ArrayTypeStart (ByteAlign / KEYWORD_const / KEYWORD_volatile)*
80078006 / PtrTypeStart (KEYWORD_align LPAREN Expr (COLON INTEGER COLON INTEGER)? RPAREN / KEYWORD_const / KEYWORD_volatile)*
80088007
80098008SuffixOp
8010 <- LBRACKET Expr (DOT2 Expr?)? RBRACKET
8009 &lt;- LBRACKET Expr (DOT2 Expr?)? RBRACKET
80118010 / DOT IDENTIFIER
80128011 / DOTASTERISK
80138012 / DOTQUESTIONMARK
80148013
8015AsyncPrefix <- KEYWORD_async (LARROW PrefixExpr RARROW)?
8014AsyncPrefix &lt;- KEYWORD_async (LARROW PrefixExpr RARROW)?
80168015
8017FnCallArgumnets <- LPAREN ExprList RPAREN
8016FnCallArgumnets &lt;- LPAREN ExprList RPAREN
80188017
80198018# Ptr specific
8020ArrayTypeStart <- LBRACKET Expr? RBRACKET
8019ArrayTypeStart &lt;- LBRACKET Expr? RBRACKET
80218020
80228021PtrTypeStart
8023 <- ASTERISK
8022 &lt;- ASTERISK
80248023 / ASTERISK2
80258024 / LBRACKET ASTERISK RBRACKET
80268025
80278026# ContainerDecl specific
8028ContainerDeclAuto <- ContainerDeclType LBRACE ContainerMembers RBRACE
8027ContainerDeclAuto &lt;- ContainerDeclType LBRACE ContainerMembers RBRACE
80298028
80308029ContainerDeclType
8031 <- (KEYWORD_struct / KEYWORD_enum) (LPAREN Expr RPAREN)?
8030 &lt;- (KEYWORD_struct / KEYWORD_enum) (LPAREN Expr RPAREN)?
80328031 / KEYWORD_union (LPAREN (KEYWORD_enum (LPAREN Expr RPAREN)? / Expr) RPAREN)?
80338032
80348033# Alignment
8035ByteAlign <- KEYWORD_align LPAREN Expr RPAREN
8034ByteAlign &lt;- KEYWORD_align LPAREN Expr RPAREN
80368035
80378036# Lists
8038IdentifierList <- (IDENTIFIER COMMA)* IDENTIFIER?
8037IdentifierList &lt;- (IDENTIFIER COMMA)* IDENTIFIER?
80398038
8040SwitchProngList <- (SwitchProng COMMA)* SwitchProng?
8039SwitchProngList &lt;- (SwitchProng COMMA)* SwitchProng?
80418040
8042AsmOutputList <- (AsmOutputItem COMMA)* AsmOutputItem?
8041AsmOutputList &lt;- (AsmOutputItem COMMA)* AsmOutputItem?
80438042
8044AsmInputList <- (AsmInputItem COMMA)* AsmInputItem?
8043AsmInputList &lt;- (AsmInputItem COMMA)* AsmInputItem?
80458044
8046StringList <- (STRINGLITERAL COMMA)* STRINGLITERAL?
8045StringList &lt;- (STRINGLITERAL COMMA)* STRINGLITERAL?
80478046
8048ParamDeclList <- (ParamDecl COMMA)* ParamDecl?
8047ParamDeclList &lt;- (ParamDecl COMMA)* ParamDecl?
80498048
8050ExprList <- (Expr COMMA)* Expr?
8049ExprList &lt;- (Expr COMMA)* Expr?
80518050
80528051# *** Tokens ***
8053eof <- !.
8054hex <- [0-9a-fA-F]
8052eof &lt;- !.
8053hex &lt;- [0-9a-fA-F]
80558054char_escape
8056 <- "\\x" hex hex
8055 &lt;- "\\x" hex hex
80578056 / "\\u" hex hex hex hex
80588057 / "\\U" hex hex hex hex hex hex
80598058 / "\\" [nr\\t'"]
80608059char_char
8061 <- char_escape
8060 &lt;- char_escape
80628061 / [^\\'\n]
80638062string_char
8064 <- char_escape
8063 &lt;- char_escape
80658064 / [^\\"\n]
80668065
8067line_comment <- '//'[^\n]*
8068line_string <- ("\\\\" [^\n]* [ \n]*)+
8069line_cstring <- ("c\\\\" [^\n]* [ \n]*)+
8070skip <- ([ \n] / line_comment)*
8066line_comment &lt;- '//'[^\n]*
8067line_string &lt;- ("\\\\" [^\n]* [ \n]*)+
8068line_cstring &lt;- ("c\\\\" [^\n]* [ \n]*)+
8069skip &lt;- ([ \n] / line_comment)*
80718070
8072CHAR_LITERAL <- "'" char_char "'" skip
8071CHAR_LITERAL &lt;- "'" char_char "'" skip
80738072FLOAT
8074 <- "0b" [01]+ "." [01]+ ([eE] [-+]? [01]+)? skip
8073 &lt;- "0b" [01]+ "." [01]+ ([eE] [-+]? [01]+)? skip
80758074 / "0o" [0-7]+ "." [0-7]+ ([eE] [-+]? [0-7]+)? skip
80768075 / "0x" hex+ "." hex+ ([pP] [-+]? hex+)? skip
80778076 / [0-9]+ "." [0-9]+ ([eE] [-+]? [0-9]+)? skip
......@@ -8080,128 +8079,128 @@ FLOAT
80808079 / "0x" hex+ "."? [pP] [-+]? hex+ skip
80818080 / [0-9]+ "."? [eE] [-+]? [0-9]+ skip
80828081INTEGER
8083 <- "0b" [01]+ skip
8082 &lt;- "0b" [01]+ skip
80848083 / "0o" [0-7]+ skip
80858084 / "0x" hex+ skip
80868085 / [0-9]+ skip
80878086STRINGLITERAL
8088 <- "c"? "\"" string_char* "\"" skip
8087 &lt;- "c"? "\"" string_char* "\"" skip
80898088 / line_string skip
80908089 / line_cstring skip
80918090IDENTIFIER
8092 <- !keyword ("c" !["\\] / [A-Zabd-z_]) [A-Za-z0-9_]* skip
8091 &lt;- !keyword ("c" !["\\] / [A-Zabd-z_]) [A-Za-z0-9_]* skip
80938092 / "@\"" string_char* "\"" skip
8094BUILTININDENTIFIER <- "@"[A-Za-z_][A-Za-z0-9_]* skip
8095
8096
8097AMPERSAND <- '&' ![=] skip
8098AMPERSANDEQUAL <- '&=' skip
8099ASTERISK <- '*' ![*%=] skip
8100ASTERISK2 <- '**' skip
8101ASTERISKEQUAL <- '*=' skip
8102ASTERISKPERCENT <- '*%' ![=] skip
8103ASTERISKPERCENTEQUAL <- '*%=' skip
8104CARET <- '^' ![=] skip
8105CARETEQUAL <- '^=' skip
8106COLON <- ':' skip
8107COMMA <- ',' skip
8108DOT <- '.' ![*.?] skip
8109DOT2 <- '..' ![.] skip
8110DOT3 <- '...' skip
8111DOTASTERISK <- '.*' skip
8112DOTQUESTIONMARK <- '.?' skip
8113EQUAL <- '=' ![>=] skip
8114EQUALEQUAL <- '==' skip
8115EQUALRARROW <- '=>' skip
8116EXCLAMATIONMARK <- '!' ![=] skip
8117EXCLAMATIONMARKEQUAL <- '!=' skip
8118LARROW <- '<' ![<=] skip
8119LARROW2 <- '<<' ![=] skip
8120LARROW2EQUAL <- '<<=' skip
8121LARROWEQUAL <- '<=' skip
8122LBRACE <- '{' skip
8123LBRACKET <- '[' skip
8124LPAREN <- '(' skip
8125MINUS <- '-' ![%=>] skip
8126MINUSEQUAL <- '-=' skip
8127MINUSPERCENT <- '-%' ![=] skip
8128MINUSPERCENTEQUAL <- '-%=' skip
8129MINUSRARROW <- '->' skip
8130PERCENT <- '%' ![=] skip
8131PERCENTEQUAL <- '%=' skip
8132PIPE <- '|' ![|=] skip
8133PIPE2 <- '||' skip
8134PIPEEQUAL <- '|=' skip
8135PLUS <- '+' ![%+=] skip
8136PLUS2 <- '++' skip
8137PLUSEQUAL <- '+=' skip
8138PLUSPERCENT <- '+%' ![=] skip
8139PLUSPERCENTEQUAL <- '+%=' skip
8140QUESTIONMARK <- '?' skip
8141RARROW <- '>' ![>=] skip
8142RARROW2 <- '>>' ![=] skip
8143RARROW2EQUAL <- '>>=' skip
8144RARROWEQUAL <- '>=' skip
8145RBRACE <- '}' skip
8146RBRACKET <- ']' skip
8147RPAREN <- ')' skip
8148SEMICOLON <- ';' skip
8149SLASH <- '/' ![=] skip
8150SLASHEQUAL <- '/=' skip
8151TILDE <- '~' skip
8152
8153end_of_word <- ![a-zA-Z0-9_] skip
8154KEYWORD_align <- 'align' end_of_word
8155KEYWORD_and <- 'and' end_of_word
8156KEYWORD_anyerror <- 'anyerror' end_of_word
8157KEYWORD_asm <- 'asm' end_of_word
8158KEYWORD_async <- 'async' end_of_word
8159KEYWORD_await <- 'await' end_of_word
8160KEYWORD_break <- 'break' end_of_word
8161KEYWORD_cancel <- 'cancel' end_of_word
8162KEYWORD_catch <- 'catch' end_of_word
8163KEYWORD_comptime <- 'comptime' end_of_word
8164KEYWORD_const <- 'const' end_of_word
8165KEYWORD_continue <- 'continue' end_of_word
8166KEYWORD_defer <- 'defer' end_of_word
8167KEYWORD_else <- 'else' end_of_word
8168KEYWORD_enum <- 'enum' end_of_word
8169KEYWORD_errdefer <- 'errdefer' end_of_word
8170KEYWORD_error <- 'error' end_of_word
8171KEYWORD_export <- 'export' end_of_word
8172KEYWORD_extern <- 'extern' end_of_word
8173KEYWORD_false <- 'false' end_of_word
8174KEYWORD_fn <- 'fn' end_of_word
8175KEYWORD_for <- 'for' end_of_word
8176KEYWORD_if <- 'if' end_of_word
8177KEYWORD_inline <- 'inline' end_of_word
8178KEYWORD_nakedcc <- 'nakedcc' end_of_word
8179KEYWORD_noalias <- 'noalias' end_of_word
8180KEYWORD_null <- 'null' end_of_word
8181KEYWORD_or <- 'or' end_of_word
8182KEYWORD_orelse <- 'orelse' end_of_word
8183KEYWORD_packed <- 'packed' end_of_word
8184KEYWORD_promise <- 'promise' end_of_word
8185KEYWORD_pub <- 'pub' end_of_word
8186KEYWORD_resume <- 'resume' end_of_word
8187KEYWORD_return <- 'return' end_of_word
8188KEYWORD_section <- 'section' end_of_word
8189KEYWORD_stdcallcc <- 'stdcallcc' end_of_word
8190KEYWORD_struct <- 'struct' end_of_word
8191KEYWORD_suspend <- 'suspend' end_of_word
8192KEYWORD_switch <- 'switch' end_of_word
8193KEYWORD_test <- 'test' end_of_word
8194KEYWORD_true <- 'true' end_of_word
8195KEYWORD_try <- 'try' end_of_word
8196KEYWORD_undefined <- 'undefined' end_of_word
8197KEYWORD_union <- 'union' end_of_word
8198KEYWORD_unreachable <- 'unreachable' end_of_word
8199KEYWORD_use <- 'use' end_of_word
8200KEYWORD_var <- 'var' end_of_word
8201KEYWORD_volatile <- 'volatile' end_of_word
8202KEYWORD_while <- 'while' end_of_word
8203
8204keyword <- KEYWORD_align / KEYWORD_and / KEYWORD_anyerror / KEYWORD_asm
8093BUILTININDENTIFIER &lt;- "@"[A-Za-z_][A-Za-z0-9_]* skip
8094
8095
8096AMPERSAND &lt;- '&' ![=] skip
8097AMPERSANDEQUAL &lt;- '&=' skip
8098ASTERISK &lt;- '*' ![*%=] skip
8099ASTERISK2 &lt;- '**' skip
8100ASTERISKEQUAL &lt;- '*=' skip
8101ASTERISKPERCENT &lt;- '*%' ![=] skip
8102ASTERISKPERCENTEQUAL &lt;- '*%=' skip
8103CARET &lt;- '^' ![=] skip
8104CARETEQUAL &lt;- '^=' skip
8105COLON &lt;- ':' skip
8106COMMA &lt;- ',' skip
8107DOT &lt;- '.' ![*.?] skip
8108DOT2 &lt;- '..' ![.] skip
8109DOT3 &lt;- '...' skip
8110DOTASTERISK &lt;- '.*' skip
8111DOTQUESTIONMARK &lt;- '.?' skip
8112EQUAL &lt;- '=' ![>=] skip
8113EQUALEQUAL &lt;- '==' skip
8114EQUALRARROW &lt;- '=>' skip
8115EXCLAMATIONMARK &lt;- '!' ![=] skip
8116EXCLAMATIONMARKEQUAL &lt;- '!=' skip
8117LARROW &lt;- '&lt;' ![&lt;=] skip
8118LARROW2 &lt;- '&lt;&lt;' ![=] skip
8119LARROW2EQUAL &lt;- '&lt;&lt;=' skip
8120LARROWEQUAL &lt;- '&lt;=' skip
8121LBRACE &lt;- '{' skip
8122LBRACKET &lt;- '[' skip
8123LPAREN &lt;- '(' skip
8124MINUS &lt;- '-' ![%=>] skip
8125MINUSEQUAL &lt;- '-=' skip
8126MINUSPERCENT &lt;- '-%' ![=] skip
8127MINUSPERCENTEQUAL &lt;- '-%=' skip
8128MINUSRARROW &lt;- '->' skip
8129PERCENT &lt;- '%' ![=] skip
8130PERCENTEQUAL &lt;- '%=' skip
8131PIPE &lt;- '|' ![|=] skip
8132PIPE2 &lt;- '||' skip
8133PIPEEQUAL &lt;- '|=' skip
8134PLUS &lt;- '+' ![%+=] skip
8135PLUS2 &lt;- '++' skip
8136PLUSEQUAL &lt;- '+=' skip
8137PLUSPERCENT &lt;- '+%' ![=] skip
8138PLUSPERCENTEQUAL &lt;- '+%=' skip
8139QUESTIONMARK &lt;- '?' skip
8140RARROW &lt;- '>' ![>=] skip
8141RARROW2 &lt;- '>>' ![=] skip
8142RARROW2EQUAL &lt;- '>>=' skip
8143RARROWEQUAL &lt;- '>=' skip
8144RBRACE &lt;- '}' skip
8145RBRACKET &lt;- ']' skip
8146RPAREN &lt;- ')' skip
8147SEMICOLON &lt;- ';' skip
8148SLASH &lt;- '/' ![=] skip
8149SLASHEQUAL &lt;- '/=' skip
8150TILDE &lt;- '~' skip
8151
8152end_of_word &lt;- ![a-zA-Z0-9_] skip
8153KEYWORD_align &lt;- 'align' end_of_word
8154KEYWORD_and &lt;- 'and' end_of_word
8155KEYWORD_anyerror &lt;- 'anyerror' end_of_word
8156KEYWORD_asm &lt;- 'asm' end_of_word
8157KEYWORD_async &lt;- 'async' end_of_word
8158KEYWORD_await &lt;- 'await' end_of_word
8159KEYWORD_break &lt;- 'break' end_of_word
8160KEYWORD_cancel &lt;- 'cancel' end_of_word
8161KEYWORD_catch &lt;- 'catch' end_of_word
8162KEYWORD_comptime &lt;- 'comptime' end_of_word
8163KEYWORD_const &lt;- 'const' end_of_word
8164KEYWORD_continue &lt;- 'continue' end_of_word
8165KEYWORD_defer &lt;- 'defer' end_of_word
8166KEYWORD_else &lt;- 'else' end_of_word
8167KEYWORD_enum &lt;- 'enum' end_of_word
8168KEYWORD_errdefer &lt;- 'errdefer' end_of_word
8169KEYWORD_error &lt;- 'error' end_of_word
8170KEYWORD_export &lt;- 'export' end_of_word
8171KEYWORD_extern &lt;- 'extern' end_of_word
8172KEYWORD_false &lt;- 'false' end_of_word
8173KEYWORD_fn &lt;- 'fn' end_of_word
8174KEYWORD_for &lt;- 'for' end_of_word
8175KEYWORD_if &lt;- 'if' end_of_word
8176KEYWORD_inline &lt;- 'inline' end_of_word
8177KEYWORD_nakedcc &lt;- 'nakedcc' end_of_word
8178KEYWORD_noalias &lt;- 'noalias' end_of_word
8179KEYWORD_null &lt;- 'null' end_of_word
8180KEYWORD_or &lt;- 'or' end_of_word
8181KEYWORD_orelse &lt;- 'orelse' end_of_word
8182KEYWORD_packed &lt;- 'packed' end_of_word
8183KEYWORD_promise &lt;- 'promise' end_of_word
8184KEYWORD_pub &lt;- 'pub' end_of_word
8185KEYWORD_resume &lt;- 'resume' end_of_word
8186KEYWORD_return &lt;- 'return' end_of_word
8187KEYWORD_linksection &lt;- 'linksection' end_of_word
8188KEYWORD_stdcallcc &lt;- 'stdcallcc' end_of_word
8189KEYWORD_struct &lt;- 'struct' end_of_word
8190KEYWORD_suspend &lt;- 'suspend' end_of_word
8191KEYWORD_switch &lt;- 'switch' end_of_word
8192KEYWORD_test &lt;- 'test' end_of_word
8193KEYWORD_true &lt;- 'true' end_of_word
8194KEYWORD_try &lt;- 'try' end_of_word
8195KEYWORD_undefined &lt;- 'undefined' end_of_word
8196KEYWORD_union &lt;- 'union' end_of_word
8197KEYWORD_unreachable &lt;- 'unreachable' end_of_word
8198KEYWORD_use &lt;- 'use' end_of_word
8199KEYWORD_var &lt;- 'var' end_of_word
8200KEYWORD_volatile &lt;- 'volatile' end_of_word
8201KEYWORD_while &lt;- 'while' end_of_word
8202
8203keyword &lt;- KEYWORD_align / KEYWORD_and / KEYWORD_anyerror / KEYWORD_asm
82058204 / KEYWORD_async / KEYWORD_await / KEYWORD_break / KEYWORD_cancel
82068205 / KEYWORD_catch / KEYWORD_comptime / KEYWORD_const / KEYWORD_continue
82078206 / KEYWORD_defer / KEYWORD_else / KEYWORD_enum / KEYWORD_errdefer
......@@ -8209,12 +8208,11 @@ keyword <- KEYWORD_align / KEYWORD_and / KEYWORD_anyerror / KEYWORD_asm
82098208 / KEYWORD_fn / KEYWORD_for / KEYWORD_if / KEYWORD_inline
82108209 / KEYWORD_nakedcc / KEYWORD_noalias / KEYWORD_null / KEYWORD_or
82118210 / KEYWORD_orelse / KEYWORD_packed / KEYWORD_promise / KEYWORD_pub
8212 / KEYWORD_resume / KEYWORD_return / KEYWORD_section
8211 / KEYWORD_resume / KEYWORD_return / KEYWORD_linksection
82138212 / KEYWORD_stdcallcc / KEYWORD_struct / KEYWORD_suspend
82148213 / KEYWORD_switch / KEYWORD_test / KEYWORD_true / KEYWORD_try
82158214 / KEYWORD_undefined / KEYWORD_union / KEYWORD_unreachable
8216 / KEYWORD_use / KEYWORD_var / KEYWORD_volatile / KEYWORD_while
8217</code></pre>
8215 / KEYWORD_use / KEYWORD_var / KEYWORD_volatile / KEYWORD_while</code></pre>
82188216 {#header_close#}
82198217 {#header_open|Zen#}
82208218 <ul>
src/parser.cpp+1-1
......@@ -2082,7 +2082,7 @@ static AstNode *ast_parse_while_continue_expr(ParseContext *pc) {
20822082
20832083// Section <- KEYWORD_section LPAREN Expr RPAREN
20842084static AstNode *ast_parse_section(ParseContext *pc) {
2085 Token *first = eat_token_if(pc, TokenIdKeywordSection);
2085 Token *first = eat_token_if(pc, TokenIdKeywordLinkSection);
20862086 if (first == nullptr)
20872087 return nullptr;
20882088
src/tokenizer.cpp+2-2
......@@ -140,7 +140,7 @@ static const struct ZigKeyword zig_keywords[] = {
140140 {"pub", TokenIdKeywordPub},
141141 {"resume", TokenIdKeywordResume},
142142 {"return", TokenIdKeywordReturn},
143 {"section", TokenIdKeywordSection},
143 {"linksection", TokenIdKeywordLinkSection},
144144 {"stdcallcc", TokenIdKeywordStdcallCC},
145145 {"struct", TokenIdKeywordStruct},
146146 {"suspend", TokenIdKeywordSuspend},
......@@ -1583,7 +1583,7 @@ const char * token_name(TokenId id) {
15831583 case TokenIdKeywordPromise: return "promise";
15841584 case TokenIdKeywordPub: return "pub";
15851585 case TokenIdKeywordReturn: return "return";
1586 case TokenIdKeywordSection: return "section";
1586 case TokenIdKeywordLinkSection: return "linksection";
15871587 case TokenIdKeywordStdcallCC: return "stdcallcc";
15881588 case TokenIdKeywordStruct: return "struct";
15891589 case TokenIdKeywordSwitch: return "switch";
src/tokenizer.hpp+1-1
......@@ -82,7 +82,7 @@ enum TokenId {
8282 TokenIdKeywordPub,
8383 TokenIdKeywordResume,
8484 TokenIdKeywordReturn,
85 TokenIdKeywordSection,
85 TokenIdKeywordLinkSection,
8686 TokenIdKeywordStdcallCC,
8787 TokenIdKeywordStruct,
8888 TokenIdKeywordSuspend,
std/zig/ast.zig+12
......@@ -503,6 +503,7 @@ pub const Node = struct {
503503 lib_name: ?*Node,
504504 type_node: ?*Node,
505505 align_node: ?*Node,
506 section_node: ?*Node,
506507 init_node: ?*Node,
507508 semicolon_token: TokenIndex,
508509
......@@ -519,6 +520,11 @@ pub const Node = struct {
519520 i -= 1;
520521 }
521522
523 if (self.section_node) |section_node| {
524 if (i < 1) return section_node;
525 i -= 1;
526 }
527
522528 if (self.init_node) |init_node| {
523529 if (i < 1) return init_node;
524530 i -= 1;
......@@ -821,6 +827,7 @@ pub const Node = struct {
821827 body_node: ?*Node,
822828 lib_name: ?*Node, // populated if this is an extern declaration
823829 align_expr: ?*Node, // populated if align(A) is present
830 section_expr: ?*Node, // populated if linksection(A) is present
824831
825832 pub const ParamList = SegmentedList(*Node, 2);
826833
......@@ -845,6 +852,11 @@ pub const Node = struct {
845852 i -= 1;
846853 }
847854
855 if (self.section_expr) |section_expr| {
856 if (i < 1) return section_expr;
857 i -= 1;
858 }
859
848860 switch (self.return_type) {
849861 // TODO allow this and next prong to share bodies since the types are the same
850862 ReturnType.Explicit => |node| {
std/zig/parse.zig+35-2
......@@ -291,6 +291,7 @@ pub fn parse(allocator: *mem.Allocator, source: []const u8) !ast.Tree {
291291 .body_node = null,
292292 .lib_name = ctx.lib_name,
293293 .align_expr = null,
294 .section_expr = null,
294295 });
295296 try ctx.decls.push(&fn_proto.base);
296297 stack.append(State{ .FnDef = fn_proto }) catch unreachable;
......@@ -601,6 +602,7 @@ pub fn parse(allocator: *mem.Allocator, source: []const u8) !ast.Tree {
601602 .extern_export_token = ctx.extern_export_token,
602603 .type_node = null,
603604 .align_node = null,
605 .section_node = null,
604606 .init_node = null,
605607 .lib_name = ctx.lib_name,
606608 // initialized later
......@@ -622,7 +624,7 @@ pub fn parse(allocator: *mem.Allocator, source: []const u8) !ast.Tree {
622624 continue;
623625 },
624626 State.VarDeclAlign => |var_decl| {
625 try stack.append(State{ .VarDeclEq = var_decl });
627 try stack.append(State{ .VarDeclSection = var_decl });
626628
627629 const next_token = nextToken(&tok_it, &tree);
628630 const next_token_index = next_token.index;
......@@ -637,6 +639,22 @@ pub fn parse(allocator: *mem.Allocator, source: []const u8) !ast.Tree {
637639 prevToken(&tok_it, &tree);
638640 continue;
639641 },
642 State.VarDeclSection => |var_decl| {
643 try stack.append(State{ .VarDeclEq = var_decl });
644
645 const next_token = nextToken(&tok_it, &tree);
646 const next_token_index = next_token.index;
647 const next_token_ptr = next_token.ptr;
648 if (next_token_ptr.id == Token.Id.Keyword_linksection) {
649 try stack.append(State{ .ExpectToken = Token.Id.RParen });
650 try stack.append(State{ .Expression = OptionalCtx{ .RequiredNull = &var_decl.section_node } });
651 try stack.append(State{ .ExpectToken = Token.Id.LParen });
652 continue;
653 }
654
655 prevToken(&tok_it, &tree);
656 continue;
657 },
640658 State.VarDeclEq => |var_decl| {
641659 const token = nextToken(&tok_it, &tree);
642660 const token_index = token.index;
......@@ -719,7 +737,7 @@ pub fn parse(allocator: *mem.Allocator, source: []const u8) !ast.Tree {
719737 continue;
720738 },
721739 State.FnProtoAlign => |fn_proto| {
722 stack.append(State{ .FnProtoReturnType = fn_proto }) catch unreachable;
740 stack.append(State{ .FnProtoSection = fn_proto }) catch unreachable;
723741
724742 if (eatToken(&tok_it, &tree, Token.Id.Keyword_align)) |align_token| {
725743 try stack.append(State{ .ExpectToken = Token.Id.RParen });
......@@ -728,6 +746,16 @@ pub fn parse(allocator: *mem.Allocator, source: []const u8) !ast.Tree {
728746 }
729747 continue;
730748 },
749 State.FnProtoSection => |fn_proto| {
750 stack.append(State{ .FnProtoReturnType = fn_proto }) catch unreachable;
751
752 if (eatToken(&tok_it, &tree, Token.Id.Keyword_linksection)) |align_token| {
753 try stack.append(State{ .ExpectToken = Token.Id.RParen });
754 try stack.append(State{ .Expression = OptionalCtx{ .RequiredNull = &fn_proto.section_expr } });
755 try stack.append(State{ .ExpectToken = Token.Id.LParen });
756 }
757 continue;
758 },
731759 State.FnProtoReturnType => |fn_proto| {
732760 const token = nextToken(&tok_it, &tree);
733761 const token_index = token.index;
......@@ -1524,6 +1552,7 @@ pub fn parse(allocator: *mem.Allocator, source: []const u8) !ast.Tree {
15241552 .body_node = null,
15251553 .lib_name = null,
15261554 .align_expr = null,
1555 .section_expr = null,
15271556 });
15281557 ctx.opt_ctx.store(&fn_proto.base);
15291558 stack.append(State{ .FnProto = fn_proto }) catch unreachable;
......@@ -2579,6 +2608,7 @@ pub fn parse(allocator: *mem.Allocator, source: []const u8) !ast.Tree {
25792608 .body_node = null,
25802609 .lib_name = null,
25812610 .align_expr = null,
2611 .section_expr = null,
25822612 });
25832613 opt_ctx.store(&fn_proto.base);
25842614 stack.append(State{ .FnProto = fn_proto }) catch unreachable;
......@@ -2600,6 +2630,7 @@ pub fn parse(allocator: *mem.Allocator, source: []const u8) !ast.Tree {
26002630 .body_node = null,
26012631 .lib_name = null,
26022632 .align_expr = null,
2633 .section_expr = null,
26032634 });
26042635 opt_ctx.store(&fn_proto.base);
26052636 stack.append(State{ .FnProto = fn_proto }) catch unreachable;
......@@ -2985,12 +3016,14 @@ const State = union(enum) {
29853016
29863017 VarDecl: VarDeclCtx,
29873018 VarDeclAlign: *ast.Node.VarDecl,
3019 VarDeclSection: *ast.Node.VarDecl,
29883020 VarDeclEq: *ast.Node.VarDecl,
29893021 VarDeclSemiColon: *ast.Node.VarDecl,
29903022
29913023 FnDef: *ast.Node.FnProto,
29923024 FnProto: *ast.Node.FnProto,
29933025 FnProtoAlign: *ast.Node.FnProto,
3026 FnProtoSection: *ast.Node.FnProto,
29943027 FnProtoReturnType: *ast.Node.FnProto,
29953028
29963029 ParamDecl: *ast.Node.FnProto,
std/zig/parser_test.zig+7
......@@ -1,3 +1,10 @@
1test "zig fmt: linksection" {
2 try testCanonical(
3 \\export var aoeu: u64 linksection(".text.derp") = 1234;
4 \\export nakedcc fn _start() linksection(".text.boot") noreturn {}
5 \\
6 );
7}
18test "zig fmt: shebang line" {
29 try testCanonical(
310 \\#!/usr/bin/env zig
std/zig/render.zig+26-2
......@@ -1148,6 +1148,17 @@ fn renderExpression(
11481148 try renderToken(tree, stream, align_rparen, indent, start_col, Space.Space); // )
11491149 }
11501150
1151 if (fn_proto.section_expr) |section_expr| {
1152 const section_rparen = tree.nextToken(section_expr.lastToken());
1153 const section_lparen = tree.prevToken(section_expr.firstToken());
1154 const section_kw = tree.prevToken(section_lparen);
1155
1156 try renderToken(tree, stream, section_kw, indent, start_col, Space.None); // section
1157 try renderToken(tree, stream, section_lparen, indent, start_col, Space.None); // (
1158 try renderExpression(allocator, stream, tree, indent, start_col, section_expr, Space.None);
1159 try renderToken(tree, stream, section_rparen, indent, start_col, Space.Space); // )
1160 }
1161
11511162 switch (fn_proto.return_type) {
11521163 ast.Node.FnProto.ReturnType.Explicit => |node| {
11531164 return renderExpression(allocator, stream, tree, indent, start_col, node, space);
......@@ -1698,12 +1709,14 @@ fn renderVarDecl(
16981709 try renderToken(tree, stream, var_decl.mut_token, indent, start_col, Space.Space); // var
16991710
17001711 const name_space = if (var_decl.type_node == null and (var_decl.align_node != null or
1701 var_decl.init_node != null)) Space.Space else Space.None;
1712 var_decl.section_node != null or var_decl.init_node != null)) Space.Space else Space.None;
17021713 try renderToken(tree, stream, var_decl.name_token, indent, start_col, name_space);
17031714
17041715 if (var_decl.type_node) |type_node| {
17051716 try renderToken(tree, stream, tree.nextToken(var_decl.name_token), indent, start_col, Space.Space);
1706 const s = if (var_decl.align_node != null or var_decl.init_node != null) Space.Space else Space.None;
1717 const s = if (var_decl.align_node != null or
1718 var_decl.section_node != null or
1719 var_decl.init_node != null) Space.Space else Space.None;
17071720 try renderExpression(allocator, stream, tree, indent, start_col, type_node, s);
17081721 }
17091722
......@@ -1714,6 +1727,17 @@ fn renderVarDecl(
17141727 try renderToken(tree, stream, align_kw, indent, start_col, Space.None); // align
17151728 try renderToken(tree, stream, lparen, indent, start_col, Space.None); // (
17161729 try renderExpression(allocator, stream, tree, indent, start_col, align_node, Space.None);
1730 const s = if (var_decl.section_node != null or var_decl.init_node != null) Space.Space else Space.None;
1731 try renderToken(tree, stream, rparen, indent, start_col, s); // )
1732 }
1733
1734 if (var_decl.section_node) |section_node| {
1735 const lparen = tree.prevToken(section_node.firstToken());
1736 const section_kw = tree.prevToken(lparen);
1737 const rparen = tree.nextToken(section_node.lastToken());
1738 try renderToken(tree, stream, section_kw, indent, start_col, Space.None); // linksection
1739 try renderToken(tree, stream, lparen, indent, start_col, Space.None); // (
1740 try renderExpression(allocator, stream, tree, indent, start_col, section_node, Space.None);
17171741 const s = if (var_decl.init_node != null) Space.Space else Space.None;
17181742 try renderToken(tree, stream, rparen, indent, start_col, s); // )
17191743 }
std/zig/tokenizer.zig+2-2
......@@ -46,7 +46,7 @@ pub const Token = struct {
4646 Keyword{ .bytes = "pub", .id = Id.Keyword_pub },
4747 Keyword{ .bytes = "resume", .id = Id.Keyword_resume },
4848 Keyword{ .bytes = "return", .id = Id.Keyword_return },
49 Keyword{ .bytes = "section", .id = Id.Keyword_section },
49 Keyword{ .bytes = "linksection", .id = Id.Keyword_linksection },
5050 Keyword{ .bytes = "stdcallcc", .id = Id.Keyword_stdcallcc },
5151 Keyword{ .bytes = "struct", .id = Id.Keyword_struct },
5252 Keyword{ .bytes = "suspend", .id = Id.Keyword_suspend },
......@@ -175,7 +175,7 @@ pub const Token = struct {
175175 Keyword_pub,
176176 Keyword_resume,
177177 Keyword_return,
178 Keyword_section,
178 Keyword_linksection,
179179 Keyword_stdcallcc,
180180 Keyword_struct,
181181 Keyword_suspend,
test/compile_errors.zig+6-6
......@@ -3867,32 +3867,32 @@ pub fn addCases(cases: *tests.CompileErrorContext) void {
38673867
38683868 cases.add(
38693869 "setting a section on an extern variable",
3870 \\extern var foo: i32 section(".text2");
3870 \\extern var foo: i32 linksection(".text2");
38713871 \\export fn entry() i32 {
38723872 \\ return foo;
38733873 \\}
38743874 ,
3875 ".tmp_source.zig:1:29: error: cannot set section of external variable 'foo'",
3875 ".tmp_source.zig:1:33: error: cannot set section of external variable 'foo'",
38763876 );
38773877
38783878 cases.add(
38793879 "setting a section on a local variable",
38803880 \\export fn entry() i32 {
3881 \\ var foo: i32 section(".text2") = 1234;
3881 \\ var foo: i32 linksection(".text2") = 1234;
38823882 \\ return foo;
38833883 \\}
38843884 ,
3885 ".tmp_source.zig:2:26: error: cannot set section of local variable 'foo'",
3885 ".tmp_source.zig:2:30: error: cannot set section of local variable 'foo'",
38863886 );
38873887
38883888 cases.add(
38893889 "setting a section on an extern fn",
3890 \\extern fn foo() section(".text2") void;
3890 \\extern fn foo() linksection(".text2") void;
38913891 \\export fn entry() void {
38923892 \\ foo();
38933893 \\}
38943894 ,
3895 ".tmp_source.zig:1:25: error: cannot set section of external function 'foo'",
3895 ".tmp_source.zig:1:29: error: cannot set section of external function 'foo'",
38963896 );
38973897
38983898 cases.add(