Commit b390929826

Andrew Kelley <superjoe30@gmail.com>
2017-11-25 17:56:17
translate-c supports break and continue
1 parent bf20b26
Changed files (2)
src/translate_c.cpp
@@ -2231,6 +2231,14 @@ static AstNode *trans_string_literal(Context *c, AstNode *block, StringLiteral *
     zig_unreachable();
 }
 
+static AstNode *trans_break_stmt(Context *c, AstNode *block, BreakStmt *stmt) {
+    return trans_create_node(c, NodeTypeBreak);
+}
+
+static AstNode *trans_continue_stmt(Context *c, AstNode *block, ContinueStmt *stmt) {
+    return trans_create_node(c, NodeTypeContinue);
+}
+
 static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *stmt, TransLRValue lrvalue) {
     Stmt::StmtClass sc = stmt->getStmtClass();
     switch (sc) {
@@ -2276,6 +2284,10 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
             return trans_for_loop(c, block, (ForStmt *)stmt);
         case Stmt::StringLiteralClass:
             return trans_string_literal(c, block, (StringLiteral *)stmt);
+        case Stmt::BreakStmtClass:
+            return trans_break_stmt(c, block, (BreakStmt *)stmt);
+        case Stmt::ContinueStmtClass:
+            return trans_continue_stmt(c, block, (ContinueStmt *)stmt);
         case Stmt::CaseStmtClass:
             emit_warning(c, stmt->getLocStart(), "TODO handle C CaseStmtClass");
             return nullptr;
@@ -2297,9 +2309,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
         case Stmt::AttributedStmtClass:
             emit_warning(c, stmt->getLocStart(), "TODO handle C AttributedStmtClass");
             return nullptr;
-        case Stmt::BreakStmtClass:
-            emit_warning(c, stmt->getLocStart(), "TODO handle C BreakStmtClass");
-            return nullptr;
         case Stmt::CXXCatchStmtClass:
             emit_warning(c, stmt->getLocStart(), "TODO handle C CXXCatchStmtClass");
             return nullptr;
@@ -2312,9 +2321,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
         case Stmt::CapturedStmtClass:
             emit_warning(c, stmt->getLocStart(), "TODO handle C CapturedStmtClass");
             return nullptr;
-        case Stmt::ContinueStmtClass:
-            emit_warning(c, stmt->getLocStart(), "TODO handle C ContinueStmtClass");
-            return nullptr;
         case Stmt::CoreturnStmtClass:
             emit_warning(c, stmt->getLocStart(), "TODO handle C CoreturnStmtClass");
             return nullptr;
test/translate_c.zig
@@ -962,6 +962,34 @@ pub fn addCases(cases: &tests.TranslateCContext) {
         \\    };
         \\}
     );
+
+    cases.add("break statement",
+        \\void foo(void) {
+        \\    for (;;) {
+        \\        break;
+        \\    }
+        \\}
+    ,
+        \\pub fn foo() {
+        \\    while (true) {
+        \\        break;
+        \\    };
+        \\}
+    );
+
+    cases.add("continue statement",
+        \\void foo(void) {
+        \\    for (;;) {
+        \\        continue;
+        \\    }
+        \\}
+    ,
+        \\pub fn foo() {
+        \\    while (true) {
+        \\        continue;
+        \\    };
+        \\}
+    );
 }