aboutsummaryrefslogtreecommitdiff
path: root/src/type.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2021-10-19 22:39:46 -0400
committerGitHub <noreply@github.com>2021-10-19 22:39:46 -0400
commit4a76523b92bcf0e9b48438cb22f49e67e0ab3fa1 (patch)
treed8a05453ecd23c9e1dbbc912731958e3b84c9c7a /src/type.zig
parent372e9709ad2f4af24461f0fa601754a469091c2b (diff)
parentc1508c98f479497c2b2586ea944be9f3ddae28fc (diff)
downloadzig-4a76523b92bcf0e9b48438cb22f49e67e0ab3fa1.tar.gz
zig-4a76523b92bcf0e9b48438cb22f49e67e0ab3fa1.zip
Merge pull request #9984 from Snektron/field-elem-access
Field elem access
Diffstat (limited to 'src/type.zig')
-rw-r--r--src/type.zig33
1 files changed, 24 insertions, 9 deletions
diff --git a/src/type.zig b/src/type.zig
index 2bf268bc5f..259a6b8c70 100644
--- a/src/type.zig
+++ b/src/type.zig
@@ -2676,7 +2676,7 @@ pub const Type = extern union {
.pointer => return self.castTag(.pointer).?.data.sentinel,
.array_sentinel => return self.castTag(.array_sentinel).?.data.sentinel,
- .array_u8_sentinel_0 => return Value.initTag(.zero),
+ .array_u8_sentinel_0 => return Value.zero,
else => unreachable,
};
@@ -3096,6 +3096,14 @@ pub const Type = extern union {
}
return Value.initTag(.empty_struct_value);
},
+ .enum_numbered => {
+ const enum_numbered = ty.castTag(.enum_numbered).?.data;
+ if (enum_numbered.fields.count() == 1) {
+ return enum_numbered.values.keys()[0];
+ } else {
+ return null;
+ }
+ },
.enum_full => {
const enum_full = ty.castTag(.enum_full).?.data;
if (enum_full.fields.count() == 1) {
@@ -3107,13 +3115,19 @@ pub const Type = extern union {
.enum_simple => {
const enum_simple = ty.castTag(.enum_simple).?.data;
if (enum_simple.fields.count() == 1) {
- return Value.initTag(.zero);
+ return Value.zero;
+ } else {
+ return null;
+ }
+ },
+ .enum_nonexhaustive => {
+ const tag_ty = ty.castTag(.enum_nonexhaustive).?.data.tag_ty;
+ if (!tag_ty.hasCodeGenBits()) {
+ return Value.zero;
} else {
return null;
}
},
- .enum_nonexhaustive => ty = ty.castTag(.enum_nonexhaustive).?.data.tag_ty,
- .enum_numbered => ty = ty.castTag(.enum_numbered).?.data.tag_ty,
.@"union" => {
return null; // TODO
},
@@ -3129,7 +3143,7 @@ pub const Type = extern union {
.int_unsigned, .int_signed => {
if (ty.cast(Payload.Bits).?.data == 0) {
- return Value.initTag(.zero);
+ return Value.zero;
} else {
return null;
}
@@ -3137,8 +3151,9 @@ pub const Type = extern union {
.vector, .array, .array_u8 => {
if (ty.arrayLen() == 0)
return Value.initTag(.empty_array);
- ty = ty.elemType();
- continue;
+ if (ty.elemType().onePossibleValue() != null)
+ return Value.initTag(.the_only_possible_value);
+ return null;
},
.inferred_alloc_const => unreachable,
@@ -3179,7 +3194,7 @@ pub const Type = extern union {
const info = self.intInfo(target);
if (info.signedness == .unsigned) {
- return Value.initTag(.zero);
+ return Value.zero;
}
if (info.bits <= 6) {
@@ -4013,7 +4028,7 @@ pub const Type = extern union {
) Allocator.Error!Type {
if (elem_type.eql(Type.u8)) {
if (sent) |some| {
- if (some.eql(Value.initTag(.zero), elem_type)) {
+ if (some.eql(Value.zero, elem_type)) {
return Tag.array_u8_sentinel_0.create(arena, len);
}
} else {