From d83698ab54947c79c90d54c27e5a6d52c12fc52f Mon Sep 17 00:00:00 2001 From: Veikka Tuominen Date: Mon, 22 Feb 2021 21:23:17 +0200 Subject: [PATCH] translate-c: check for noreturn in switch in more cases --- src/translate_c.zig | 13 +++++++------ src/translate_c/ast.zig | 2 +- test/translate_c.zig | 10 ++++++++++ 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/translate_c.zig b/src/translate_c.zig index e3debc01a0..f2d2f53050 100644 --- a/src/translate_c.zig +++ b/src/translate_c.zig @@ -2374,6 +2374,9 @@ fn transSwitchProngStmtInline( const result = try transStmt(c, &block.base, sub, .unused); assert(result.tag() != .declaration); try block.statements.append(result); + if (result.isNoreturn(true)) { + return; + } }, .DefaultStmtClass => { var sub = @ptrCast(*const clang.DefaultStmt, it[0]).getSubStmt(); @@ -2385,14 +2388,12 @@ fn transSwitchProngStmtInline( const result = try transStmt(c, &block.base, sub, .unused); assert(result.tag() != .declaration); try block.statements.append(result); + if (result.isNoreturn(true)) { + return; + } }, .CompoundStmtClass => { - const compound_stmt = @ptrCast(*const clang.CompoundStmt, it[0]); - var child_block = try Scope.Block.init(c, &block.base, false); - defer child_block.deinit(); - - try transCompoundStmtInline(c, compound_stmt, &child_block); - const result = try child_block.complete(c); + const result = try transCompoundStmt(c, &block.base, @ptrCast(*const clang.CompoundStmt, it[0])); try block.statements.append(result); if (result.isNoreturn(true)) { return; diff --git a/src/translate_c/ast.zig b/src/translate_c/ast.zig index 7b54d6a8bb..928619449f 100644 --- a/src/translate_c/ast.zig +++ b/src/translate_c/ast.zig @@ -401,7 +401,7 @@ pub const Node = extern union { return true; }, .@"return", .return_void => return true, - .break_val, .@"break" => if (break_counts) return true, + .@"break" => if (break_counts) return true, else => {}, } return false; diff --git a/test/translate_c.zig b/test/translate_c.zig index 2e99bd8dd6..40e074fcc4 100644 --- a/test/translate_c.zig +++ b/test/translate_c.zig @@ -2047,6 +2047,10 @@ pub fn addCases(cases: *tests.TranslateCContext) void { \\ res = 3 * i; \\ break; \\ break; + \\ case 7: { + \\ res = 7; + \\ break; + \\ } \\ case 4: \\ case 5: \\ res = 69; @@ -2079,6 +2083,12 @@ pub fn addCases(cases: *tests.TranslateCContext) void { \\ else => { \\ res = @as(c_int, 3) * i; \\ }, + \\ @as(c_int, 7) => { + \\ { + \\ res = 7; + \\ break; + \\ } + \\ }, \\ @as(c_int, 4), @as(c_int, 5) => { \\ res = 69; \\ {