| author | |
| committer | |
| log | d6c74a95fdaba4ed373f80baa725dcc53b27e402 |
| tree | e6827e6fa40ed25f5c6cee6eab0edace8a62c190 |
| parent | 17330867eb8f9e24ec8aadf23592e36f90f9dcb3 |
| signature |
9 files changed, 45 insertions(+), 51 deletions(-)
lib/compiler/aro/aro/Attribute.zig+1-1| ... | @@ -708,7 +708,7 @@ pub const Arguments = blk: { | ... | @@ -708,7 +708,7 @@ pub const Arguments = blk: { |
| 708 | field.* = .{ | 708 | field.* = .{ |
| 709 | .name = decl.name, | 709 | .name = decl.name, |
| 710 | .type = @field(attributes, decl.name), | 710 | .type = @field(attributes, decl.name), |
| 711 | .alignment = 0, | 711 | .alignment = @alignOf(@field(attributes, decl.name)), |
| 712 | }; | 712 | }; |
| 713 | } | 713 | } |
| 714 | 714 |
lib/std/meta.zig+1-1| ... | @@ -939,7 +939,7 @@ fn CreateUniqueTuple(comptime N: comptime_int, comptime types: [N]type) type { | ... | @@ -939,7 +939,7 @@ fn CreateUniqueTuple(comptime N: comptime_int, comptime types: [N]type) type { |
| 939 | .type = T, | 939 | .type = T, |
| 940 | .default_value_ptr = null, | 940 | .default_value_ptr = null, |
| 941 | .is_comptime = false, | 941 | .is_comptime = false, |
| 942 | .alignment = 0, | 942 | .alignment = @alignOf(T), |
| 943 | }; | 943 | }; |
| 944 | } | 944 | } |
| 945 | 945 |
lib/std/zig/llvm/Builder.zig+4-3| ... | @@ -8533,18 +8533,19 @@ pub const Metadata = enum(u32) { | ... | @@ -8533,18 +8533,19 @@ pub const Metadata = enum(u32) { |
| 8533 | .type = []const u8, | 8533 | .type = []const u8, |
| 8534 | .default_value_ptr = null, | 8534 | .default_value_ptr = null, |
| 8535 | .is_comptime = false, | 8535 | .is_comptime = false, |
| 8536 | .alignment = 0, | 8536 | .alignment = @alignOf([]const u8), |
| 8537 | }; | 8537 | }; |
| 8538 | } | 8538 | } |
| 8539 | fmt_str = fmt_str ++ "("; | 8539 | fmt_str = fmt_str ++ "("; |
| 8540 | inline for (fields[2..], names) |*field, name| { | 8540 | inline for (fields[2..], names) |*field, name| { |
| 8541 | fmt_str = fmt_str ++ "{[" ++ name ++ "]f}"; | 8541 | fmt_str = fmt_str ++ "{[" ++ name ++ "]f}"; |
| 8542 | const T = std.fmt.Formatter(FormatData, format); | ||
| 8542 | field.* = .{ | 8543 | field.* = .{ |
| 8543 | .name = name, | 8544 | .name = name, |
| 8544 | .type = std.fmt.Formatter(FormatData, format), | 8545 | .type = T, |
| 8545 | .default_value_ptr = null, | 8546 | .default_value_ptr = null, |
| 8546 | .is_comptime = false, | 8547 | .is_comptime = false, |
| 8547 | .alignment = 0, | 8548 | .alignment = @alignOf(T), |
| 8548 | }; | 8549 | }; |
| 8549 | } | 8550 | } |
| 8550 | fmt_str = fmt_str ++ ")\n"; | 8551 | fmt_str = fmt_str ++ ")\n"; |
src/InternPool.zig+22-16| ... | @@ -1137,13 +1137,16 @@ const Local = struct { | ... | @@ -1137,13 +1137,16 @@ const Local = struct { |
| 1137 | const elem_info = @typeInfo(Elem).@"struct"; | 1137 | const elem_info = @typeInfo(Elem).@"struct"; |
| 1138 | const elem_fields = elem_info.fields; | 1138 | const elem_fields = elem_info.fields; |
| 1139 | var new_fields: [elem_fields.len]std.builtin.Type.StructField = undefined; | 1139 | var new_fields: [elem_fields.len]std.builtin.Type.StructField = undefined; |
| 1140 | for (&new_fields, elem_fields) |*new_field, elem_field| new_field.* = .{ | 1140 | for (&new_fields, elem_fields) |*new_field, elem_field| { |
| 1141 | .name = elem_field.name, | 1141 | const T = *[len]elem_field.type; |
| 1142 | .type = *[len]elem_field.type, | 1142 | new_field.* = .{ |
| 1143 | .default_value_ptr = null, | 1143 | .name = elem_field.name, |
| 1144 | .is_comptime = false, | 1144 | .type = T, |
| 1145 | .alignment = 0, | 1145 | .default_value_ptr = null, |
| 1146 | }; | 1146 | .is_comptime = false, |
| 1147 | .alignment = @alignOf(T), | ||
| 1148 | }; | ||
| 1149 | } | ||
| 1147 | return @Type(.{ .@"struct" = .{ | 1150 | return @Type(.{ .@"struct" = .{ |
| 1148 | .layout = .auto, | 1151 | .layout = .auto, |
| 1149 | .fields = &new_fields, | 1152 | .fields = &new_fields, |
| ... | @@ -1158,22 +1161,25 @@ const Local = struct { | ... | @@ -1158,22 +1161,25 @@ const Local = struct { |
| 1158 | const elem_info = @typeInfo(Elem).@"struct"; | 1161 | const elem_info = @typeInfo(Elem).@"struct"; |
| 1159 | const elem_fields = elem_info.fields; | 1162 | const elem_fields = elem_info.fields; |
| 1160 | var new_fields: [elem_fields.len]std.builtin.Type.StructField = undefined; | 1163 | var new_fields: [elem_fields.len]std.builtin.Type.StructField = undefined; |
| 1161 | for (&new_fields, elem_fields) |*new_field, elem_field| new_field.* = .{ | 1164 | for (&new_fields, elem_fields) |*new_field, elem_field| { |
| 1162 | .name = elem_field.name, | 1165 | const T = @Type(.{ .pointer = .{ |
| 1163 | .type = @Type(.{ .pointer = .{ | ||
| 1164 | .size = opts.size, | 1166 | .size = opts.size, |
| 1165 | .is_const = opts.is_const, | 1167 | .is_const = opts.is_const, |
| 1166 | .is_volatile = false, | 1168 | .is_volatile = false, |
| 1167 | .alignment = 0, | 1169 | .alignment = @alignOf(elem_field.type), |
| 1168 | .address_space = .generic, | 1170 | .address_space = .generic, |
| 1169 | .child = elem_field.type, | 1171 | .child = elem_field.type, |
| 1170 | .is_allowzero = false, | 1172 | .is_allowzero = false, |
| 1171 | .sentinel_ptr = null, | 1173 | .sentinel_ptr = null, |
| 1172 | } }), | 1174 | } }); |
| 1173 | .default_value_ptr = null, | 1175 | new_field.* = .{ |
| 1174 | .is_comptime = false, | 1176 | .name = elem_field.name, |
| 1175 | .alignment = 0, | 1177 | .type = T, |
| 1176 | }; | 1178 | .default_value_ptr = null, |
| 1179 | .is_comptime = false, | ||
| 1180 | .alignment = @alignOf(T), | ||
| 1181 | }; | ||
| 1182 | } | ||
| 1177 | return @Type(.{ .@"struct" = .{ | 1183 | return @Type(.{ .@"struct" = .{ |
| 1178 | .layout = .auto, | 1184 | .layout = .auto, |
| 1179 | .fields = &new_fields, | 1185 | .fields = &new_fields, |
src/Sema.zig+1-1| ... | @@ -20332,7 +20332,7 @@ fn zirReify( | ... | @@ -20332,7 +20332,7 @@ fn zirReify( |
| 20332 | ).?); | 20332 | ).?); |
| 20333 | 20333 | ||
| 20334 | if (!try sema.intFitsInType(alignment_val, align_ty, null)) { | 20334 | if (!try sema.intFitsInType(alignment_val, align_ty, null)) { |
| 20335 | return sema.fail(block, src, "alignment must fit in '{}'", .{align_ty.fmt(pt)}); | 20335 | return sema.fail(block, src, "alignment must fit in '{f}'", .{align_ty.fmt(pt)}); |
| 20336 | } | 20336 | } |
| 20337 | const alignment_val_int = try alignment_val.toUnsignedIntSema(pt); | 20337 | const alignment_val_int = try alignment_val.toUnsignedIntSema(pt); |
| 20338 | const abi_align = try sema.validateAlign(block, src, alignment_val_int); | 20338 | const abi_align = try sema.validateAlign(block, src, alignment_val_int); |
src/codegen/aarch64/Assemble.zig+10-7| ... | @@ -33,13 +33,16 @@ pub fn nextInstruction(as: *Assemble) !?Instruction { | ... | @@ -33,13 +33,16 @@ pub fn nextInstruction(as: *Assemble) !?Instruction { |
| 33 | var symbols: Symbols: { | 33 | var symbols: Symbols: { |
| 34 | const symbols = @typeInfo(@TypeOf(instruction.symbols)).@"struct".fields; | 34 | const symbols = @typeInfo(@TypeOf(instruction.symbols)).@"struct".fields; |
| 35 | var symbol_fields: [symbols.len]std.builtin.Type.StructField = undefined; | 35 | var symbol_fields: [symbols.len]std.builtin.Type.StructField = undefined; |
| 36 | for (&symbol_fields, symbols) |*symbol_field, symbol| symbol_field.* = .{ | 36 | for (&symbol_fields, symbols) |*symbol_field, symbol| { |
| 37 | .name = symbol.name, | 37 | const Storage = zonCast(SymbolSpec, @field(instruction.symbols, symbol.name), .{}).Storage(); |
| 38 | .type = zonCast(SymbolSpec, @field(instruction.symbols, symbol.name), .{}).Storage(), | 38 | symbol_field.* = .{ |
| 39 | .default_value_ptr = null, | 39 | .name = symbol.name, |
| 40 | .is_comptime = false, | 40 | .type = Storage, |
| 41 | .alignment = 0, | 41 | .default_value_ptr = null, |
| 42 | }; | 42 | .is_comptime = false, |
| 43 | .alignment = @alignOf(Storage), | ||
| 44 | }; | ||
| 45 | } | ||
| 43 | break :Symbols @Type(.{ .@"struct" = .{ | 46 | break :Symbols @Type(.{ .@"struct" = .{ |
| 44 | .layout = .auto, | 47 | .layout = .auto, |
| 45 | .fields = &symbol_fields, | 48 | .fields = &symbol_fields, |
test/behavior/tuple.zig+4-2| ... | @@ -318,6 +318,8 @@ test "tuple type with void field" { | ... | @@ -318,6 +318,8 @@ test "tuple type with void field" { |
| 318 | test "zero sized struct in tuple handled correctly" { | 318 | test "zero sized struct in tuple handled correctly" { |
| 319 | const State = struct { | 319 | const State = struct { |
| 320 | const Self = @This(); | 320 | const Self = @This(); |
| 321 | const Inner = struct {}; | ||
| 322 | |||
| 321 | data: @Type(.{ | 323 | data: @Type(.{ |
| 322 | .@"struct" = .{ | 324 | .@"struct" = .{ |
| 323 | .is_tuple = true, | 325 | .is_tuple = true, |
| ... | @@ -325,10 +327,10 @@ test "zero sized struct in tuple handled correctly" { | ... | @@ -325,10 +327,10 @@ test "zero sized struct in tuple handled correctly" { |
| 325 | .decls = &.{}, | 327 | .decls = &.{}, |
| 326 | .fields = &.{.{ | 328 | .fields = &.{.{ |
| 327 | .name = "0", | 329 | .name = "0", |
| 328 | .type = struct {}, | 330 | .type = Inner, |
| 329 | .default_value_ptr = null, | 331 | .default_value_ptr = null, |
| 330 | .is_comptime = false, | 332 | .is_comptime = false, |
| 331 | .alignment = 0, | 333 | .alignment = @alignOf(Inner), |
| 332 | }}, | 334 | }}, |
| 333 | }, | 335 | }, |
| 334 | }), | 336 | }), |
test/behavior/type.zig+1-1| ... | @@ -735,7 +735,7 @@ test "struct field names sliced at comptime from larger string" { | ... | @@ -735,7 +735,7 @@ test "struct field names sliced at comptime from larger string" { |
| 735 | var it = std.mem.tokenizeScalar(u8, text, '\n'); | 735 | var it = std.mem.tokenizeScalar(u8, text, '\n'); |
| 736 | while (it.next()) |name| { | 736 | while (it.next()) |name| { |
| 737 | fields = fields ++ &[_]Type.StructField{.{ | 737 | fields = fields ++ &[_]Type.StructField{.{ |
| 738 | .alignment = 0, | 738 | .alignment = @alignOf(usize), |
| 739 | .name = name ++ "", | 739 | .name = name ++ "", |
| 740 | .type = usize, | 740 | .type = usize, |
| 741 | .default_value_ptr = null, | 741 | .default_value_ptr = null, |
test/cases/compile_errors/align_zero.zig+1-19| ... | @@ -65,24 +65,7 @@ export fn k() void { | ... | @@ -65,24 +65,7 @@ export fn k() void { |
| 65 | } }); | 65 | } }); |
| 66 | } | 66 | } |
| 67 | 67 | ||
| 68 | export fn l() void { | ||
| 69 | _ = @Type(.{ .@"struct" = .{ | ||
| 70 | .layout = .@"packed", | ||
| 71 | .fields = &.{.{ | ||
| 72 | .name = "test", | ||
| 73 | .type = u32, | ||
| 74 | .default_value_ptr = null, | ||
| 75 | .is_comptime = false, | ||
| 76 | .alignment = 8, | ||
| 77 | }}, | ||
| 78 | .decls = &.{}, | ||
| 79 | .is_tuple = false, | ||
| 80 | } }); | ||
| 81 | } | ||
| 82 | |||
| 83 | // error | 68 | // error |
| 84 | // backend=stage2 | ||
| 85 | // target=native | ||
| 86 | // | 69 | // |
| 87 | // :1:27: error: alignment must be >= 1 | 70 | // :1:27: error: alignment must be >= 1 |
| 88 | // :7:34: error: alignment must be >= 1 | 71 | // :7:34: error: alignment must be >= 1 |
| ... | @@ -93,6 +76,5 @@ export fn l() void { | ... | @@ -93,6 +76,5 @@ export fn l() void { |
| 93 | // :29:17: error: alignment must be >= 1 | 76 | // :29:17: error: alignment must be >= 1 |
| 94 | // :33:35: error: alignment must be >= 1 | 77 | // :33:35: error: alignment must be >= 1 |
| 95 | // :37:34: error: alignment must be >= 1 | 78 | // :37:34: error: alignment must be >= 1 |
| 96 | // :41:9: error: alignment can only be 0 on packed struct fields | 79 | // :41:9: error: alignment must be >= 1 |
| 97 | // :56:9: error: alignment must be >= 1 | 80 | // :56:9: error: alignment must be >= 1 |
| 98 | // :69:9: error: alignment in a packed struct field must be set to 0 |