| author | |
| committer | |
| log | 2a4e89e0c9428b1ca59bc23c7c1d667c8ddb2304 |
| tree | 69c4313e5f326b0b7964fd5b66d5d485e4003a45 |
| parent | 312260124279027a248d669e6096c3ab603fa188 |
Closes #129843 files changed, 41 insertions(+), 2 deletions(-)
src/type.zig+18-2| ... | ... | @@ -3458,12 +3458,21 @@ pub const Type = extern union { |
| 3458 | 3458 | else => {}, |
| 3459 | 3459 | } |
| 3460 | 3460 | |
| 3461 | const payload_size = switch (try child_type.abiSizeAdvanced(target, strat)) { | |
| 3462 | .scalar => |elem_size| elem_size, | |
| 3463 | .val => switch (strat) { | |
| 3464 | .sema_kit => unreachable, | |
| 3465 | .eager => unreachable, | |
| 3466 | .lazy => |arena| return AbiSizeAdvanced{ .val = try Value.Tag.lazy_size.create(arena, ty) }, | |
| 3467 | }, | |
| 3468 | }; | |
| 3469 | ||
| 3461 | 3470 | // Optional types are represented as a struct with the child type as the first |
| 3462 | 3471 | // field and a boolean as the second. Since the child type's abi alignment is |
| 3463 | 3472 | // guaranteed to be >= that of bool's (1 byte) the added size is exactly equal |
| 3464 | 3473 | // to the child type's ABI alignment. |
| 3465 | 3474 | return AbiSizeAdvanced{ |
| 3466 | .scalar = child_type.abiAlignment(target) + child_type.abiSize(target), | |
| 3475 | .scalar = child_type.abiAlignment(target) + payload_size, | |
| 3467 | 3476 | }; |
| 3468 | 3477 | }, |
| 3469 | 3478 | |
| ... | ... | @@ -3478,7 +3487,14 @@ pub const Type = extern union { |
| 3478 | 3487 | } |
| 3479 | 3488 | const code_align = abiAlignment(Type.anyerror, target); |
| 3480 | 3489 | const payload_align = abiAlignment(data.payload, target); |
| 3481 | const payload_size = abiSize(data.payload, target); | |
| 3490 | const payload_size = switch (try data.payload.abiSizeAdvanced(target, strat)) { | |
| 3491 | .scalar => |elem_size| elem_size, | |
| 3492 | .val => switch (strat) { | |
| 3493 | .sema_kit => unreachable, | |
| 3494 | .eager => unreachable, | |
| 3495 | .lazy => |arena| return AbiSizeAdvanced{ .val = try Value.Tag.lazy_size.create(arena, ty) }, | |
| 3496 | }, | |
| 3497 | }; | |
| 3482 | 3498 | |
| 3483 | 3499 | var size: u64 = 0; |
| 3484 | 3500 | if (code_align > payload_align) { |
test/behavior.zig+1| ... | ... | @@ -98,6 +98,7 @@ test { |
| 98 | 98 | _ = @import("behavior/bugs/12911.zig"); |
| 99 | 99 | _ = @import("behavior/bugs/12928.zig"); |
| 100 | 100 | _ = @import("behavior/bugs/12945.zig"); |
| 101 | _ = @import("behavior/bugs/12984.zig"); | |
| 101 | 102 | _ = @import("behavior/byteswap.zig"); |
| 102 | 103 | _ = @import("behavior/byval_arg_var.zig"); |
| 103 | 104 | _ = @import("behavior/call.zig"); |
test/behavior/bugs/12984.zig created+22| ... | ... | @@ -0,0 +1,22 @@ |
| 1 | const std = @import("std"); | |
| 2 | const builtin = @import("builtin"); | |
| 3 | ||
| 4 | pub fn DeleagateWithContext(comptime Function: type) type { | |
| 5 | const ArgArgs = std.meta.ArgsTuple(Function); | |
| 6 | return struct { | |
| 7 | t: ArgArgs, | |
| 8 | }; | |
| 9 | } | |
| 10 | ||
| 11 | pub const OnConfirm = DeleagateWithContext(fn (bool) void); | |
| 12 | pub const CustomDraw = DeleagateWithContext(fn (?OnConfirm) void); | |
| 13 | ||
| 14 | test "simple test" { | |
| 15 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | |
| 16 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | |
| 17 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | |
| 18 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | |
| 19 | ||
| 20 | var c: CustomDraw = undefined; | |
| 21 | _ = c; | |
| 22 | } |