authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2022-11-01 03:31:20-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2022-11-01 20:39:05-04:00
log071404ff6500d26c3f8c5b08645bd90ebb3a901b
treedc30280256197634a6b974f55d5dc4d7e06366bb
parent8e52be1602f0b7953332d2e5e9a2b6f23e5410ce

cbe: fix optional access


3 files changed, 3 insertions(+), 5 deletions(-)

src/codegen/c.zig+3-3
...@@ -3193,7 +3193,7 @@ fn airEquality(...@@ -3193,7 +3193,7 @@ fn airEquality(
31933193
3194 try writer.writeAll(" = ");3194 try writer.writeAll(" = ");
31953195
3196 if (operand_ty.tag() == .optional) {3196 if (operand_ty.zigTypeTag() == .Optional and !operand_ty.isPtrLikeOptional()) {
3197 // (A && B) || (C && (A == B))3197 // (A && B) || (C && (A == B))
3198 // A = lhs.is_null ; B = rhs.is_null ; C = rhs.payload == lhs.payload3198 // A = lhs.is_null ; B = rhs.is_null ; C = rhs.payload == lhs.payload
31993199
...@@ -3984,9 +3984,9 @@ fn airIsNull(...@@ -3984,9 +3984,9 @@ fn airIsNull(
39843984
3985 const rhs = if (!payload_ty.hasRuntimeBitsIgnoreComptime())3985 const rhs = if (!payload_ty.hasRuntimeBitsIgnoreComptime())
3986 TypedValue{ .ty = Type.bool, .val = Value.@"true" }3986 TypedValue{ .ty = Type.bool, .val = Value.@"true" }
3987 else if (operand_ty.isPtrLikeOptional())3987 else if (optional_ty.isPtrLikeOptional())
3988 // operand is a regular pointer, test `operand !=/== NULL`3988 // operand is a regular pointer, test `operand !=/== NULL`
3989 TypedValue{ .ty = operand_ty, .val = Value.@"null" }3989 TypedValue{ .ty = optional_ty, .val = Value.@"null" }
3990 else if (payload_ty.zigTypeTag() == .ErrorSet)3990 else if (payload_ty.zigTypeTag() == .ErrorSet)
3991 TypedValue{ .ty = payload_ty, .val = Value.zero }3991 TypedValue{ .ty = payload_ty, .val = Value.zero }
3992 else if (payload_ty.isSlice() and optional_ty.optionalReprIsPayload()) rhs: {3992 else if (payload_ty.isSlice() and optional_ty.optionalReprIsPayload()) rhs: {
test/behavior/bugs/1851.zig-1
...@@ -5,7 +5,6 @@ const expect = std.testing.expect;...@@ -5,7 +5,6 @@ const expect = std.testing.expect;
5test "allocation and looping over 3-byte integer" {5test "allocation and looping over 3-byte integer" {
6 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO6 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
7 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO7 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
8 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
9 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO8 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
10 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO9 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1110
test/behavior/cast.zig-1
...@@ -1178,7 +1178,6 @@ fn cast128Float(x: u128) f128 {...@@ -1178,7 +1178,6 @@ fn cast128Float(x: u128) f128 {
11781178
1179test "implicit cast from *[N]T to ?[*]T" {1179test "implicit cast from *[N]T to ?[*]T" {
1180 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;1180 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1181 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
1182 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1181 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1183 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO1182 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
11841183