@@ -2536,6 +2536,9 @@ fn coerceResultPtr(
2536
2536
.wrap_errunion_payload => {
2537
2537
new_ptr = try sema.analyzeErrUnionPayloadPtr(block, src, new_ptr, false, true);
2538
2538
},
2539
+ .array_to_slice => {
2540
+ return sema.fail(block, src, "TODO coerce_result_ptr array_to_slice", .{});
2541
+ },
2539
2542
else => {
2540
2543
if (std.debug.runtime_safety) {
2541
2544
std.debug.panic("unexpected AIR tag for coerce_result_ptr: {}", .{
@@ -7839,7 +7842,23 @@ fn zirIntToEnum(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A
7839
7842
7840
7843
if (try sema.resolveMaybeUndefVal(operand)) |int_val| {
7841
7844
if (dest_ty.isNonexhaustiveEnum()) {
7842
- return sema.addConstant(dest_ty, int_val);
7845
+ var buffer: Type.Payload.Bits = undefined;
7846
+ const int_tag_ty = dest_ty.intTagType(&buffer);
7847
+ if (try sema.intFitsInType(int_val, int_tag_ty, null)) {
7848
+ return sema.addConstant(dest_ty, int_val);
7849
+ }
7850
+ const msg = msg: {
7851
+ const msg = try sema.errMsg(
7852
+ block,
7853
+ src,
7854
+ "int value '{}' out of range of non-exhaustive enum '{}'",
7855
+ .{ int_val.fmtValue(sema.typeOf(operand), sema.mod), dest_ty.fmt(sema.mod) },
7856
+ );
7857
+ errdefer msg.destroy(sema.gpa);
7858
+ try sema.addDeclaredHereNote(msg, dest_ty);
7859
+ break :msg msg;
7860
+ };
7861
+ return sema.failWithOwnedErrorMsg(msg);
7843
7862
}
7844
7863
if (int_val.isUndef()) {
7845
7864
return sema.failWithUseOfUndef(block, operand_src);
@@ -30318,6 +30337,18 @@ fn resolveTypeFieldsStruct(
30318
30337
ty: Type,
30319
30338
struct_obj: *Module.Struct,
30320
30339
) CompileError!void {
30340
+ switch (sema.mod.declPtr(struct_obj.owner_decl).analysis) {
30341
+ .file_failure,
30342
+ .dependency_failure,
30343
+ .sema_failure,
30344
+ .sema_failure_retryable,
30345
+ => {
30346
+ sema.owner_decl.analysis = .dependency_failure;
30347
+ sema.owner_decl.generation = sema.mod.generation;
30348
+ return error.AnalysisFail;
30349
+ },
30350
+ else => {},
30351
+ }
30321
30352
switch (struct_obj.status) {
30322
30353
.none => {},
30323
30354
.field_types_wip => {
@@ -30338,10 +30369,23 @@ fn resolveTypeFieldsStruct(
30338
30369
}
30339
30370
30340
30371
struct_obj.status = .field_types_wip;
30372
+ errdefer struct_obj.status = .none;
30341
30373
try semaStructFields(sema.mod, struct_obj);
30342
30374
}
30343
30375
30344
30376
fn resolveTypeFieldsUnion(sema: *Sema, ty: Type, union_obj: *Module.Union) CompileError!void {
30377
+ switch (sema.mod.declPtr(union_obj.owner_decl).analysis) {
30378
+ .file_failure,
30379
+ .dependency_failure,
30380
+ .sema_failure,
30381
+ .sema_failure_retryable,
30382
+ => {
30383
+ sema.owner_decl.analysis = .dependency_failure;
30384
+ sema.owner_decl.generation = sema.mod.generation;
30385
+ return error.AnalysisFail;
30386
+ },
30387
+ else => {},
30388
+ }
30345
30389
switch (union_obj.status) {
30346
30390
.none => {},
30347
30391
.field_types_wip => {
@@ -30362,6 +30406,7 @@ fn resolveTypeFieldsUnion(sema: *Sema, ty: Type, union_obj: *Module.Union) Compi
30362
30406
}
30363
30407
30364
30408
union_obj.status = .field_types_wip;
30409
+ errdefer union_obj.status = .none;
30365
30410
try semaUnionFields(sema.mod, union_obj);
30366
30411
union_obj.status = .have_field_types;
30367
30412
}
@@ -30426,9 +30471,7 @@ fn resolveInferredErrorSetTy(
30426
30471
fn semaStructFields(mod: *Module, struct_obj: *Module.Struct) CompileError!void {
30427
30472
const gpa = mod.gpa;
30428
30473
const decl_index = struct_obj.owner_decl;
30429
- const file_scope = struct_obj.namespace.file_scope;
30430
- if (file_scope.status != .success_zir) return error.AnalysisFail;
30431
- const zir = file_scope.zir;
30474
+ const zir = struct_obj.namespace.file_scope.zir;
30432
30475
const extended = zir.instructions.items(.data)[struct_obj.zir_index].extended;
30433
30476
assert(extended.opcode == .struct_decl);
30434
30477
const small = @bitCast(Zir.Inst.StructDecl.Small, extended.small);
@@ -32886,7 +32929,7 @@ fn enumHasInt(
32886
32929
int: Value,
32887
32930
) CompileError!bool {
32888
32931
switch (ty.tag()) {
32889
- .enum_nonexhaustive => return sema.intFitsInType(int, ty, null) ,
32932
+ .enum_nonexhaustive => unreachable ,
32890
32933
.enum_full => {
32891
32934
const enum_full = ty.castTag(.enum_full).?.data;
32892
32935
const tag_ty = enum_full.tag_ty;
0 commit comments