authorgravatar for mitchell.hashimoto@gmail.comMitchell Hashimoto <mitchell.hashimoto@gmail.com> 2022-03-12 11:02:24-08:00
committergravatar for mitchell.hashimoto@gmail.comMitchell Hashimoto <mitchell.hashimoto@gmail.com> 2022-03-12 11:02:24-08:00
logef68420b785752d153e8bffd5e307a298b737c4d
tree7b5d6319ab8c247a2beef65d0634c850fe9f99aa
parent237d08389a8f565aad806735e958d9191518770d
signaturelock-open Commit is signed but in an unrecognized format.

stage2: reify opaque {}


2 files changed, 52 insertions(+), 2 deletions(-)

src/Sema.zig+47-1
...@@ -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}
test/behavior/type.zig+5-1
...@@ -199,7 +199,11 @@ test "Type.ErrorUnion" {...@@ -199,7 +199,11 @@ test "Type.ErrorUnion" {
199}199}
200200
201test "Type.Opaque" {201test "Type.Opaque" {
202 if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO202 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
203 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
204 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
205 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
206 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
203207
204 const Opaque = @Type(.{208 const Opaque = @Type(.{
205 .Opaque = .{209 .Opaque = .{