aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Module.zig9
-rw-r--r--src/type.zig2
-rw-r--r--src/value.zig34
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,
};
}