From 901b5c1566a497822b98ba9327578839bac3df50 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Tue, 28 Aug 2018 15:39:32 -0400 Subject: [PATCH] add compile error for function prototype with no body closes #1231 --- src/analyze.cpp | 7 +++++++ test/compile_errors.zig | 10 ++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/analyze.cpp b/src/analyze.cpp index ccab9170e9..405e010ba4 100644 --- a/src/analyze.cpp +++ b/src/analyze.cpp @@ -3242,6 +3242,13 @@ static void add_top_level_decl(CodeGen *g, ScopeDecls *decls_scope, Tld *tld) { } else if (tld->id == TldIdFn) { assert(tld->source_node->type == NodeTypeFnProto); is_export = tld->source_node->data.fn_proto.is_export; + + if (!is_export && !tld->source_node->data.fn_proto.is_extern && + tld->source_node->data.fn_proto.fn_def_node == nullptr) + { + add_node_error(g, tld->source_node, buf_sprintf("non-extern function has no body")); + return; + } } if (is_export) { g->resolve_queue.append(tld); diff --git a/test/compile_errors.zig b/test/compile_errors.zig index d0795c4550..5405b7b8a8 100644 --- a/test/compile_errors.zig +++ b/test/compile_errors.zig @@ -1,6 +1,16 @@ const tests = @import("tests.zig"); pub fn addCases(cases: *tests.CompileErrorContext) void { + cases.add( + "function protoype with no body", + \\fn foo() void; + \\export fn entry() void { + \\ foo(); + \\} + , + ".tmp_source.zig:1:1: error: non-extern function has no body", + ); + cases.add( "@typeInfo causing depend on itself compile error", \\const start = struct {