aboutsummaryrefslogtreecommitdiff
path: root/src/analyze.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2016-02-04 02:49:12 -0700
committerAndrew Kelley <superjoe30@gmail.com>2016-02-04 02:49:12 -0700
commit32642ac9cb00b59fef97c1888e0424b0eb4db784 (patch)
tree11fc77184d633811f0a78289d0feb7c663175f08 /src/analyze.cpp
parentfdadab40c61a6f70a65472cc95ccd5ba52c01772 (diff)
downloadzig-32642ac9cb00b59fef97c1888e0424b0eb4db784.tar.gz
zig-32642ac9cb00b59fef97c1888e0424b0eb4db784.zip
for loop supports break and continue
See #51
Diffstat (limited to 'src/analyze.cpp')
-rw-r--r--src/analyze.cpp21
1 files changed, 18 insertions, 3 deletions
diff --git a/src/analyze.cpp b/src/analyze.cpp
index 5aad26cf34..38bc656a1f 100644
--- a/src/analyze.cpp
+++ b/src/analyze.cpp
@@ -3354,6 +3354,7 @@ static TypeTableEntry *analyze_for_expr(CodeGen *g, ImportTableEntry *import, Bl
}
BlockContext *child_context = new_block_context(node, context);
+ child_context->parent_loop_node = node;
AstNode *elem_var_node = node->data.for_expr.elem_node;
elem_var_node->block_context = child_context;
@@ -3385,8 +3386,13 @@ static TypeTableEntry *analyze_break_expr(CodeGen *g, ImportTableEntry *import,
AstNode *loop_node = context->parent_loop_node;
if (loop_node) {
- assert(loop_node->type == NodeTypeWhileExpr);
- loop_node->data.while_expr.contains_break = true;
+ if (loop_node->type == NodeTypeWhileExpr) {
+ loop_node->data.while_expr.contains_break = true;
+ } else if (loop_node->type == NodeTypeForExpr) {
+ loop_node->data.for_expr.contains_break = true;
+ } else {
+ zig_unreachable();
+ }
} else {
add_node_error(g, node, buf_sprintf("'break' expression outside loop"));
}
@@ -3396,7 +3402,16 @@ static TypeTableEntry *analyze_break_expr(CodeGen *g, ImportTableEntry *import,
static TypeTableEntry *analyze_continue_expr(CodeGen *g, ImportTableEntry *import, BlockContext *context,
TypeTableEntry *expected_type, AstNode *node)
{
- if (!context->parent_loop_node) {
+ AstNode *loop_node = context->parent_loop_node;
+ if (loop_node) {
+ if (loop_node->type == NodeTypeWhileExpr) {
+ loop_node->data.while_expr.contains_continue = true;
+ } else if (loop_node->type == NodeTypeForExpr) {
+ loop_node->data.for_expr.contains_continue = true;
+ } else {
+ zig_unreachable();
+ }
+ } else {
add_node_error(g, node, buf_sprintf("'continue' expression outside loop"));
}
return g->builtin_types.entry_unreachable;