aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2022-07-23 14:26:01 +0300
committerVeikka Tuominen <git@vexu.eu>2022-07-23 15:40:12 +0300
commitbaf516218e227a55b59c9ae9e6c52b0f9ebd0980 (patch)
treed5e983c4efab7d627916b452919e634e007dfee5
parent2436dd2c1b976f5902be6d20a93c164631ce3df5 (diff)
downloadzig-baf516218e227a55b59c9ae9e6c52b0f9ebd0980.tar.gz
zig-baf516218e227a55b59c9ae9e6c52b0f9ebd0980.zip
Sema: don't add union field access safety check for single field unions
-rw-r--r--src/Sema.zig8
-rw-r--r--test/behavior/align.zig1
2 files changed, 7 insertions, 2 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index d23487a5fd..db3cfa6d40 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -20203,7 +20203,9 @@ fn unionFieldPtr(
}
try sema.requireRuntimeBlock(block, src, null);
- if (!initializing and union_obj.layout == .Auto and block.wantSafety() and union_ty.unionTagTypeSafety() != null) {
+ if (!initializing and union_obj.layout == .Auto and block.wantSafety() and
+ union_ty.unionTagTypeSafety() != null and union_obj.fields.count() > 1)
+ {
const enum_ty = union_ty.unionTagTypeHypothetical();
const wanted_tag_val = try Value.Tag.enum_field_index.create(sema.arena, field_index);
const wanted_tag = try sema.addConstant(enum_ty, wanted_tag_val);
@@ -20271,7 +20273,9 @@ fn unionFieldVal(
}
try sema.requireRuntimeBlock(block, src, null);
- if (union_obj.layout == .Auto and block.wantSafety() and union_ty.unionTagTypeSafety() != null) {
+ if (union_obj.layout == .Auto and block.wantSafety() and
+ union_ty.unionTagTypeSafety() != null and union_obj.fields.count() > 1)
+ {
const enum_ty = union_ty.unionTagTypeHypothetical();
const wanted_tag_val = try Value.Tag.enum_field_index.create(sema.arena, field_index);
const wanted_tag = try sema.addConstant(enum_ty, wanted_tag_val);
diff --git a/test/behavior/align.zig b/test/behavior/align.zig
index d09e97c05b..26e3d91373 100644
--- a/test/behavior/align.zig
+++ b/test/behavior/align.zig
@@ -222,6 +222,7 @@ fn testBytesAlign(b: u8) !void {
test "@alignCast slices" {
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
+ if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
var array align(4) = [_]u32{ 1, 1 };
const slice = array[0..];