| ... | @@ -10397,7 +10397,13 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai | ... | @@ -10397,7 +10397,13 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 10397 | vals, | 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 | } else Value.@"null"; | 10407 | } else Value.@"null"; |
| 10402 | | 10408 | |
| 10403 | // Construct TypeInfo{ .ErrorSet = errors_val } | 10409 | // Construct TypeInfo{ .ErrorSet = errors_val } |
| ... | @@ -12317,7 +12323,31 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I | ... | @@ -12317,7 +12323,31 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I |
| 12317 | }); | 12323 | }); |
| 12318 | return sema.addType(ty); | 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 | .Enum => return sema.fail(block, src, "TODO: Sema.zirReify for Enum", .{}), | 12351 | .Enum => return sema.fail(block, src, "TODO: Sema.zirReify for Enum", .{}), |
| 12322 | .Union => return sema.fail(block, src, "TODO: Sema.zirReify for Union", .{}), | 12352 | .Union => return sema.fail(block, src, "TODO: Sema.zirReify for Union", .{}), |
| 12323 | .Fn => return sema.fail(block, src, "TODO: Sema.zirReify for Fn", .{}), | 12353 | .Fn => return sema.fail(block, src, "TODO: Sema.zirReify for Fn", .{}), |