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(...@@ -2374,6 +2374,9 @@ fn transSwitchProngStmtInline(
2374 const result = try transStmt(c, &block.base, sub, .unused);2374 const result = try transStmt(c, &block.base, sub, .unused);
2375 assert(result.tag() != .declaration);2375 assert(result.tag() != .declaration);
2376 try block.statements.append(result);2376 try block.statements.append(result);
2377 if (result.isNoreturn(true)) {
2378 return;
2379 }
2377 },2380 },
2378 .DefaultStmtClass => {2381 .DefaultStmtClass => {
2379 var sub = @ptrCast(*const clang.DefaultStmt, it[0]).getSubStmt();2382 var sub = @ptrCast(*const clang.DefaultStmt, it[0]).getSubStmt();
...@@ -2385,14 +2388,12 @@ fn transSwitchProngStmtInline(...@@ -2385,14 +2388,12 @@ fn transSwitchProngStmtInline(
2385 const result = try transStmt(c, &block.base, sub, .unused);2388 const result = try transStmt(c, &block.base, sub, .unused);
2386 assert(result.tag() != .declaration);2389 assert(result.tag() != .declaration);
2387 try block.statements.append(result);2390 try block.statements.append(result);
2391 if (result.isNoreturn(true)) {
2392 return;
2393 }
2388 },2394 },
2389 .CompoundStmtClass => {2395 .CompoundStmtClass => {
2390 const compound_stmt = @ptrCast(*const clang.CompoundStmt, it[0]);2396 const result = try transCompoundStmt(c, &block.base, @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 try block.statements.append(result);2397 try block.statements.append(result);
2397 if (result.isNoreturn(true)) {2398 if (result.isNoreturn(true)) {
2398 return;2399 return;
src/translate_c/ast.zig+1-1
...@@ -401,7 +401,7 @@ pub const Node = extern union {...@@ -401,7 +401,7 @@ pub const Node = extern union {
401 return true;401 return true;
402 },402 },
403 .@"return", .return_void => return true,403 .@"return", .return_void => return true,
404 .break_val, .@"break" => if (break_counts) return true,404 .@"break" => if (break_counts) return true,
405 else => {},405 else => {},
406 }406 }
407 return false;407 return false;
test/translate_c.zig+10
...@@ -2047,6 +2047,10 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -2047,6 +2047,10 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
2047 \\ res = 3 * i;2047 \\ res = 3 * i;
2048 \\ break;2048 \\ break;
2049 \\ break;2049 \\ break;
2050 \\ case 7: {
2051 \\ res = 7;
2052 \\ break;
2053 \\ }
2050 \\ case 4:2054 \\ case 4:
2051 \\ case 5:2055 \\ case 5:
2052 \\ res = 69;2056 \\ res = 69;
...@@ -2079,6 +2083,12 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -2079,6 +2083,12 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
2079 \\ else => {2083 \\ else => {
2080 \\ res = @as(c_int, 3) * i;2084 \\ res = @as(c_int, 3) * i;
2081 \\ },2085 \\ },
2086 \\ @as(c_int, 7) => {
2087 \\ {
2088 \\ res = 7;
2089 \\ break;
2090 \\ }
2091 \\ },
2082 \\ @as(c_int, 4), @as(c_int, 5) => {2092 \\ @as(c_int, 4), @as(c_int, 5) => {
2083 \\ res = 69;2093 \\ res = 69;
2084 \\ {2094 \\ {