int check_loop_stmt(is_loop_stmt* node) { int errors = 0; if (node->loop_label) errors += check_label(node->loop_label); switch (node->type) { case t_loop_stmt_for: errors += check_for(node->data.for_stmt, node->loop_label); break; case t_loop_stmt_while: errors += check_while(node->data.while_stmt, node->loop_label); break; case t_loop_stmt_do_while: errors += check_do_while(node->data.do_while_stmt, node->loop_label); break; } if (errors == 0) { /* TODO: propagate loop terminates, only if node condition is ALWAYS true */ } return errors; }
int check_statement(ast::abstract::Statement* statement) { assert(statement != nullptr); switch(*statement) { case ast::ReturnNode: return check_return(dynamic_cast<ast::Return*>(statement)); break; case ast::BranchNode: return check_branch(dynamic_cast<ast::Branch*>(statement)); break; case ast::AssignmentNode: return check_assignment(dynamic_cast<ast::Assignment*>(statement)); break; case ast::WhileNode: return check_while(dynamic_cast<ast::While*>(statement)); break; case ast::VoidContextNode: return check_void_context(dynamic_cast<ast::VoidContext*>(statement)); break; } assert(false); return EXIT_SUCCESS; }