| ... | ... | @@ -10397,7 +10397,13 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 10397 | 10397 | vals, |
| 10398 | 10398 | ), |
| 10399 | 10399 | ); |
| 10400 | | break :v try Value.Tag.decl_ref.create(sema.arena, new_decl); |
| 10400 | |
| 10401 | const new_decl_val = try Value.Tag.decl_ref.create(sema.arena, new_decl); |
| 10402 | const slice_val = try Value.Tag.slice.create(sema.arena, .{ |
| 10403 | .ptr = new_decl_val, |
| 10404 | .len = try Value.Tag.int_u64.create(sema.arena, vals.len), |
| 10405 | }); |
| 10406 | break :v try Value.Tag.opt_payload.create(sema.arena, slice_val); |
| 10401 | 10407 | } else Value.@"null"; |
| 10402 | 10408 | |
| 10403 | 10409 | // Construct TypeInfo{ .ErrorSet = errors_val } |
| ... | ... | @@ -12317,7 +12323,31 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I |
| 12317 | 12323 | }); |
| 12318 | 12324 | return sema.addType(ty); |
| 12319 | 12325 | }, |
| 12320 | | .ErrorSet => return sema.fail(block, src, "TODO: Sema.zirReify for ErrorSet", .{}), |
| 12326 | .ErrorSet => { |
| 12327 | const payload_val = union_val.val.optionalValue() orelse |
| 12328 | return sema.addType(Type.initTag(.anyerror)); |
| 12329 | const slice_val = payload_val.castTag(.slice).?.data; |
| 12330 | const decl = slice_val.ptr.castTag(.decl_ref).?.data; |
| 12331 | try sema.ensureDeclAnalyzed(decl); |
| 12332 | const array_val = decl.val.castTag(.array).?.data; |
| 12333 | |
| 12334 | var names: Module.ErrorSet.NameMap = .{}; |
| 12335 | try names.ensureUnusedCapacity(sema.arena, array_val.len); |
| 12336 | for (array_val) |elem_val| { |
| 12337 | const struct_val = elem_val.castTag(.@"struct").?.data; |
| 12338 | // TODO use reflection instead of magic numbers here |
| 12339 | // error_set: type, |
| 12340 | const name_val = struct_val[0]; |
| 12341 | |
| 12342 | names.putAssumeCapacityNoClobber( |
| 12343 | try name_val.toAllocatedBytes(Type.initTag(.const_slice_u8), sema.arena), |
| 12344 | {}, |
| 12345 | ); |
| 12346 | } |
| 12347 | |
| 12348 | const ty = try Type.Tag.error_set_merged.create(sema.arena, names); |
| 12349 | return sema.addType(ty); |
| 12350 | }, |
| 12321 | 12351 | .Enum => return sema.fail(block, src, "TODO: Sema.zirReify for Enum", .{}), |
| 12322 | 12352 | .Union => return sema.fail(block, src, "TODO: Sema.zirReify for Union", .{}), |
| 12323 | 12353 | .Fn => return sema.fail(block, src, "TODO: Sema.zirReify for Fn", .{}), |