authorgravatar for lord@mzte.deLordMZTE <lord@mzte.de> 2022-06-29 16:03:29+02:00
committergravatar for lord@mzte.deLordMZTE <lord@mzte.de> 2022-06-29 16:03:29+02:00
log7b32062775cca303d8a2fc72b17545b0246f9f9a
tree48df9a255d8a064c677a1ec3e402f6f466571f0a
parent234ccb4a5088cd6fa06144d7ba1aceab0596f1cc
signaturelock-open Commit is signed but in an unrecognized format.

translate-c: fix cast or call macro with parenthesis


3 files changed, 23 insertions(+), 0 deletions(-)

src/translate_c.zig+2
...@@ -5110,6 +5110,7 @@ const PatternList = struct {...@@ -5110,6 +5110,7 @@ const PatternList = struct {
5110 [2][]const u8{ "ULL_SUFFIX(X) (X ## ULL)", "ULL_SUFFIX" },5110 [2][]const u8{ "ULL_SUFFIX(X) (X ## ULL)", "ULL_SUFFIX" },
51115111
5112 [2][]const u8{ "CAST_OR_CALL(X, Y) (X)(Y)", "CAST_OR_CALL" },5112 [2][]const u8{ "CAST_OR_CALL(X, Y) (X)(Y)", "CAST_OR_CALL" },
5113 [2][]const u8{ "CAST_OR_CALL(X, Y) ((X)(Y))", "CAST_OR_CALL" },
51135114
5114 [2][]const u8{5115 [2][]const u8{
5115 \\wl_container_of(ptr, sample, member) \5116 \\wl_container_of(ptr, sample, member) \
...@@ -5303,6 +5304,7 @@ test "Macro matching" {...@@ -5303,6 +5304,7 @@ test "Macro matching" {
53035304
5304 try helper.checkMacro(allocator, pattern_list, "NO_MATCH(X, Y) (X + Y)", null);5305 try helper.checkMacro(allocator, pattern_list, "NO_MATCH(X, Y) (X + Y)", null);
5305 try helper.checkMacro(allocator, pattern_list, "CAST_OR_CALL(X, Y) (X)(Y)", "CAST_OR_CALL");5306 try helper.checkMacro(allocator, pattern_list, "CAST_OR_CALL(X, Y) (X)(Y)", "CAST_OR_CALL");
5307 try helper.checkMacro(allocator, pattern_list, "CAST_OR_CALL(X, Y) ((X)(Y))", "CAST_OR_CALL");
5306 try helper.checkMacro(allocator, pattern_list, "IGNORE_ME(X) (void)(X)", "DISCARD");5308 try helper.checkMacro(allocator, pattern_list, "IGNORE_ME(X) (void)(X)", "DISCARD");
5307 try helper.checkMacro(allocator, pattern_list, "IGNORE_ME(X) ((void)(X))", "DISCARD");5309 try helper.checkMacro(allocator, pattern_list, "IGNORE_ME(X) ((void)(X))", "DISCARD");
5308 try helper.checkMacro(allocator, pattern_list, "IGNORE_ME(X) (const void)(X)", "DISCARD");5310 try helper.checkMacro(allocator, pattern_list, "IGNORE_ME(X) (const void)(X)", "DISCARD");
test/behavior/translate_c_macros.h+1
...@@ -37,5 +37,6 @@ union U {...@@ -37,5 +37,6 @@ union U {
37#define IGNORE_ME_10(x) (volatile const void)(x)37#define IGNORE_ME_10(x) (volatile const void)(x)
3838
39#define UNION_CAST(X) (union U)(X)39#define UNION_CAST(X) (union U)(X)
40#define CAST_OR_CALL_WITH_PARENS(type_or_fn, val) ((type_or_fn)(val))
4041
41#define NESTED_COMMA_OPERATOR (1, (2, 3))42#define NESTED_COMMA_OPERATOR (1, (2, 3))
test/behavior/translate_c_macros.zig+20
...@@ -70,6 +70,26 @@ test "casting to union with a macro" {...@@ -70,6 +70,26 @@ test "casting to union with a macro" {
70 try expect(d == casted.d);70 try expect(d == casted.d);
71}71}
7272
73test "casting or calling a value with a paren-surrounded macro" {
74 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
75 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
76 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
77 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
78 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
79
80 const l: c_long = 42;
81 const casted = h.CAST_OR_CALL_WITH_PARENS(c_int, l);
82 try expect(casted == @intCast(c_int, l));
83
84 const Helper = struct {
85 fn foo(n: c_int) !void {
86 try expect(n == 42);
87 }
88 };
89
90 try h.CAST_OR_CALL_WITH_PARENS(Helper.foo, 42);
91}
92
73test "nested comma operator" {93test "nested comma operator" {
74 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO94 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
75 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO95 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO