authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-10-27 15:58:33-04:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2021-10-27 15:58:33-04:00
log9024f27d8f5cb651e2260348ce0ee6fd67fc2c32
treea81a64a9c8656dd4f68e4058ce8695b228d20e1b
parent3568cd4b8f52164d8a519576cc9ea95bb303cd92
parentc8a066f408a5f6b5aa75359a4a5cb3731677d2ef
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #10040 from mattbork/extern-fn-scopes

stage2: fix extern fn decl parsing and astgen

3 files changed, 11 insertions(+), 1 deletions(-)

lib/std/zig/Ast.zig+4
......@@ -262,6 +262,9 @@ pub fn renderError(tree: Tree, parse_error: Error, stream: anytype) !void {
262262 token_tags[parse_error.token].symbol(),
263263 });
264264 },
265 .extern_fn_body => {
266 return stream.writeAll("extern functions have no body");
267 },
265268 .extra_addrspace_qualifier => {
266269 return stream.writeAll("extra addrspace qualifier");
267270 },
......@@ -2447,6 +2450,7 @@ pub const Error = struct {
24472450 expected_var_decl_or_fn,
24482451 expected_loop_payload,
24492452 expected_container,
2453 extern_fn_body,
24502454 extra_addrspace_qualifier,
24512455 extra_align_qualifier,
24522456 extra_allowzero_qualifier,
lib/std/zig/parse.zig+6
......@@ -532,11 +532,13 @@ const Parser = struct {
532532 /// / KEYWORD_usingnamespace Expr SEMICOLON
533533 fn expectTopLevelDecl(p: *Parser) !Node.Index {
534534 const extern_export_inline_token = p.nextToken();
535 var is_extern: bool = false;
535536 var expect_fn: bool = false;
536537 var expect_var_or_fn: bool = false;
537538 switch (p.token_tags[extern_export_inline_token]) {
538539 .keyword_extern => {
539540 _ = p.eatToken(.string_literal);
541 is_extern = true;
540542 expect_var_or_fn = true;
541543 },
542544 .keyword_export => expect_var_or_fn = true,
......@@ -554,6 +556,10 @@ const Parser = struct {
554556 const fn_decl_index = try p.reserveNode();
555557 const body_block = try p.parseBlock();
556558 assert(body_block != 0);
559 if (is_extern) {
560 try p.warnMsg(.{ .tag = .extern_fn_body, .token = extern_export_inline_token });
561 return null_node;
562 }
557563 return p.setNode(fn_decl_index, .{
558564 .tag = .fn_decl,
559565 .main_token = p.nodes.items(.main_token)[fn_proto],
src/AstGen.zig+1-1
......@@ -3147,7 +3147,7 @@ fn fnDecl(
31473147 break :param indexToRef(param_inst);
31483148 };
31493149
3150 if (param_name == 0) continue;
3150 if (param_name == 0 or is_extern) continue;
31513151
31523152 const sub_scope = try astgen.arena.create(Scope.LocalVal);
31533153 sub_scope.* = .{