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 *...@@ -2231,6 +2231,14 @@ static AstNode *trans_string_literal(Context *c, AstNode *block, StringLiteral *
2231 zig_unreachable();2231 zig_unreachable();
2232}2232}
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
2234static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *stmt, TransLRValue lrvalue) {2242static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *stmt, TransLRValue lrvalue) {
2235 Stmt::StmtClass sc = stmt->getStmtClass();2243 Stmt::StmtClass sc = stmt->getStmtClass();
2236 switch (sc) {2244 switch (sc) {
...@@ -2276,6 +2284,10 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s...@@ -2276,6 +2284,10 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
2276 return trans_for_loop(c, block, (ForStmt *)stmt);2284 return trans_for_loop(c, block, (ForStmt *)stmt);
2277 case Stmt::StringLiteralClass:2285 case Stmt::StringLiteralClass:
2278 return trans_string_literal(c, block, (StringLiteral *)stmt);2286 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);
2279 case Stmt::CaseStmtClass:2291 case Stmt::CaseStmtClass:
2280 emit_warning(c, stmt->getLocStart(), "TODO handle C CaseStmtClass");2292 emit_warning(c, stmt->getLocStart(), "TODO handle C CaseStmtClass");
2281 return nullptr;2293 return nullptr;
...@@ -2297,9 +2309,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s...@@ -2297,9 +2309,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
2297 case Stmt::AttributedStmtClass:2309 case Stmt::AttributedStmtClass:
2298 emit_warning(c, stmt->getLocStart(), "TODO handle C AttributedStmtClass");2310 emit_warning(c, stmt->getLocStart(), "TODO handle C AttributedStmtClass");
2299 return nullptr;2311 return nullptr;
2300 case Stmt::BreakStmtClass:
2301 emit_warning(c, stmt->getLocStart(), "TODO handle C BreakStmtClass");
2302 return nullptr;
2303 case Stmt::CXXCatchStmtClass:2312 case Stmt::CXXCatchStmtClass:
2304 emit_warning(c, stmt->getLocStart(), "TODO handle C CXXCatchStmtClass");2313 emit_warning(c, stmt->getLocStart(), "TODO handle C CXXCatchStmtClass");
2305 return nullptr;2314 return nullptr;
...@@ -2312,9 +2321,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s...@@ -2312,9 +2321,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
2312 case Stmt::CapturedStmtClass:2321 case Stmt::CapturedStmtClass:
2313 emit_warning(c, stmt->getLocStart(), "TODO handle C CapturedStmtClass");2322 emit_warning(c, stmt->getLocStart(), "TODO handle C CapturedStmtClass");
2314 return nullptr;2323 return nullptr;
2315 case Stmt::ContinueStmtClass:
2316 emit_warning(c, stmt->getLocStart(), "TODO handle C ContinueStmtClass");
2317 return nullptr;
2318 case Stmt::CoreturnStmtClass:2324 case Stmt::CoreturnStmtClass:
2319 emit_warning(c, stmt->getLocStart(), "TODO handle C CoreturnStmtClass");2325 emit_warning(c, stmt->getLocStart(), "TODO handle C CoreturnStmtClass");
2320 return nullptr;2326 return nullptr;
test/translate_c.zig+28
...@@ -962,6 +962,34 @@ pub fn addCases(cases: &tests.TranslateCContext) {...@@ -962,6 +962,34 @@ pub fn addCases(cases: &tests.TranslateCContext) {
962 \\ };962 \\ };
963 \\}963 \\}
964 );964 );
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 );
965}993}
966994
967995