From 4def9c4a9b384a5980086825bcb849a88438912b Mon Sep 17 00:00:00 2001 From: Veikka Tuominen Date: Sun, 27 Nov 2022 18:47:49 +0200 Subject: [PATCH] cbe: operand of address of operator must be an lvalue --- src/codegen/c.zig | 10 +++++++++- test/behavior/floatop.zig | 2 -- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/codegen/c.zig b/src/codegen/c.zig index 85f822d5144a3607b9771d495c41d08e913bedda..97b37309b24ef45a06ae3b17586c43818b96da6a 100644 --- a/src/codegen/c.zig +++ b/src/codegen/c.zig @@ -3788,10 +3788,18 @@ fn airBitcast(f: *Function, inst: Air.Inst.Index) !CValue { const local = try f.allocLocal(inst_ty, .Mut); try writer.writeAll(";\n"); + const operand_lval = if (operand == .constant) blk: { + const operand_local = try f.allocLocal(f.air.typeOf(ty_op.operand), .Const); + try writer.writeAll(" = "); + try f.writeCValue(writer, operand, .Initializer); + try writer.writeAll(";\n"); + break :blk operand_local; + } else operand; + try writer.writeAll("memcpy(&"); try f.writeCValue(writer, local, .Other); try writer.writeAll(", &"); - try f.writeCValue(writer, operand, .Other); + try f.writeCValue(writer, operand_lval, .Other); try writer.writeAll(", sizeof("); try f.renderTypecast(writer, inst_ty); try writer.writeAll("));\n"); diff --git a/test/behavior/floatop.zig b/test/behavior/floatop.zig index e8f997c988f00c2821f98f66bb9ce5b8377c6d47..80b3c0bc74f29624eb4ec6230c9668fbe3ee00d9 100644 --- a/test/behavior/floatop.zig +++ b/test/behavior/floatop.zig @@ -798,7 +798,6 @@ test "comptime fixed-width float non-zero divided by zero produces signed Inf" { if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO inline for (.{ f16, f32, f64, f80, f128 }) |F| { const pos = @as(F, 1) / @as(F, 0); @@ -897,7 +896,6 @@ test "nan negation f80" { if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO const nan_comptime = comptime math.nan(f80); const neg_nan_comptime = -nan_comptime; -- 2.54.0