translate-c: propagate scope properly in nested assignment
This commit is contained in:
parent
42945a269a
commit
7b62d5dfd8
@ -2971,7 +2971,7 @@ fn transCreateNodeAssign(
|
||||
|
||||
const node = try transCreateNodeVarDecl(rp.c, false, true, tmp);
|
||||
node.eq_token = try appendToken(rp.c, .Equal, "=");
|
||||
var rhs_node = try transExpr(rp, scope, rhs, .used, .r_value);
|
||||
var rhs_node = try transExpr(rp, &block_scope.base, rhs, .used, .r_value);
|
||||
if (isBoolRes(rhs_node)) {
|
||||
const builtin_node = try transCreateNodeBuiltinFnCall(rp.c, "@boolToInt");
|
||||
try builtin_node.params.push(rhs_node);
|
||||
@ -2982,12 +2982,12 @@ fn transCreateNodeAssign(
|
||||
node.semicolon_token = try appendToken(rp.c, .Semicolon, ";");
|
||||
try block_scope.block_node.statements.push(&node.base);
|
||||
|
||||
const lhs_node = try transExpr(rp, scope, lhs, .used, .l_value);
|
||||
const lhs_node = try transExpr(rp, &block_scope.base, lhs, .used, .l_value);
|
||||
const eq_token = try appendToken(rp.c, .Equal, "=");
|
||||
const ident = try transCreateNodeIdentifier(rp.c, tmp);
|
||||
_ = try appendToken(rp.c, .Semicolon, ";");
|
||||
|
||||
const assign = try transCreateNodeInfixOp(rp, scope, lhs_node, .Assign, eq_token, ident, .used, false);
|
||||
const assign = try transCreateNodeInfixOp(rp, &block_scope.base, lhs_node, .Assign, eq_token, ident, .used, false);
|
||||
try block_scope.block_node.statements.push(assign);
|
||||
|
||||
const break_node = try transCreateNodeBreak(rp.c, block_scope.label);
|
||||
|
@ -2241,4 +2241,26 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
|
||||
\\ return if (b > a) b else a;
|
||||
\\}
|
||||
});
|
||||
|
||||
// TODO: detect to use different block labels here
|
||||
cases.add("nested assignment",
|
||||
\\int foo(int *p, int x) {
|
||||
\\ return *p++ = x;
|
||||
\\}
|
||||
, &[_][]const u8{
|
||||
\\pub export fn foo(arg_p: [*c]c_int, arg_x: c_int) c_int {
|
||||
\\ var p = arg_p;
|
||||
\\ var x = arg_x;
|
||||
\\ return blk: {
|
||||
\\ const tmp = x;
|
||||
\\ (blk: {
|
||||
\\ const ref = &p;
|
||||
\\ const tmp_1 = ref.*;
|
||||
\\ ref.* += 1;
|
||||
\\ break :blk tmp_1;
|
||||
\\ }).?.* = tmp;
|
||||
\\ break :blk tmp;
|
||||
\\ };
|
||||
\\}
|
||||
});
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user