authorgravatar for matthew.h.borkowski@gmail.comMatthew Borkowski <matthew.h.borkowski@gmail.com> 2021-10-26 20:05:38-04:00
committergravatar for matthew.h.borkowski@gmail.comMatthew Borkowski <matthew.h.borkowski@gmail.com> 2021-10-26 20:12:28-04:00
logc8a066f408a5f6b5aa75359a4a5cb3731677d2ef
tree87f98b0dd421f1c6edbee44a488e6cea209a90d1
parent8081e3cbc7f8b6af71dcbb88a12f6431b8be67be

parse.zig: report error for extern fn with body


2 files changed, 10 insertions(+), 0 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],