authorgravatar for 33614480+em-dash@users.noreply.github.comMeredith Oleander <33614480+em-dash@users.noreply.github.com> 2022-08-05 22:38:48+10:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2022-08-05 15:38:48+03:00
logfd3415ad5e007005f7d568c41967c563e2066e95
tree7c526f182ab74edf9e3993f354aab1cb2e3a538d
parentb3950d4a88425719a642fe71d4739185a8632f89
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

translate-c: fix alignment in pointer casts


2 files changed, 22 insertions(+), 11 deletions(-)

src/translate_c.zig+1-2
...@@ -4001,8 +4001,7 @@ fn transCPtrCast(...@@ -4001,8 +4001,7 @@ fn transCPtrCast(
4001 // For opaque types a ptrCast is enough4001 // For opaque types a ptrCast is enough
4002 expr4002 expr
4003 else blk: {4003 else blk: {
4004 const child_type_node = try transQualType(c, scope, child_type, loc);4004 const alignof = try Tag.std_meta_alignment.create(c.arena, dst_type_node);
4005 const alignof = try Tag.std_meta_alignment.create(c.arena, child_type_node);
4006 const align_cast = try Tag.align_cast.create(c.arena, .{ .lhs = alignof, .rhs = expr });4005 const align_cast = try Tag.align_cast.create(c.arena, .{ .lhs = alignof, .rhs = expr });
4007 break :blk align_cast;4006 break :blk align_cast;
4008 };4007 };
test/translate_c.zig+21-9
...@@ -1485,7 +1485,19 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -1485,7 +1485,19 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
1485 , &[_][]const u8{1485 , &[_][]const u8{
1486 \\pub export fn ptrcast() [*c]f32 {1486 \\pub export fn ptrcast() [*c]f32 {
1487 \\ var a: [*c]c_int = undefined;1487 \\ var a: [*c]c_int = undefined;
1488 \\ return @ptrCast([*c]f32, @alignCast(@import("std").meta.alignment(f32), a));1488 \\ return @ptrCast([*c]f32, @alignCast(@import("std").meta.alignment([*c]f32), a));
1489 \\}
1490 });
1491
1492 cases.add("casting pointer to pointer",
1493 \\float **ptrptrcast() {
1494 \\ int **a;
1495 \\ return (float **)a;
1496 \\}
1497 , &[_][]const u8{
1498 \\pub export fn ptrptrcast() [*c][*c]f32 {
1499 \\ var a: [*c][*c]c_int = undefined;
1500 \\ return @ptrCast([*c][*c]f32, @alignCast(@import("std").meta.alignment([*c][*c]f32), a));
1489 \\}1501 \\}
1490 });1502 });
14911503
...@@ -1509,23 +1521,23 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -1509,23 +1521,23 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
1509 \\pub export fn test_ptr_cast() void {1521 \\pub export fn test_ptr_cast() void {
1510 \\ var p: ?*anyopaque = undefined;1522 \\ var p: ?*anyopaque = undefined;
1511 \\ {1523 \\ {
1512 \\ var to_char: [*c]u8 = @ptrCast([*c]u8, @alignCast(@import("std").meta.alignment(u8), p));1524 \\ var to_char: [*c]u8 = @ptrCast([*c]u8, @alignCast(@import("std").meta.alignment([*c]u8), p));
1513 \\ _ = to_char;1525 \\ _ = to_char;
1514 \\ var to_short: [*c]c_short = @ptrCast([*c]c_short, @alignCast(@import("std").meta.alignment(c_short), p));1526 \\ var to_short: [*c]c_short = @ptrCast([*c]c_short, @alignCast(@import("std").meta.alignment([*c]c_short), p));
1515 \\ _ = to_short;1527 \\ _ = to_short;
1516 \\ var to_int: [*c]c_int = @ptrCast([*c]c_int, @alignCast(@import("std").meta.alignment(c_int), p));1528 \\ var to_int: [*c]c_int = @ptrCast([*c]c_int, @alignCast(@import("std").meta.alignment([*c]c_int), p));
1517 \\ _ = to_int;1529 \\ _ = to_int;
1518 \\ var to_longlong: [*c]c_longlong = @ptrCast([*c]c_longlong, @alignCast(@import("std").meta.alignment(c_longlong), p));1530 \\ var to_longlong: [*c]c_longlong = @ptrCast([*c]c_longlong, @alignCast(@import("std").meta.alignment([*c]c_longlong), p));
1519 \\ _ = to_longlong;1531 \\ _ = to_longlong;
1520 \\ }1532 \\ }
1521 \\ {1533 \\ {
1522 \\ var to_char: [*c]u8 = @ptrCast([*c]u8, @alignCast(@import("std").meta.alignment(u8), p));1534 \\ var to_char: [*c]u8 = @ptrCast([*c]u8, @alignCast(@import("std").meta.alignment([*c]u8), p));
1523 \\ _ = to_char;1535 \\ _ = to_char;
1524 \\ var to_short: [*c]c_short = @ptrCast([*c]c_short, @alignCast(@import("std").meta.alignment(c_short), p));1536 \\ var to_short: [*c]c_short = @ptrCast([*c]c_short, @alignCast(@import("std").meta.alignment([*c]c_short), p));
1525 \\ _ = to_short;1537 \\ _ = to_short;
1526 \\ var to_int: [*c]c_int = @ptrCast([*c]c_int, @alignCast(@import("std").meta.alignment(c_int), p));1538 \\ var to_int: [*c]c_int = @ptrCast([*c]c_int, @alignCast(@import("std").meta.alignment([*c]c_int), p));
1527 \\ _ = to_int;1539 \\ _ = to_int;
1528 \\ var to_longlong: [*c]c_longlong = @ptrCast([*c]c_longlong, @alignCast(@import("std").meta.alignment(c_longlong), p));1540 \\ var to_longlong: [*c]c_longlong = @ptrCast([*c]c_longlong, @alignCast(@import("std").meta.alignment([*c]c_longlong), p));
1529 \\ _ = to_longlong;1541 \\ _ = to_longlong;
1530 \\ }1542 \\ }
1531 \\}1543 \\}