diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2021-10-13 17:53:28 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2021-10-13 17:53:28 -0700 |
| commit | df7d6d263e4ad6adb302856235641ae9ceb142b6 (patch) | |
| tree | 186182733c89cec8fa990a681ab8e6f915d15908 /src/type.zig | |
| parent | da7fcfd1586fa93c3d00815f60030e00ea583701 (diff) | |
| download | zig-df7d6d263e4ad6adb302856235641ae9ceb142b6.tar.gz zig-df7d6d263e4ad6adb302856235641ae9ceb142b6.zip | |
stage2: implement opaque declarations
* Module: implement opaque type namespace lookup
* Add `Type.type` for convenience
* Sema: fix `validateVarType` for pointer-to-opaque
* x86_64 ABI: implement support for pointers
* LLVM backend: fix lowering of opaque types
* Type: implement equality checking for opaques
Diffstat (limited to 'src/type.zig')
| -rw-r--r-- | src/type.zig | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/src/type.zig b/src/type.zig index daffd4abee..72430c9f65 100644 --- a/src/type.zig +++ b/src/type.zig @@ -571,6 +571,11 @@ pub const Type = extern union { } return a.tag() == b.tag(); }, + .Opaque => { + const opaque_obj_a = a.castTag(.@"opaque").?.data; + const opaque_obj_b = b.castTag(.@"opaque").?.data; + return opaque_obj_a == opaque_obj_b; + }, .Union => { if (a.cast(Payload.Union)) |a_payload| { if (b.cast(Payload.Union)) |b_payload| { @@ -611,7 +616,6 @@ pub const Type = extern union { return false; }, .Float => return a.tag() == b.tag(), - .Opaque, .BoundFn, .Frame, => std.debug.panic("TODO implement Type equality comparison of {} and {}", .{ a, b }), @@ -1408,6 +1412,7 @@ pub const Type = extern union { .extern_options, .@"anyframe", .anyframe_T, + .@"opaque", => true, .function => !self.castTag(.function).?.data.is_generic, @@ -1499,7 +1504,6 @@ pub const Type = extern union { .enum_literal, .empty_struct, .empty_struct_literal, - .@"opaque", .type_info, .bound_fn, => false, @@ -3097,7 +3101,7 @@ pub const Type = extern union { .enum_full => &self.castTag(.enum_full).?.data.namespace, .enum_nonexhaustive => &self.castTag(.enum_nonexhaustive).?.data.namespace, .empty_struct => self.castTag(.empty_struct).?.data, - .@"opaque" => &self.castTag(.@"opaque").?.data, + .@"opaque" => &self.castTag(.@"opaque").?.data.namespace, .@"union" => &self.castTag(.@"union").?.data.namespace, .union_tagged => &self.castTag(.union_tagged).?.data.namespace, @@ -3870,7 +3874,7 @@ pub const Type = extern union { pub const Opaque = struct { base: Payload = .{ .tag = .@"opaque" }, - data: Module.Namespace, + data: *Module.Opaque, }; pub const Struct = struct { @@ -3904,6 +3908,7 @@ pub const Type = extern union { pub const @"usize" = initTag(.usize); pub const @"comptime_int" = initTag(.comptime_int); pub const @"void" = initTag(.void); + pub const @"type" = initTag(.type); pub fn ptr(arena: *Allocator, d: Payload.Pointer.Data) !Type { assert(d.host_size == 0 or d.bit_offset < d.host_size * 8); |
