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_stmt.cpp | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) (limited to 'src/check_stmt.cpp') diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index 4fdece852..24960b33c 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -247,11 +247,24 @@ bool check_is_terminating(Ast *node, String const &label) { case_ast_node(ws, WhenStmt, node); // TODO(bill): Is this logic correct for when statements? - if (ws->else_stmt != nullptr) { - if (check_is_terminating(ws->body, label) && - check_is_terminating(ws->else_stmt, label)) { - return true; - } + auto const &tv = ws->cond->tav; + if (tv.mode != Addressing_Constant) { + // NOTE(bill): Check the things regardless as a bug occurred earlier + if (ws->else_stmt != nullptr) { + if (check_is_terminating(ws->body, label) && + check_is_terminating(ws->else_stmt, label)) { + return true; + } + } + return false; + } + + if (tv.value.kind == ExactValue_Bool) { + if (tv.value.value_bool) { + return check_is_terminating(ws->body, label); + } else { + return check_is_terminating(ws->else_stmt, label); + } } case_end; -- cgit v1.2.3