Commit c8a066f408
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],