From 41f2539484931cd73dfca36dcbdba01e954fc350 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 16 Jun 2021 12:07:24 +0100 Subject: Improve logic for diverging procedures by checking if it terminates --- src/check_decl.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'src/check_decl.cpp') diff --git a/src/check_decl.cpp b/src/check_decl.cpp index 1a87b57b8..583c4f133 100644 --- a/src/check_decl.cpp +++ b/src/check_decl.cpp @@ -1297,13 +1297,21 @@ void check_proc_body(CheckerContext *ctx_, Token token, DeclInfo *decl, Type *ty error(bs->close, "Missing return statement at the end of the procedure"); } } + } else if (type->Proc.diverging) { + if (!check_is_terminating(body, str_lit(""))) { + if (token.kind == Token_Ident) { + error(bs->close, "Missing diverging call at the end of the procedure '%.*s'", LIT(token.string)); + } else { + // NOTE(bill): Anonymous procedure (lambda) + error(bs->close, "Missing diverging call at the end of the procedure"); + } + } } } check_close_scope(ctx); check_scope_usage(ctx->checker, ctx->scope); -#if 1 if (decl->parent != nullptr) { Scope *ps = decl->parent->scope; if (ps->flags & (ScopeFlag_File & ScopeFlag_Pkg & ScopeFlag_Global)) { @@ -1321,7 +1329,6 @@ void check_proc_body(CheckerContext *ctx_, Token token, DeclInfo *decl, Type *ty } } } -#endif } -- cgit v1.2.3