authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2021-02-22 21:23:17+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2021-02-22 21:52:22+02:00
logd83698ab54947c79c90d54c27e5a6d52c12fc52f
tree3497e2421bf78a82279796c4a3a1dfdfa3e0e720
parentf3ee10b4547bf5f03a4728b0d48b22bad6c9a5b1
signaturelock-open Commit is signed but in an unrecognized format.

translate-c: check for noreturn in switch in more cases


3 files changed, 18 insertions(+), 7 deletions(-)

src/translate_c.zig+7-6
......@@ -2374,6 +2374,9 @@ fn transSwitchProngStmtInline(
23742374 const result = try transStmt(c, &block.base, sub, .unused);
23752375 assert(result.tag() != .declaration);
23762376 try block.statements.append(result);
2377 if (result.isNoreturn(true)) {
2378 return;
2379 }
23772380 },
23782381 .DefaultStmtClass => {
23792382 var sub = @ptrCast(*const clang.DefaultStmt, it[0]).getSubStmt();
......@@ -2385,14 +2388,12 @@ fn transSwitchProngStmtInline(
23852388 const result = try transStmt(c, &block.base, sub, .unused);
23862389 assert(result.tag() != .declaration);
23872390 try block.statements.append(result);
2391 if (result.isNoreturn(true)) {
2392 return;
2393 }
23882394 },
23892395 .CompoundStmtClass => {
2390 const compound_stmt = @ptrCast(*const clang.CompoundStmt, it[0]);
2391 var child_block = try Scope.Block.init(c, &block.base, false);
2392 defer child_block.deinit();
2393
2394 try transCompoundStmtInline(c, compound_stmt, &child_block);
2395 const result = try child_block.complete(c);
2396 const result = try transCompoundStmt(c, &block.base, @ptrCast(*const clang.CompoundStmt, it[0]));
23962397 try block.statements.append(result);
23972398 if (result.isNoreturn(true)) {
23982399 return;
src/translate_c/ast.zig+1-1
......@@ -401,7 +401,7 @@ pub const Node = extern union {
401401 return true;
402402 },
403403 .@"return", .return_void => return true,
404 .break_val, .@"break" => if (break_counts) return true,
404 .@"break" => if (break_counts) return true,
405405 else => {},
406406 }
407407 return false;
test/translate_c.zig+10
......@@ -2047,6 +2047,10 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
20472047 \\ res = 3 * i;
20482048 \\ break;
20492049 \\ break;
2050 \\ case 7: {
2051 \\ res = 7;
2052 \\ break;
2053 \\ }
20502054 \\ case 4:
20512055 \\ case 5:
20522056 \\ res = 69;
......@@ -2079,6 +2083,12 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
20792083 \\ else => {
20802084 \\ res = @as(c_int, 3) * i;
20812085 \\ },
2086 \\ @as(c_int, 7) => {
2087 \\ {
2088 \\ res = 7;
2089 \\ break;
2090 \\ }
2091 \\ },
20822092 \\ @as(c_int, 4), @as(c_int, 5) => {
20832093 \\ res = 69;
20842094 \\ {