@@ -2649,7 +2649,13 @@ pub fn analyzeAsAlign(
2649
2649
src: LazySrcLoc,
2650
2650
air_ref: Air.Inst.Ref,
2651
2651
) !Alignment {
2652
- const alignment_big = try sema.analyzeAsInt(block, src, air_ref, align_ty, .{ .simple = .@"align" });
2652
+ const alignment_big = try sema.analyzeAsInt(
2653
+ block,
2654
+ src,
2655
+ air_ref,
2656
+ align_ty,
2657
+ .{ .simple = .@"align" },
2658
+ );
2653
2659
return sema.validateAlign(block, src, alignment_big);
2654
2660
}
2655
2661
@@ -18807,7 +18813,7 @@ fn zirPtrType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air
18807
18813
const abi_align: Alignment = if (inst_data.flags.has_align) blk: {
18808
18814
const ref: Zir.Inst.Ref = @enumFromInt(sema.code.extra[extra_i]);
18809
18815
extra_i += 1;
18810
- const coerced = try sema.coerce(block, .u32 , try sema.resolveInst(ref), align_src);
18816
+ const coerced = try sema.coerce(block, align_ty , try sema.resolveInst(ref), align_src);
18811
18817
const val = try sema.resolveConstDefinedValue(block, align_src, coerced, .{ .simple = .@"align" });
18812
18818
// Check if this happens to be the lazy alignment of our element type, in
18813
18819
// which case we can make this 0 without resolving it.
@@ -20325,15 +20331,11 @@ fn zirReify(
20325
20331
try ip.getOrPutString(gpa, pt.tid, "sentinel_ptr", .no_embedded_nulls),
20326
20332
).?);
20327
20333
20328
- if (!try sema.intFitsInType(alignment_val, .u32 , null)) {
20329
- return sema.fail(block, src, "alignment must fit in 'u32 '", .{});
20334
+ if (!try sema.intFitsInType(alignment_val, align_ty , null)) {
20335
+ return sema.fail(block, src, "alignment must fit in '{} '", .{align_ty.fmt(pt) });
20330
20336
}
20331
-
20332
20337
const alignment_val_int = try alignment_val.toUnsignedIntSema(pt);
20333
- if (alignment_val_int > 0 and !math.isPowerOfTwo(alignment_val_int)) {
20334
- return sema.fail(block, src, "alignment value '{d}' is not a power of two or zero", .{alignment_val_int});
20335
- }
20336
- const abi_align = Alignment.fromByteUnits(alignment_val_int);
20338
+ const abi_align = try sema.validateAlign(block, src, alignment_val_int);
20337
20339
20338
20340
const elem_ty = child_val.toType();
20339
20341
if (abi_align != .none) {
@@ -21017,11 +21019,7 @@ fn reifyUnion(
21017
21019
field_ty.* = field_type_val.toIntern();
21018
21020
if (any_aligns) {
21019
21021
const byte_align = try (try field_info.fieldValue(pt, 2)).toUnsignedIntSema(pt);
21020
- if (byte_align > 0 and !math.isPowerOfTwo(byte_align)) {
21021
- // TODO: better source location
21022
- return sema.fail(block, src, "alignment value '{d}' is not a power of two or zero", .{byte_align});
21023
- }
21024
- field_aligns[field_idx] = Alignment.fromByteUnits(byte_align);
21022
+ field_aligns[field_idx] = try sema.validateAlign(block, src, byte_align);
21025
21023
}
21026
21024
}
21027
21025
@@ -21062,11 +21060,7 @@ fn reifyUnion(
21062
21060
field_ty.* = field_type_val.toIntern();
21063
21061
if (any_aligns) {
21064
21062
const byte_align = try (try field_info.fieldValue(pt, 2)).toUnsignedIntSema(pt);
21065
- if (byte_align > 0 and !math.isPowerOfTwo(byte_align)) {
21066
- // TODO: better source location
21067
- return sema.fail(block, src, "alignment value '{d}' is not a power of two or zero", .{byte_align});
21068
- }
21069
- field_aligns[field_idx] = Alignment.fromByteUnits(byte_align);
21063
+ field_aligns[field_idx] = try sema.validateAlign(block, src, byte_align);
21070
21064
}
21071
21065
}
21072
21066
@@ -21266,7 +21260,6 @@ fn reifyStruct(
21266
21260
21267
21261
var any_comptime_fields = false;
21268
21262
var any_default_inits = false;
21269
- var any_aligned_fields = false;
21270
21263
21271
21264
for (0..fields_len) |field_idx| {
21272
21265
const field_info = try fields_val.elemValue(pt, field_idx);
@@ -21301,11 +21294,6 @@ fn reifyStruct(
21301
21294
21302
21295
if (field_is_comptime) any_comptime_fields = true;
21303
21296
if (field_default_value != .none) any_default_inits = true;
21304
- switch (try field_alignment_val.orderAgainstZeroSema(pt)) {
21305
- .eq => {},
21306
- .gt => any_aligned_fields = true,
21307
- .lt => unreachable,
21308
- }
21309
21297
}
21310
21298
21311
21299
const tracked_inst = try block.trackZir(inst);
@@ -21317,7 +21305,7 @@ fn reifyStruct(
21317
21305
.requires_comptime = .unknown,
21318
21306
.any_comptime_fields = any_comptime_fields,
21319
21307
.any_default_inits = any_default_inits,
21320
- .any_aligned_fields = any_aligned_fields ,
21308
+ .any_aligned_fields = true ,
21321
21309
.inits_resolved = true,
21322
21310
.key = .{ .reified = .{
21323
21311
.zir_index = tracked_inst,
@@ -21361,21 +21349,14 @@ fn reifyStruct(
21361
21349
return sema.fail(block, src, "duplicate struct field name {f}", .{field_name.fmt(ip)});
21362
21350
}
21363
21351
21364
- if (any_aligned_fields) {
21365
- if (!try sema.intFitsInType(field_alignment_val, .u32, null)) {
21366
- return sema.fail(block, src, "alignment must fit in 'u32'", .{});
21367
- }
21368
-
21369
- const byte_align = try field_alignment_val.toUnsignedIntSema(pt);
21370
- if (byte_align == 0) {
21371
- if (layout != .@"packed") {
21372
- struct_type.field_aligns.get(ip)[field_idx] = .none;
21373
- }
21374
- } else {
21375
- if (layout == .@"packed") return sema.fail(block, src, "alignment in a packed struct field must be set to 0", .{});
21376
- if (!math.isPowerOfTwo(byte_align)) return sema.fail(block, src, "alignment value '{d}' is not a power of two or zero", .{byte_align});
21377
- struct_type.field_aligns.get(ip)[field_idx] = Alignment.fromNonzeroByteUnits(byte_align);
21378
- }
21352
+ if (!try sema.intFitsInType(field_alignment_val, align_ty, null)) {
21353
+ return sema.fail(block, src, "alignment must fit in '{f}'", .{align_ty.fmt(pt)});
21354
+ }
21355
+ const byte_align = try field_alignment_val.toUnsignedIntSema(pt);
21356
+ if (layout == .@"packed") {
21357
+ if (byte_align != 0) return sema.fail(block, src, "alignment in a packed struct field must be set to 0", .{});
21358
+ } else {
21359
+ struct_type.field_aligns.get(ip)[field_idx] = try sema.validateAlign(block, src, byte_align);
21379
21360
}
21380
21361
21381
21362
const field_is_comptime = field_is_comptime_val.toBool();
0 commit comments