Commit c8a066f408

Matthew Borkowski <matthew.h.borkowski@gmail.com>
2021-10-27 02:05:38
parse.zig: report error for extern fn with body
1 parent 8081e3c
Changed files (2)
lib
lib/std/zig/Ast.zig
@@ -262,6 +262,9 @@ pub fn renderError(tree: Tree, parse_error: Error, stream: anytype) !void {
                 token_tags[parse_error.token].symbol(),
             });
         },
+        .extern_fn_body => {
+            return stream.writeAll("extern functions have no body");
+        },
         .extra_addrspace_qualifier => {
             return stream.writeAll("extra addrspace qualifier");
         },
@@ -2447,6 +2450,7 @@ pub const Error = struct {
         expected_var_decl_or_fn,
         expected_loop_payload,
         expected_container,
+        extern_fn_body,
         extra_addrspace_qualifier,
         extra_align_qualifier,
         extra_allowzero_qualifier,
lib/std/zig/parse.zig
@@ -532,11 +532,13 @@ const Parser = struct {
     ///      / KEYWORD_usingnamespace Expr SEMICOLON
     fn expectTopLevelDecl(p: *Parser) !Node.Index {
         const extern_export_inline_token = p.nextToken();
+        var is_extern: bool = false;
         var expect_fn: bool = false;
         var expect_var_or_fn: bool = false;
         switch (p.token_tags[extern_export_inline_token]) {
             .keyword_extern => {
                 _ = p.eatToken(.string_literal);
+                is_extern = true;
                 expect_var_or_fn = true;
             },
             .keyword_export => expect_var_or_fn = true,
@@ -554,6 +556,10 @@ const Parser = struct {
                     const fn_decl_index = try p.reserveNode();
                     const body_block = try p.parseBlock();
                     assert(body_block != 0);
+                    if (is_extern) {
+                        try p.warnMsg(.{ .tag = .extern_fn_body, .token = extern_export_inline_token });
+                        return null_node;
+                    }
                     return p.setNode(fn_decl_index, .{
                         .tag = .fn_decl,
                         .main_token = p.nodes.items(.main_token)[fn_proto],