authorgravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2021-04-25 16:50:41+02:00
committergravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2021-04-25 16:50:41+02:00
logae15022406e5d59787195130cfd5261c6336f41c
treeff5184e7f432c08496bcbee186f5c5856c6efca1
parent19cec0db1e8a9fefd8295c81edb03d631c624e62

translate-c: Fix casting of function pointers

The @ptrCast(X, @alignCast(@alignOf(T), Y)) pattern is only correct if T is not a function type or a pointer, in that case the @alignOf refers to the pointer itself and not to the pointee type.

3 files changed, 21 insertions(+), 11 deletions(-)

src/translate_c.zig+1-1
......@@ -3539,7 +3539,7 @@ fn transCPtrCast(
35393539 expr
35403540 else blk: {
35413541 const child_type_node = try transQualType(c, scope, child_type, loc);
3542 const alignof = try Tag.alignof.create(c.arena, child_type_node);
3542 const alignof = try Tag.std_meta_alignment.create(c.arena, child_type_node);
35433543 const align_cast = try Tag.align_cast.create(c.arena, .{ .lhs = alignof, .rhs = expr });
35443544 break :blk align_cast;
35453545 };
src/translate_c/ast.zig+11-1
......@@ -120,8 +120,11 @@ pub const Node = extern union {
120120 std_math_Log2Int,
121121 /// @intCast(lhs, rhs)
122122 int_cast,
123 /// @rem(lhs, rhs)
123 /// @import("std").meta.promoteIntLiteral(value, type, radix)
124124 std_meta_promoteIntLiteral,
125 /// @import("std").meta.alignment(value)
126 std_meta_alignment,
127 /// @rem(lhs, rhs)
125128 rem,
126129 /// @divTrunc(lhs, rhs)
127130 div_trunc,
......@@ -260,6 +263,7 @@ pub const Node = extern union {
260263 .switch_else,
261264 .block_single,
262265 .std_meta_sizeof,
266 .std_meta_alignment,
263267 .bool_to_int,
264268 .sizeof,
265269 .alignof,
......@@ -876,6 +880,11 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {
876880 const import_node = try renderStdImport(c, "meta", "promoteIntLiteral");
877881 return renderCall(c, import_node, &.{ payload.type, payload.value, payload.radix });
878882 },
883 .std_meta_alignment => {
884 const payload = node.castTag(.std_meta_alignment).?.data;
885 const import_node = try renderStdImport(c, "meta", "alignment");
886 return renderCall(c, import_node, &.{payload});
887 },
879888 .std_meta_sizeof => {
880889 const payload = node.castTag(.std_meta_sizeof).?.data;
881890 const import_node = try renderStdImport(c, "meta", "sizeof");
......@@ -2144,6 +2153,7 @@ fn renderNodeGrouped(c: *Context, node: Node) !NodeIndex {
21442153 .typeof,
21452154 .typeinfo,
21462155 .std_meta_sizeof,
2156 .std_meta_alignment,
21472157 .std_meta_cast,
21482158 .std_meta_promoteIntLiteral,
21492159 .std_meta_vector,
test/translate_c.zig+9-9
......@@ -1363,7 +1363,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
13631363 , &[_][]const u8{
13641364 \\pub export fn ptrcast() [*c]f32 {
13651365 \\ var a: [*c]c_int = undefined;
1366 \\ return @ptrCast([*c]f32, @alignCast(@alignOf(f32), a));
1366 \\ return @ptrCast([*c]f32, @alignCast(@import("std").meta.alignment(f32), a));
13671367 \\}
13681368 });
13691369
......@@ -1387,16 +1387,16 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
13871387 \\pub export fn test_ptr_cast() void {
13881388 \\ var p: ?*c_void = undefined;
13891389 \\ {
1390 \\ var to_char: [*c]u8 = @ptrCast([*c]u8, @alignCast(@alignOf(u8), p));
1391 \\ var to_short: [*c]c_short = @ptrCast([*c]c_short, @alignCast(@alignOf(c_short), p));
1392 \\ var to_int: [*c]c_int = @ptrCast([*c]c_int, @alignCast(@alignOf(c_int), p));
1393 \\ var to_longlong: [*c]c_longlong = @ptrCast([*c]c_longlong, @alignCast(@alignOf(c_longlong), p));
1390 \\ var to_char: [*c]u8 = @ptrCast([*c]u8, @alignCast(@import("std").meta.alignment(u8), p));
1391 \\ var to_short: [*c]c_short = @ptrCast([*c]c_short, @alignCast(@import("std").meta.alignment(c_short), p));
1392 \\ var to_int: [*c]c_int = @ptrCast([*c]c_int, @alignCast(@import("std").meta.alignment(c_int), p));
1393 \\ var to_longlong: [*c]c_longlong = @ptrCast([*c]c_longlong, @alignCast(@import("std").meta.alignment(c_longlong), p));
13941394 \\ }
13951395 \\ {
1396 \\ var to_char: [*c]u8 = @ptrCast([*c]u8, @alignCast(@alignOf(u8), p));
1397 \\ var to_short: [*c]c_short = @ptrCast([*c]c_short, @alignCast(@alignOf(c_short), p));
1398 \\ var to_int: [*c]c_int = @ptrCast([*c]c_int, @alignCast(@alignOf(c_int), p));
1399 \\ var to_longlong: [*c]c_longlong = @ptrCast([*c]c_longlong, @alignCast(@alignOf(c_longlong), p));
1396 \\ var to_char: [*c]u8 = @ptrCast([*c]u8, @alignCast(@import("std").meta.alignment(u8), p));
1397 \\ var to_short: [*c]c_short = @ptrCast([*c]c_short, @alignCast(@import("std").meta.alignment(c_short), p));
1398 \\ var to_int: [*c]c_int = @ptrCast([*c]c_int, @alignCast(@import("std").meta.alignment(c_int), p));
1399 \\ var to_longlong: [*c]c_longlong = @ptrCast([*c]c_longlong, @alignCast(@import("std").meta.alignment(c_longlong), p));
14001400 \\ }
14011401 \\}
14021402 });