authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-11-25 11:56:17-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-11-25 11:56:17-05:00
logb390929826062f81b9f796d4cf46a72aa23d291a
treeb869d5f2bf947dba9f943be5569fc2eea58f8f06
parentbf20b260ce1b76b3b3d2c8a1bc1819eb3871bb00

translate-c supports break and continue


2 files changed, 40 insertions(+), 6 deletions(-)

src/translate_c.cpp+12-6
......@@ -2231,6 +2231,14 @@ static AstNode *trans_string_literal(Context *c, AstNode *block, StringLiteral *
22312231 zig_unreachable();
22322232}
22332233
2234static AstNode *trans_break_stmt(Context *c, AstNode *block, BreakStmt *stmt) {
2235 return trans_create_node(c, NodeTypeBreak);
2236}
2237
2238static AstNode *trans_continue_stmt(Context *c, AstNode *block, ContinueStmt *stmt) {
2239 return trans_create_node(c, NodeTypeContinue);
2240}
2241
22342242static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *stmt, TransLRValue lrvalue) {
22352243 Stmt::StmtClass sc = stmt->getStmtClass();
22362244 switch (sc) {
......@@ -2276,6 +2284,10 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
22762284 return trans_for_loop(c, block, (ForStmt *)stmt);
22772285 case Stmt::StringLiteralClass:
22782286 return trans_string_literal(c, block, (StringLiteral *)stmt);
2287 case Stmt::BreakStmtClass:
2288 return trans_break_stmt(c, block, (BreakStmt *)stmt);
2289 case Stmt::ContinueStmtClass:
2290 return trans_continue_stmt(c, block, (ContinueStmt *)stmt);
22792291 case Stmt::CaseStmtClass:
22802292 emit_warning(c, stmt->getLocStart(), "TODO handle C CaseStmtClass");
22812293 return nullptr;
......@@ -2297,9 +2309,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
22972309 case Stmt::AttributedStmtClass:
22982310 emit_warning(c, stmt->getLocStart(), "TODO handle C AttributedStmtClass");
22992311 return nullptr;
2300 case Stmt::BreakStmtClass:
2301 emit_warning(c, stmt->getLocStart(), "TODO handle C BreakStmtClass");
2302 return nullptr;
23032312 case Stmt::CXXCatchStmtClass:
23042313 emit_warning(c, stmt->getLocStart(), "TODO handle C CXXCatchStmtClass");
23052314 return nullptr;
......@@ -2312,9 +2321,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
23122321 case Stmt::CapturedStmtClass:
23132322 emit_warning(c, stmt->getLocStart(), "TODO handle C CapturedStmtClass");
23142323 return nullptr;
2315 case Stmt::ContinueStmtClass:
2316 emit_warning(c, stmt->getLocStart(), "TODO handle C ContinueStmtClass");
2317 return nullptr;
23182324 case Stmt::CoreturnStmtClass:
23192325 emit_warning(c, stmt->getLocStart(), "TODO handle C CoreturnStmtClass");
23202326 return nullptr;
test/translate_c.zig+28
......@@ -962,6 +962,34 @@ pub fn addCases(cases: &tests.TranslateCContext) {
962962 \\ };
963963 \\}
964964 );
965
966 cases.add("break statement",
967 \\void foo(void) {
968 \\ for (;;) {
969 \\ break;
970 \\ }
971 \\}
972 ,
973 \\pub fn foo() {
974 \\ while (true) {
975 \\ break;
976 \\ };
977 \\}
978 );
979
980 cases.add("continue statement",
981 \\void foo(void) {
982 \\ for (;;) {
983 \\ continue;
984 \\ }
985 \\}
986 ,
987 \\pub fn foo() {
988 \\ while (true) {
989 \\ continue;
990 \\ };
991 \\}
992 );
965993}
966994
967995