authorgravatar for topolarity@tapscott.meCody Tapscott <topolarity@tapscott.me> 2022-03-19 11:59:41-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-03-19 19:41:23-04:00
log19331b323d15b0fa0bae7add37a03528256a119f
treefcd72015345f8524892a32102d59f966eceebb7b
parent5c3325588ef4e85e85cb201ad9328fe26bbb8dca

stage2: Correctly align decls for comptime allocs

This updates WipAnonDecl to require an alignment provided by the caller, which is needed for explicitly aligned comptime allocs.

2 files changed, 54 insertions(+), 7 deletions(-)

src/Sema.zig+39-7
...@@ -486,15 +486,19 @@ pub const Block = struct {...@@ -486,15 +486,19 @@ pub const Block = struct {
486 wad.* = undefined;486 wad.* = undefined;
487 }487 }
488488
489 pub fn finish(wad: *WipAnonDecl, ty: Type, val: Value) !*Decl {489 pub fn finish(wad: *WipAnonDecl, ty: Type, val: Value, alignment: u32) !*Decl {
490 const sema = wad.block.sema;490 const sema = wad.block.sema;
491 // Do this ahead of time because `createAnonymousDecl` depends on calling491 // Do this ahead of time because `createAnonymousDecl` depends on calling
492 // `type.hasRuntimeBits()`.492 // `type.hasRuntimeBits()`.
493 _ = try sema.typeHasRuntimeBits(wad.block, wad.src, ty);493 _ = try sema.typeHasRuntimeBits(wad.block, wad.src, ty);
494 const align_val = if (alignment != 0) blk: {
495 break :blk try Value.Tag.int_u64.create(wad.arena(), alignment);
496 } else Value.@"null";
494 const new_decl = try sema.mod.createAnonymousDecl(wad.block, .{497 const new_decl = try sema.mod.createAnonymousDecl(wad.block, .{
495 .ty = ty,498 .ty = ty,
496 .val = val,499 .val = val,
497 });500 });
501 new_decl.align_val = align_val;
498 errdefer sema.mod.abortAnonDecl(new_decl);502 errdefer sema.mod.abortAnonDecl(new_decl);
499 try new_decl.finalizeNewArena(&wad.new_decl_arena);503 try new_decl.finalizeNewArena(&wad.new_decl_arena);
500 wad.finished = true;504 wad.finished = true;
...@@ -1644,6 +1648,7 @@ fn zirCoerceResultPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileE...@@ -1644,6 +1648,7 @@ fn zirCoerceResultPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileE
1644 iac.data.decl = try anon_decl.finish(1648 iac.data.decl = try anon_decl.finish(
1645 try pointee_ty.copy(anon_decl.arena()),1649 try pointee_ty.copy(anon_decl.arena()),
1646 Value.undef,1650 Value.undef,
1651 iac.data.alignment,
1647 );1652 );
1648 if (iac.data.alignment != 0) {1653 if (iac.data.alignment != 0) {
1649 try sema.resolveTypeLayout(block, src, pointee_ty);1654 try sema.resolveTypeLayout(block, src, pointee_ty);
...@@ -2711,6 +2716,7 @@ fn zirResolveInferredAlloc(sema: *Sema, block: *Block, inst: Zir.Inst.Index) Com...@@ -2711,6 +2716,7 @@ fn zirResolveInferredAlloc(sema: *Sema, block: *Block, inst: Zir.Inst.Index) Com
2711 const new_decl = try anon_decl.finish(2716 const new_decl = try anon_decl.finish(
2712 try final_elem_ty.copy(anon_decl.arena()),2717 try final_elem_ty.copy(anon_decl.arena()),
2713 try store_val.copy(anon_decl.arena()),2718 try store_val.copy(anon_decl.arena()),
2719 inferred_alloc.data.alignment,
2714 );2720 );
2715 break :d new_decl;2721 break :d new_decl;
2716 };2722 };
...@@ -3503,8 +3509,8 @@ fn storeToInferredAllocComptime(...@@ -3503,8 +3509,8 @@ fn storeToInferredAllocComptime(
3503 iac.data.decl = try anon_decl.finish(3509 iac.data.decl = try anon_decl.finish(
3504 try operand_ty.copy(anon_decl.arena()),3510 try operand_ty.copy(anon_decl.arena()),
3505 try operand_val.copy(anon_decl.arena()),3511 try operand_val.copy(anon_decl.arena()),
3512 iac.data.alignment,
3506 );3513 );
3507 // TODO set the alignment on the decl
3508 return;3514 return;
3509 } else {3515 } else {
3510 return sema.failWithNeededComptime(block, src);3516 return sema.failWithNeededComptime(block, src);
...@@ -3583,6 +3589,7 @@ fn addStrLit(sema: *Sema, block: *Block, zir_bytes: []const u8) CompileError!Air...@@ -3583,6 +3589,7 @@ fn addStrLit(sema: *Sema, block: *Block, zir_bytes: []const u8) CompileError!Air
3583 const new_decl = try anon_decl.finish(3589 const new_decl = try anon_decl.finish(
3584 try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), bytes.len),3590 try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), bytes.len),
3585 try Value.Tag.bytes.create(anon_decl.arena(), bytes[0 .. bytes.len + 1]),3591 try Value.Tag.bytes.create(anon_decl.arena(), bytes[0 .. bytes.len + 1]),
3592 0, // default alignment
3586 );3593 );
35873594
3588 return sema.analyzeDeclRef(new_decl);3595 return sema.analyzeDeclRef(new_decl);
...@@ -8147,6 +8154,7 @@ fn zirEmbedFile(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A...@@ -8147,6 +8154,7 @@ fn zirEmbedFile(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A
8147 embed_file.owner_decl = try anon_decl.finish(8154 embed_file.owner_decl = try anon_decl.finish(
8148 try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), embed_file.bytes.len),8155 try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), embed_file.bytes.len),
8149 try Value.Tag.bytes.create(anon_decl.arena(), bytes_including_null),8156 try Value.Tag.bytes.create(anon_decl.arena(), bytes_including_null),
8157 0, // default alignment
8150 );8158 );
81518159
8152 return sema.analyzeDeclRef(embed_file.owner_decl);8160 return sema.analyzeDeclRef(embed_file.owner_decl);
...@@ -8560,7 +8568,7 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -8560,7 +8568,7 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
8560 .elem_type = try lhs_info.elem_type.copy(anon_decl.arena()),8568 .elem_type = try lhs_info.elem_type.copy(anon_decl.arena()),
8561 });8569 });
8562 const val = try Value.Tag.aggregate.create(anon_decl.arena(), buf);8570 const val = try Value.Tag.aggregate.create(anon_decl.arena(), buf);
8563 const decl = try anon_decl.finish(ty, val);8571 const decl = try anon_decl.finish(ty, val, 0);
8564 if (lhs_single_ptr or rhs_single_ptr) {8572 if (lhs_single_ptr or rhs_single_ptr) {
8565 return sema.analyzeDeclRef(decl);8573 return sema.analyzeDeclRef(decl);
8566 } else {8574 } else {
...@@ -8733,7 +8741,7 @@ fn zirArrayMul(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -8733,7 +8741,7 @@ fn zirArrayMul(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
8733 }8741 }
8734 break :blk try Value.Tag.aggregate.create(anon_decl.arena(), buf);8742 break :blk try Value.Tag.aggregate.create(anon_decl.arena(), buf);
8735 };8743 };
8736 const decl = try anon_decl.finish(final_ty, val);8744 const decl = try anon_decl.finish(final_ty, val, 0);
8737 if (is_single_ptr) {8745 if (is_single_ptr) {
8738 return sema.analyzeDeclRef(decl);8746 return sema.analyzeDeclRef(decl);
8739 } else {8747 } else {
...@@ -10384,6 +10392,7 @@ fn zirBuiltinSrc(...@@ -10384,6 +10392,7 @@ fn zirBuiltinSrc(
10384 const new_decl = try anon_decl.finish(10392 const new_decl = try anon_decl.finish(
10385 try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), bytes.len - 1),10393 try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), bytes.len - 1),
10386 try Value.Tag.bytes.create(anon_decl.arena(), bytes),10394 try Value.Tag.bytes.create(anon_decl.arena(), bytes),
10395 0, // default alignment
10387 );10396 );
10388 break :blk try Value.Tag.decl_ref.create(sema.arena, new_decl);10397 break :blk try Value.Tag.decl_ref.create(sema.arena, new_decl);
10389 };10398 };
...@@ -10395,6 +10404,7 @@ fn zirBuiltinSrc(...@@ -10395,6 +10404,7 @@ fn zirBuiltinSrc(
10395 const new_decl = try anon_decl.finish(10404 const new_decl = try anon_decl.finish(
10396 try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), name.len),10405 try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), name.len),
10397 try Value.Tag.bytes.create(anon_decl.arena(), name[0 .. name.len + 1]),10406 try Value.Tag.bytes.create(anon_decl.arena(), name[0 .. name.len + 1]),
10407 0, // default alignment
10398 );10408 );
10399 break :blk try Value.Tag.decl_ref.create(sema.arena, new_decl);10409 break :blk try Value.Tag.decl_ref.create(sema.arena, new_decl);
10400 };10410 };
...@@ -10547,6 +10557,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -10547,6 +10557,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
10547 params_anon_decl.arena(),10557 params_anon_decl.arena(),
10548 param_vals,10558 param_vals,
10549 ),10559 ),
10560 0, // default alignment
10550 );10561 );
10551 break :v try Value.Tag.slice.create(sema.arena, .{10562 break :v try Value.Tag.slice.create(sema.arena, .{
10552 .ptr = try Value.Tag.decl_ref.create(sema.arena, new_decl),10563 .ptr = try Value.Tag.decl_ref.create(sema.arena, new_decl),
...@@ -10736,6 +10747,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -10736,6 +10747,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
10736 const new_decl = try anon_decl.finish(10747 const new_decl = try anon_decl.finish(
10737 try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), bytes.len),10748 try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), bytes.len),
10738 try Value.Tag.bytes.create(anon_decl.arena(), bytes[0 .. bytes.len + 1]),10749 try Value.Tag.bytes.create(anon_decl.arena(), bytes[0 .. bytes.len + 1]),
10750 0, // default alignment
10739 );10751 );
10740 break :v try Value.Tag.decl_ref.create(fields_anon_decl.arena(), new_decl);10752 break :v try Value.Tag.decl_ref.create(fields_anon_decl.arena(), new_decl);
10741 };10753 };
...@@ -10766,6 +10778,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -10766,6 +10778,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
10766 fields_anon_decl.arena(),10778 fields_anon_decl.arena(),
10767 vals,10779 vals,
10768 ),10780 ),
10781 0, // default alignment
10769 );10782 );
1077010783
10771 const new_decl_val = try Value.Tag.decl_ref.create(sema.arena, new_decl);10784 const new_decl_val = try Value.Tag.decl_ref.create(sema.arena, new_decl);
...@@ -10844,6 +10857,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -10844,6 +10857,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
10844 const new_decl = try anon_decl.finish(10857 const new_decl = try anon_decl.finish(
10845 try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), bytes.len),10858 try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), bytes.len),
10846 try Value.Tag.bytes.create(anon_decl.arena(), bytes[0 .. bytes.len + 1]),10859 try Value.Tag.bytes.create(anon_decl.arena(), bytes[0 .. bytes.len + 1]),
10860 0, // default alignment
10847 );10861 );
10848 break :v try Value.Tag.decl_ref.create(fields_anon_decl.arena(), new_decl);10862 break :v try Value.Tag.decl_ref.create(fields_anon_decl.arena(), new_decl);
10849 };10863 };
...@@ -10868,6 +10882,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -10868,6 +10882,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
10868 fields_anon_decl.arena(),10882 fields_anon_decl.arena(),
10869 enum_field_vals,10883 enum_field_vals,
10870 ),10884 ),
10885 0, // default alignment
10871 );10886 );
10872 break :v try Value.Tag.decl_ref.create(sema.arena, new_decl);10887 break :v try Value.Tag.decl_ref.create(sema.arena, new_decl);
10873 };10888 };
...@@ -10936,6 +10951,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -10936,6 +10951,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
10936 const new_decl = try anon_decl.finish(10951 const new_decl = try anon_decl.finish(
10937 try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), bytes.len),10952 try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), bytes.len),
10938 try Value.Tag.bytes.create(anon_decl.arena(), bytes[0 .. bytes.len + 1]),10953 try Value.Tag.bytes.create(anon_decl.arena(), bytes[0 .. bytes.len + 1]),
10954 0, // default alignment
10939 );10955 );
10940 break :v try Value.Tag.decl_ref.create(fields_anon_decl.arena(), new_decl);10956 break :v try Value.Tag.decl_ref.create(fields_anon_decl.arena(), new_decl);
10941 };10957 };
...@@ -10967,6 +10983,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -10967,6 +10983,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
10967 fields_anon_decl.arena(),10983 fields_anon_decl.arena(),
10968 try fields_anon_decl.arena().dupe(Value, union_field_vals),10984 try fields_anon_decl.arena().dupe(Value, union_field_vals),
10969 ),10985 ),
10986 0, // default alignment
10970 );10987 );
10971 break :v try Value.Tag.slice.create(sema.arena, .{10988 break :v try Value.Tag.slice.create(sema.arena, .{
10972 .ptr = try Value.Tag.decl_ref.create(sema.arena, new_decl),10989 .ptr = try Value.Tag.decl_ref.create(sema.arena, new_decl),
...@@ -11044,6 +11061,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -11044,6 +11061,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
11044 const new_decl = try anon_decl.finish(11061 const new_decl = try anon_decl.finish(
11045 try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), bytes.len),11062 try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), bytes.len),
11046 try Value.Tag.bytes.create(anon_decl.arena(), bytes[0 .. bytes.len + 1]),11063 try Value.Tag.bytes.create(anon_decl.arena(), bytes[0 .. bytes.len + 1]),
11064 0, // default alignment
11047 );11065 );
11048 break :v try Value.Tag.slice.create(fields_anon_decl.arena(), .{11066 break :v try Value.Tag.slice.create(fields_anon_decl.arena(), .{
11049 .ptr = try Value.Tag.decl_ref.create(fields_anon_decl.arena(), new_decl),11067 .ptr = try Value.Tag.decl_ref.create(fields_anon_decl.arena(), new_decl),
...@@ -11087,6 +11105,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -11087,6 +11105,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
11087 const new_decl = try anon_decl.finish(11105 const new_decl = try anon_decl.finish(
11088 try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), bytes.len),11106 try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), bytes.len),
11089 try Value.Tag.bytes.create(anon_decl.arena(), bytes[0 .. bytes.len + 1]),11107 try Value.Tag.bytes.create(anon_decl.arena(), bytes[0 .. bytes.len + 1]),
11108 0, // default alignment
11090 );11109 );
11091 break :v try Value.Tag.slice.create(fields_anon_decl.arena(), .{11110 break :v try Value.Tag.slice.create(fields_anon_decl.arena(), .{
11092 .ptr = try Value.Tag.decl_ref.create(fields_anon_decl.arena(), new_decl),11111 .ptr = try Value.Tag.decl_ref.create(fields_anon_decl.arena(), new_decl),
...@@ -11132,6 +11151,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -11132,6 +11151,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
11132 fields_anon_decl.arena(),11151 fields_anon_decl.arena(),
11133 try fields_anon_decl.arena().dupe(Value, struct_field_vals),11152 try fields_anon_decl.arena().dupe(Value, struct_field_vals),
11134 ),11153 ),
11154 0, // default alignment
11135 );11155 );
11136 break :v try Value.Tag.slice.create(sema.arena, .{11156 break :v try Value.Tag.slice.create(sema.arena, .{
11137 .ptr = try Value.Tag.decl_ref.create(sema.arena, new_decl),11157 .ptr = try Value.Tag.decl_ref.create(sema.arena, new_decl),
...@@ -11225,6 +11245,7 @@ fn typeInfoDecls(...@@ -11225,6 +11245,7 @@ fn typeInfoDecls(
11225 const new_decl = try anon_decl.finish(11245 const new_decl = try anon_decl.finish(
11226 try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), bytes.len),11246 try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), bytes.len),
11227 try Value.Tag.bytes.create(anon_decl.arena(), bytes[0 .. bytes.len + 1]),11247 try Value.Tag.bytes.create(anon_decl.arena(), bytes[0 .. bytes.len + 1]),
11248 0, // default alignment
11228 );11249 );
11229 break :v try Value.Tag.slice.create(decls_anon_decl.arena(), .{11250 break :v try Value.Tag.slice.create(decls_anon_decl.arena(), .{
11230 .ptr = try Value.Tag.decl_ref.create(decls_anon_decl.arena(), new_decl),11251 .ptr = try Value.Tag.decl_ref.create(decls_anon_decl.arena(), new_decl),
...@@ -11251,6 +11272,7 @@ fn typeInfoDecls(...@@ -11251,6 +11272,7 @@ fn typeInfoDecls(
11251 decls_anon_decl.arena(),11272 decls_anon_decl.arena(),
11252 try decls_anon_decl.arena().dupe(Value, decls_vals),11273 try decls_anon_decl.arena().dupe(Value, decls_vals),
11253 ),11274 ),
11275 0, // default alignment
11254 );11276 );
11255 return try Value.Tag.slice.create(sema.arena, .{11277 return try Value.Tag.slice.create(sema.arena, .{
11256 .ptr = try Value.Tag.decl_ref.create(sema.arena, new_decl),11278 .ptr = try Value.Tag.decl_ref.create(sema.arena, new_decl),
...@@ -12350,6 +12372,7 @@ fn addConstantMaybeRef(...@@ -12350,6 +12372,7 @@ fn addConstantMaybeRef(
12350 const decl = try anon_decl.finish(12372 const decl = try anon_decl.finish(
12351 try ty.copy(anon_decl.arena()),12373 try ty.copy(anon_decl.arena()),
12352 try val.copy(anon_decl.arena()),12374 try val.copy(anon_decl.arena()),
12375 0, // default alignment
12353 );12376 );
12354 return sema.analyzeDeclRef(decl);12377 return sema.analyzeDeclRef(decl);
12355}12378}
...@@ -13227,6 +13250,7 @@ fn zirTypeName(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -13227,6 +13250,7 @@ fn zirTypeName(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
13227 const new_decl = try anon_decl.finish(13250 const new_decl = try anon_decl.finish(
13228 try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), bytes.len),13251 try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), bytes.len),
13229 try Value.Tag.bytes.create(anon_decl.arena(), bytes[0 .. bytes.len + 1]),13252 try Value.Tag.bytes.create(anon_decl.arena(), bytes[0 .. bytes.len + 1]),
13253 0, // default alignment
13230 );13254 );
1323113255
13232 return sema.analyzeDeclRef(new_decl);13256 return sema.analyzeDeclRef(new_decl);
...@@ -15851,6 +15875,7 @@ fn safetyPanic(...@@ -15851,6 +15875,7 @@ fn safetyPanic(
15851 break :msg_inst try sema.analyzeDeclRef(try anon_decl.finish(15875 break :msg_inst try sema.analyzeDeclRef(try anon_decl.finish(
15852 try Type.Tag.array_u8.create(anon_decl.arena(), msg.len),15876 try Type.Tag.array_u8.create(anon_decl.arena(), msg.len),
15853 try Value.Tag.bytes.create(anon_decl.arena(), msg),15877 try Value.Tag.bytes.create(anon_decl.arena(), msg),
15878 0, // default alignment
15854 ));15879 ));
15855 };15880 };
1585615881
...@@ -16080,6 +16105,7 @@ fn fieldPtr(...@@ -16080,6 +16105,7 @@ fn fieldPtr(
16080 return sema.analyzeDeclRef(try anon_decl.finish(16105 return sema.analyzeDeclRef(try anon_decl.finish(
16081 Type.usize,16106 Type.usize,
16082 try Value.Tag.int_u64.create(anon_decl.arena(), inner_ty.arrayLen()),16107 try Value.Tag.int_u64.create(anon_decl.arena(), inner_ty.arrayLen()),
16108 0, // default alignment
16083 ));16109 ));
16084 } else {16110 } else {
16085 return sema.fail(16111 return sema.fail(
...@@ -16107,6 +16133,7 @@ fn fieldPtr(...@@ -16107,6 +16133,7 @@ fn fieldPtr(
16107 return sema.analyzeDeclRef(try anon_decl.finish(16133 return sema.analyzeDeclRef(try anon_decl.finish(
16108 try slice_ptr_ty.copy(anon_decl.arena()),16134 try slice_ptr_ty.copy(anon_decl.arena()),
16109 try val.slicePtr().copy(anon_decl.arena()),16135 try val.slicePtr().copy(anon_decl.arena()),
16136 0, // default alignment
16110 ));16137 ));
16111 }16138 }
16112 try sema.requireRuntimeBlock(block, src);16139 try sema.requireRuntimeBlock(block, src);
...@@ -16126,6 +16153,7 @@ fn fieldPtr(...@@ -16126,6 +16153,7 @@ fn fieldPtr(
16126 return sema.analyzeDeclRef(try anon_decl.finish(16153 return sema.analyzeDeclRef(try anon_decl.finish(
16127 Type.usize,16154 Type.usize,
16128 try Value.Tag.int_u64.create(anon_decl.arena(), val.sliceLen()),16155 try Value.Tag.int_u64.create(anon_decl.arena(), val.sliceLen()),
16156 0, // default alignment
16129 ));16157 ));
16130 }16158 }
16131 try sema.requireRuntimeBlock(block, src);16159 try sema.requireRuntimeBlock(block, src);
...@@ -16175,6 +16203,7 @@ fn fieldPtr(...@@ -16175,6 +16203,7 @@ fn fieldPtr(
16175 return sema.analyzeDeclRef(try anon_decl.finish(16203 return sema.analyzeDeclRef(try anon_decl.finish(
16176 try child_type.copy(anon_decl.arena()),16204 try child_type.copy(anon_decl.arena()),
16177 try Value.Tag.@"error".create(anon_decl.arena(), .{ .name = name }),16205 try Value.Tag.@"error".create(anon_decl.arena(), .{ .name = name }),
16206 0, // default alignment
16178 ));16207 ));
16179 },16208 },
16180 .Union => {16209 .Union => {
...@@ -16191,6 +16220,7 @@ fn fieldPtr(...@@ -16191,6 +16220,7 @@ fn fieldPtr(
16191 return sema.analyzeDeclRef(try anon_decl.finish(16220 return sema.analyzeDeclRef(try anon_decl.finish(
16192 try enum_ty.copy(anon_decl.arena()),16221 try enum_ty.copy(anon_decl.arena()),
16193 try Value.Tag.enum_field_index.create(anon_decl.arena(), field_index_u32),16222 try Value.Tag.enum_field_index.create(anon_decl.arena(), field_index_u32),
16223 0, // default alignment
16194 ));16224 ));
16195 }16225 }
16196 }16226 }
...@@ -16211,6 +16241,7 @@ fn fieldPtr(...@@ -16211,6 +16241,7 @@ fn fieldPtr(
16211 return sema.analyzeDeclRef(try anon_decl.finish(16241 return sema.analyzeDeclRef(try anon_decl.finish(
16212 try child_type.copy(anon_decl.arena()),16242 try child_type.copy(anon_decl.arena()),
16213 try Value.Tag.enum_field_index.create(anon_decl.arena(), field_index_u32),16243 try Value.Tag.enum_field_index.create(anon_decl.arena(), field_index_u32),
16244 0, // default alignment
16214 ));16245 ));
16215 },16246 },
16216 .Struct, .Opaque => {16247 .Struct, .Opaque => {
...@@ -16522,10 +16553,8 @@ fn structFieldPtrByIndex(...@@ -16522,10 +16553,8 @@ fn structFieldPtrByIndex(
16522 const decl = try anon_decl.finish(16553 const decl = try anon_decl.finish(
16523 try field.ty.copy(anon_decl.arena()),16554 try field.ty.copy(anon_decl.arena()),
16524 try field.default_val.copy(anon_decl.arena()),16555 try field.default_val.copy(anon_decl.arena()),
16556 ptr_ty_data.@"align",
16525 );16557 );
16526 if (ptr_ty_data.@"align" != 0) {
16527 decl.align_val = field.abi_align;
16528 }
16529 return sema.analyzeDeclRef(decl);16558 return sema.analyzeDeclRef(decl);
16530 }16559 }
1653116560
...@@ -19114,6 +19143,7 @@ fn refValue(sema: *Sema, block: *Block, src: LazySrcLoc, ty: Type, val: Value) !...@@ -19114,6 +19143,7 @@ fn refValue(sema: *Sema, block: *Block, src: LazySrcLoc, ty: Type, val: Value) !
19114 const decl = try anon_decl.finish(19143 const decl = try anon_decl.finish(
19115 try ty.copy(anon_decl.arena()),19144 try ty.copy(anon_decl.arena()),
19116 try val.copy(anon_decl.arena()),19145 try val.copy(anon_decl.arena()),
19146 0, // default alignment
19117 );19147 );
19118 try sema.mod.declareDeclDependency(sema.owner_decl, decl);19148 try sema.mod.declareDeclDependency(sema.owner_decl, decl);
19119 return try Value.Tag.decl_ref.create(sema.arena, decl);19149 return try Value.Tag.decl_ref.create(sema.arena, decl);
...@@ -19170,6 +19200,7 @@ fn analyzeRef(...@@ -19170,6 +19200,7 @@ fn analyzeRef(
19170 return sema.analyzeDeclRef(try anon_decl.finish(19200 return sema.analyzeDeclRef(try anon_decl.finish(
19171 try operand_ty.copy(anon_decl.arena()),19201 try operand_ty.copy(anon_decl.arena()),
19172 try val.copy(anon_decl.arena()),19202 try val.copy(anon_decl.arena()),
19203 0, // default alignment
19173 ));19204 ));
19174 }19205 }
1917519206
...@@ -21614,6 +21645,7 @@ fn analyzeComptimeAlloc(...@@ -21614,6 +21645,7 @@ fn analyzeComptimeAlloc(
21614 // sub-fields. So we need to initialize with undef to allow the mechanism to expand21645 // sub-fields. So we need to initialize with undef to allow the mechanism to expand
21615 // into fields/elements and have those overridden with stored values.21646 // into fields/elements and have those overridden with stored values.
21616 Value.undef,21647 Value.undef,
21648 alignment,
21617 );21649 );
21618 decl.align_val = align_val;21650 decl.align_val = align_val;
2161921651
test/behavior/align.zig+15
...@@ -416,3 +416,18 @@ test "align(N) on functions" {...@@ -416,3 +416,18 @@ test "align(N) on functions" {
416fn overaligned_fn() align(0x1000) i32 {416fn overaligned_fn() align(0x1000) i32 {
417 return 42;417 return 42;
418}418}
419
420test "comptime alloc alignment" {
421 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
422 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
423 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
424 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
425 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
426
427 comptime var bytes1 = [_]u8{0};
428 _ = bytes1;
429
430 comptime var bytes2 align(256) = [_]u8{0};
431 var bytes2_addr = @ptrToInt(&bytes2);
432 try std.testing.expect(bytes2_addr & 0xff == 0);
433}