| ... | @@ -12585,10 +12585,56 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I | ... | @@ -12585,10 +12585,56 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I |
| 12585 | try new_decl.finalizeNewArena(&new_decl_arena); | 12585 | try new_decl.finalizeNewArena(&new_decl_arena); |
| 12586 | return sema.analyzeDeclVal(block, src, new_decl); | 12586 | return sema.analyzeDeclVal(block, src, new_decl); |
| 12587 | }, | 12587 | }, |
| | 12588 | .Opaque => { |
| | 12589 | const struct_val = union_val.val.castTag(.@"struct").?.data; |
| | 12590 | // decls: []const Declaration, |
| | 12591 | const decls_val = struct_val[0]; |
| | 12592 | |
| | 12593 | // Decls |
| | 12594 | const decls_slice_val = decls_val.castTag(.slice).?.data; |
| | 12595 | const decls_decl = decls_slice_val.ptr.pointerDecl().?; |
| | 12596 | try sema.ensureDeclAnalyzed(decls_decl); |
| | 12597 | if (decls_decl.ty.arrayLen() > 0) { |
| | 12598 | return sema.fail(block, src, "reified opaque must have no decls", .{}); |
| | 12599 | } |
| | 12600 | |
| | 12601 | const mod = sema.mod; |
| | 12602 | var new_decl_arena = std.heap.ArenaAllocator.init(sema.gpa); |
| | 12603 | errdefer new_decl_arena.deinit(); |
| | 12604 | const new_decl_arena_allocator = new_decl_arena.allocator(); |
| | 12605 | |
| | 12606 | const opaque_obj = try new_decl_arena_allocator.create(Module.Opaque); |
| | 12607 | const opaque_ty_payload = try new_decl_arena_allocator.create(Type.Payload.Opaque); |
| | 12608 | opaque_ty_payload.* = .{ |
| | 12609 | .base = .{ .tag = .@"opaque" }, |
| | 12610 | .data = opaque_obj, |
| | 12611 | }; |
| | 12612 | const opaque_ty = Type.initPayload(&opaque_ty_payload.base); |
| | 12613 | const opaque_val = try Value.Tag.ty.create(new_decl_arena_allocator, opaque_ty); |
| | 12614 | const type_name = try sema.createTypeName(block, .anon); |
| | 12615 | const new_decl = try mod.createAnonymousDeclNamed(block, .{ |
| | 12616 | .ty = Type.type, |
| | 12617 | .val = opaque_val, |
| | 12618 | }, type_name); |
| | 12619 | new_decl.owns_tv = true; |
| | 12620 | errdefer mod.abortAnonDecl(new_decl); |
| | 12621 | |
| | 12622 | opaque_obj.* = .{ |
| | 12623 | .owner_decl = new_decl, |
| | 12624 | .node_offset = src.node_offset, |
| | 12625 | .namespace = .{ |
| | 12626 | .parent = block.namespace, |
| | 12627 | .ty = opaque_ty, |
| | 12628 | .file_scope = block.getFileScope(), |
| | 12629 | }, |
| | 12630 | }; |
| | 12631 | |
| | 12632 | try new_decl.finalizeNewArena(&new_decl_arena); |
| | 12633 | return sema.analyzeDeclVal(block, src, new_decl); |
| | 12634 | }, |
| 12588 | .Union => return sema.fail(block, src, "TODO: Sema.zirReify for Union", .{}), | 12635 | .Union => return sema.fail(block, src, "TODO: Sema.zirReify for Union", .{}), |
| 12589 | .Fn => return sema.fail(block, src, "TODO: Sema.zirReify for Fn", .{}), | 12636 | .Fn => return sema.fail(block, src, "TODO: Sema.zirReify for Fn", .{}), |
| 12590 | .BoundFn => @panic("TODO delete BoundFn from the language"), | 12637 | .BoundFn => @panic("TODO delete BoundFn from the language"), |
| 12591 | .Opaque => return sema.fail(block, src, "TODO: Sema.zirReify for Opaque", .{}), | | |
| 12592 | .Frame => return sema.fail(block, src, "TODO: Sema.zirReify for Frame", .{}), | 12638 | .Frame => return sema.fail(block, src, "TODO: Sema.zirReify for Frame", .{}), |
| 12593 | } | 12639 | } |
| 12594 | } | 12640 | } |