From 4b9fd57aa86a480f2afd6ba117fcc7ef6eace572 Mon Sep 17 00:00:00 2001 From: Evan Haas Date: Tue, 8 Mar 2022 10:38:51 -0800 Subject: [PATCH] translate-c: use nested scope for comma operator in macros Fixes #11040 --- src/translate_c.zig | 2 +- test/behavior/translate_c_macros.h | 2 ++ test/behavior/translate_c_macros.zig | 6 ++++++ test/run_translated_c.zig | 10 ++++++++++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/translate_c.zig b/src/translate_c.zig index 09e720d289..8b79dd53ab 100644 --- a/src/translate_c.zig +++ b/src/translate_c.zig @@ -5563,7 +5563,7 @@ fn parseCExpr(c: *Context, m: *MacroCtx, scope: *Scope) ParseError!Node { const ignore = try Tag.discard.create(c.arena, .{ .should_skip = false, .value = last }); try block_scope.statements.append(ignore); - last = try parseCCondExpr(c, m, scope); + last = try parseCCondExpr(c, m, &block_scope.base); if (m.next().? != .Comma) { m.i -= 1; break; diff --git a/test/behavior/translate_c_macros.h b/test/behavior/translate_c_macros.h index bec73e20d6..490ca35726 100644 --- a/test/behavior/translate_c_macros.h +++ b/test/behavior/translate_c_macros.h @@ -37,3 +37,5 @@ union U { #define IGNORE_ME_10(x) (volatile const void)(x) #define UNION_CAST(X) (union U)(X) + +#define NESTED_COMMA_OPERATOR (1, (2, 3)) diff --git a/test/behavior/translate_c_macros.zig b/test/behavior/translate_c_macros.zig index a67d315ffc..7f8a35f5a1 100644 --- a/test/behavior/translate_c_macros.zig +++ b/test/behavior/translate_c_macros.zig @@ -56,3 +56,9 @@ test "casting to union with a macro" { casted = h.UNION_CAST(d); try expectEqual(d, casted.d); } + +test "nested comma operator" { + if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO + + try expectEqual(@as(c_int, 3), h.NESTED_COMMA_OPERATOR); +} diff --git a/test/run_translated_c.zig b/test/run_translated_c.zig index bc37b07661..1e8f081c11 100644 --- a/test/run_translated_c.zig +++ b/test/run_translated_c.zig @@ -1851,4 +1851,14 @@ pub fn addCases(cases: *tests.RunTranslatedCContext) void { \\ return 0; \\} , ""); + + cases.add("Nested comma operator in macro. Issue #11040", + \\#include + \\#define FOO (1, (2, 3)) + \\int main(void) { + \\ int x = FOO; + \\ if (x != 3) abort(); + \\ return 0; + \\} + , ""); }