| author | |
| committer | |
| log | ae15022406e5d59787195130cfd5261c6336f41c |
| tree | ff5184e7f432c08496bcbee186f5c5856c6efca1 |
| parent | 19cec0db1e8a9fefd8295c81edb03d631c624e62 |
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 | expr | 3539 | 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 | }); |
| 1369 | 1369 | ||
| ... | @@ -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 | }); |