translate-c: fix crash when last stmt of stmt expr is a decl

This commit is contained in:
Peng He
2023-10-15 01:09:54 +08:00
committed by GitHub
parent 8a15c9249c
commit a126afa1c3
2 changed files with 26 additions and 5 deletions

View File

@@ -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);
}

View File

@@ -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;
\\ };
\\}
});
}