translate-c: propagate scope properly in nested assignment

This commit is contained in:
Andrew Kelley 2019-12-31 21:01:49 -05:00
parent 42945a269a
commit 7b62d5dfd8
No known key found for this signature in database
GPG Key ID: 7C5F548F728501A9
2 changed files with 25 additions and 3 deletions

View File

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

View File

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