Commit b2391a7d44

Jacob Young <jacobly0@users.noreply.github.com>
2023-05-31 08:32:09
Sema: remove opv status from arrays with sentinels
Being able to create a pointer to the non-opv sentinel means that these types have to actually be stored.
1 parent 71c4077
Changed files (2)
src/Sema.zig
@@ -33468,11 +33468,13 @@ pub fn typeHasOnePossibleValue(sema: *Sema, ty: Type) CompileError!?Value {
             .inferred_error_set_type,
             => null,
 
-            inline .array_type, .vector_type => |seq_type| {
-                if (seq_type.len == 0) return (try mod.intern(.{ .aggregate = .{
+            inline .array_type, .vector_type => |seq_type, seq_tag| {
+                const has_sentinel = seq_tag == .array_type and seq_type.sentinel != .none;
+                if (seq_type.len + @boolToInt(has_sentinel) == 0) return (try mod.intern(.{ .aggregate = .{
                     .ty = ty.toIntern(),
                     .storage = .{ .elems = &.{} },
                 } })).toValue();
+
                 if (try sema.typeHasOnePossibleValue(seq_type.child.toType())) |opv| {
                     return (try mod.intern(.{ .aggregate = .{
                         .ty = ty.toIntern(),
src/type.zig
@@ -2479,8 +2479,9 @@ pub const Type = struct {
                 .inferred_error_set_type,
                 => return null,
 
-                inline .array_type, .vector_type => |seq_type| {
-                    if (seq_type.len == 0) return (try mod.intern(.{ .aggregate = .{
+                inline .array_type, .vector_type => |seq_type, seq_tag| {
+                    const has_sentinel = seq_tag == .array_type and seq_type.sentinel != .none;
+                    if (seq_type.len + @boolToInt(has_sentinel) == 0) return (try mod.intern(.{ .aggregate = .{
                         .ty = ty.toIntern(),
                         .storage = .{ .elems = &.{} },
                     } })).toValue();