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(...@@ -3539,7 +3539,7 @@ fn transCPtrCast(
3539 expr3539 expr
3540 else blk: {3540 else blk: {
3541 const child_type_node = try transQualType(c, scope, child_type, loc);3541 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);
3543 const align_cast = try Tag.align_cast.create(c.arena, .{ .lhs = alignof, .rhs = expr });3543 const align_cast = try Tag.align_cast.create(c.arena, .{ .lhs = alignof, .rhs = expr });
3544 break :blk align_cast;3544 break :blk align_cast;
3545 };3545 };
src/translate_c/ast.zig+11-1
...@@ -120,8 +120,11 @@ pub const Node = extern union {...@@ -120,8 +120,11 @@ pub const Node = extern union {
120 std_math_Log2Int,120 std_math_Log2Int,
121 /// @intCast(lhs, rhs)121 /// @intCast(lhs, rhs)
122 int_cast,122 int_cast,
123 /// @rem(lhs, rhs)123 /// @import("std").meta.promoteIntLiteral(value, type, radix)
124 std_meta_promoteIntLiteral,124 std_meta_promoteIntLiteral,
125 /// @import("std").meta.alignment(value)
126 std_meta_alignment,
127 /// @rem(lhs, rhs)
125 rem,128 rem,
126 /// @divTrunc(lhs, rhs)129 /// @divTrunc(lhs, rhs)
127 div_trunc,130 div_trunc,
...@@ -260,6 +263,7 @@ pub const Node = extern union {...@@ -260,6 +263,7 @@ pub const Node = extern union {
260 .switch_else,263 .switch_else,
261 .block_single,264 .block_single,
262 .std_meta_sizeof,265 .std_meta_sizeof,
266 .std_meta_alignment,
263 .bool_to_int,267 .bool_to_int,
264 .sizeof,268 .sizeof,
265 .alignof,269 .alignof,
...@@ -876,6 +880,11 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {...@@ -876,6 +880,11 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {
876 const import_node = try renderStdImport(c, "meta", "promoteIntLiteral");880 const import_node = try renderStdImport(c, "meta", "promoteIntLiteral");
877 return renderCall(c, import_node, &.{ payload.type, payload.value, payload.radix });881 return renderCall(c, import_node, &.{ payload.type, payload.value, payload.radix });
878 },882 },
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 },
879 .std_meta_sizeof => {888 .std_meta_sizeof => {
880 const payload = node.castTag(.std_meta_sizeof).?.data;889 const payload = node.castTag(.std_meta_sizeof).?.data;
881 const import_node = try renderStdImport(c, "meta", "sizeof");890 const import_node = try renderStdImport(c, "meta", "sizeof");
...@@ -2144,6 +2153,7 @@ fn renderNodeGrouped(c: *Context, node: Node) !NodeIndex {...@@ -2144,6 +2153,7 @@ fn renderNodeGrouped(c: *Context, node: Node) !NodeIndex {
2144 .typeof,2153 .typeof,
2145 .typeinfo,2154 .typeinfo,
2146 .std_meta_sizeof,2155 .std_meta_sizeof,
2156 .std_meta_alignment,
2147 .std_meta_cast,2157 .std_meta_cast,
2148 .std_meta_promoteIntLiteral,2158 .std_meta_promoteIntLiteral,
2149 .std_meta_vector,2159 .std_meta_vector,
test/translate_c.zig+9-9
...@@ -1363,7 +1363,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -1363,7 +1363,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
1363 , &[_][]const u8{1363 , &[_][]const u8{
1364 \\pub export fn ptrcast() [*c]f32 {1364 \\pub export fn ptrcast() [*c]f32 {
1365 \\ var a: [*c]c_int = undefined;1365 \\ 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));
1367 \\}1367 \\}
1368 });1368 });
13691369
...@@ -1387,16 +1387,16 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -1387,16 +1387,16 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
1387 \\pub export fn test_ptr_cast() void {1387 \\pub export fn test_ptr_cast() void {
1388 \\ var p: ?*c_void = undefined;1388 \\ var p: ?*c_void = undefined;
1389 \\ {1389 \\ {
1390 \\ var to_char: [*c]u8 = @ptrCast([*c]u8, @alignCast(@alignOf(u8), 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(@alignOf(c_short), 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(@alignOf(c_int), 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(@alignOf(c_longlong), p));1393 \\ var to_longlong: [*c]c_longlong = @ptrCast([*c]c_longlong, @alignCast(@import("std").meta.alignment(c_longlong), p));
1394 \\ }1394 \\ }
1395 \\ {1395 \\ {
1396 \\ var to_char: [*c]u8 = @ptrCast([*c]u8, @alignCast(@alignOf(u8), 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(@alignOf(c_short), 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(@alignOf(c_int), 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(@alignOf(c_longlong), p));1399 \\ var to_longlong: [*c]c_longlong = @ptrCast([*c]c_longlong, @alignCast(@import("std").meta.alignment(c_longlong), p));
1400 \\ }1400 \\ }
1401 \\}1401 \\}
1402 });1402 });