From b390929826062f81b9f796d4cf46a72aa23d291a Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sat, 25 Nov 2017 11:56:17 -0500 Subject: [PATCH] translate-c supports break and continue --- src/translate_c.cpp | 18 ++++++++++++------ test/translate_c.zig | 28 ++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/src/translate_c.cpp b/src/translate_c.cpp index 6c55aa6afc..00309e8bc1 100644 --- a/src/translate_c.cpp +++ b/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; diff --git a/test/translate_c.zig b/test/translate_c.zig index 80ccdabc74..152928cbe9 100644 --- a/test/translate_c.zig +++ b/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; + \\ }; + \\} + ); }