Commit a126afa1c3

Peng He <xnhp0320@126.com>
2023-10-14 19:09:54
translate-c: fix crash when last stmt of stmt expr is a decl
1 parent 8a15c92
Changed files (2)
src/translate_c.zig
@@ -3269,11 +3269,18 @@ fn transStmtExpr(c: *Context, scope: *Scope, stmt: *const clang.StmtExpr, used:
             else => try block_scope.statements.append(result),
         }
     }
-    const break_node = try Tag.break_val.create(c.arena, .{
-        .label = block_scope.label,
-        .val = try transStmt(c, &block_scope.base, it[0], .used),
-    });
-    try block_scope.statements.append(break_node);
+
+    const last_result = try transStmt(c, &block_scope.base, it[0], .used);
+    switch (last_result.tag()) {
+        .declaration, .empty_block => {},
+        else => {
+            const break_node = try Tag.break_val.create(c.arena, .{
+                .label = block_scope.label,
+                .val = last_result,
+            });
+            try block_scope.statements.append(break_node);
+        },
+    }
     const res = try block_scope.complete(c);
     return maybeSuppressResult(c, used, res);
 }
test/translate_c.zig
@@ -4150,4 +4150,18 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
         ,
         \\pub export var struct_foo: [*c]const u8 = "hello world";
     });
+
+    cases.add("unsupport declare statement at the last of a compound statement which belongs to a statement expr",
+        \\void somefunc(void) {
+        \\  int y;
+        \\  (void)({y=1; _Static_assert(1);});
+        \\}
+    , &[_][]const u8{
+        \\pub export fn somefunc() void {
+        \\    var y: c_int = undefined;
+        \\    _ = blk: {
+        \\        y = 1;
+        \\    };
+        \\}
+    });
 }