diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2023-05-04 21:57:55 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2023-06-10 20:42:28 -0700 |
| commit | 41cdcd5486ba10dcd21dc45cb8470c556b7497dd (patch) | |
| tree | f4827ae6615e016508f3317a0be90ccdee614e5a | |
| parent | 6ab8b6f8b273356ce248a075b6a0657bfea33c79 (diff) | |
| download | zig-41cdcd5486ba10dcd21dc45cb8470c556b7497dd.tar.gz zig-41cdcd5486ba10dcd21dc45cb8470c556b7497dd.zip | |
stage2: add a few more Value checks for InternPool
| -rw-r--r-- | src/Module.zig | 9 | ||||
| -rw-r--r-- | src/type.zig | 2 | ||||
| -rw-r--r-- | src/value.zig | 34 |
3 files changed, 27 insertions, 18 deletions
diff --git a/src/Module.zig b/src/Module.zig index b1cbd88297..bfc06ac5ab 100644 --- a/src/Module.zig +++ b/src/Module.zig @@ -4903,9 +4903,12 @@ fn semaDecl(mod: *Module, decl_index: Decl.Index) !bool { break :blk (try decl_arena_allocator.dupeZ(u8, bytes)).ptr; }; decl.@"addrspace" = blk: { - const addrspace_ctx: Sema.AddressSpaceContext = switch (decl_tv.val.tag()) { - .function, .extern_fn => .function, - .variable => .variable, + const addrspace_ctx: Sema.AddressSpaceContext = switch (decl_tv.val.ip_index) { + .none => switch (decl_tv.val.tag()) { + .function, .extern_fn => .function, + .variable => .variable, + else => .constant, + }, else => .constant, }; diff --git a/src/type.zig b/src/type.zig index 8cffddb31c..4840bca6e7 100644 --- a/src/type.zig +++ b/src/type.zig @@ -252,7 +252,7 @@ pub const Type = struct { } pub fn castTag(self: Type, comptime t: Tag) ?*t.Type() { - assert(self.ip_index == .none); + if (self.ip_index != .none) return null; if (@enumToInt(self.legacy.tag_if_small_enough) < Tag.no_payload_count) return null; diff --git a/src/value.zig b/src/value.zig index f1d706aa09..c2c37ba68b 100644 --- a/src/value.zig +++ b/src/value.zig @@ -258,7 +258,7 @@ pub const Value = struct { } pub fn castTag(self: Value, comptime t: Tag) ?*t.Type() { - assert(self.ip_index == .none); + if (self.ip_index != .none) return null; if (@enumToInt(self.legacy.tag_if_small_enough) < Tag.no_payload_count) return null; @@ -2806,24 +2806,30 @@ pub const Value = struct { } pub fn isPtrToThreadLocal(val: Value, mod: *Module) bool { - return switch (val.tag()) { - .variable => false, + return switch (val.ip_index) { + .none => switch (val.tag()) { + .variable => false, + else => val.isPtrToThreadLocalInner(mod), + }, else => val.isPtrToThreadLocalInner(mod), }; } fn isPtrToThreadLocalInner(val: Value, mod: *Module) bool { - return switch (val.tag()) { - .slice => val.castTag(.slice).?.data.ptr.isPtrToThreadLocalInner(mod), - .comptime_field_ptr => val.castTag(.comptime_field_ptr).?.data.field_val.isPtrToThreadLocalInner(mod), - .elem_ptr => val.castTag(.elem_ptr).?.data.array_ptr.isPtrToThreadLocalInner(mod), - .field_ptr => val.castTag(.field_ptr).?.data.container_ptr.isPtrToThreadLocalInner(mod), - .eu_payload_ptr => val.castTag(.eu_payload_ptr).?.data.container_ptr.isPtrToThreadLocalInner(mod), - .opt_payload_ptr => val.castTag(.opt_payload_ptr).?.data.container_ptr.isPtrToThreadLocalInner(mod), - .decl_ref => mod.declPtr(val.castTag(.decl_ref).?.data).val.isPtrToThreadLocalInner(mod), - .decl_ref_mut => mod.declPtr(val.castTag(.decl_ref_mut).?.data.decl_index).val.isPtrToThreadLocalInner(mod), - - .variable => val.castTag(.variable).?.data.is_threadlocal, + return switch (val.ip_index) { + .none => switch (val.tag()) { + .slice => val.castTag(.slice).?.data.ptr.isPtrToThreadLocalInner(mod), + .comptime_field_ptr => val.castTag(.comptime_field_ptr).?.data.field_val.isPtrToThreadLocalInner(mod), + .elem_ptr => val.castTag(.elem_ptr).?.data.array_ptr.isPtrToThreadLocalInner(mod), + .field_ptr => val.castTag(.field_ptr).?.data.container_ptr.isPtrToThreadLocalInner(mod), + .eu_payload_ptr => val.castTag(.eu_payload_ptr).?.data.container_ptr.isPtrToThreadLocalInner(mod), + .opt_payload_ptr => val.castTag(.opt_payload_ptr).?.data.container_ptr.isPtrToThreadLocalInner(mod), + .decl_ref => mod.declPtr(val.castTag(.decl_ref).?.data).val.isPtrToThreadLocalInner(mod), + .decl_ref_mut => mod.declPtr(val.castTag(.decl_ref_mut).?.data.decl_index).val.isPtrToThreadLocalInner(mod), + + .variable => val.castTag(.variable).?.data.is_threadlocal, + else => false, + }, else => false, }; } |
