aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorXavier Bouchoux <xavierb@gmail.com>2023-03-19 12:56:37 +0000
committerVeikka Tuominen <git@vexu.eu>2023-03-21 14:56:04 +0200
commit898e4473e8acf664d67474716bb9728ed601c5a0 (patch)
tree3362d654440ad5aee89b1811a53f9fe9a77d30c5 /src
parentf7204c7f37ee69462b9ad41a76454831e0df09d0 (diff)
downloadzig-898e4473e8acf664d67474716bb9728ed601c5a0.tar.gz
zig-898e4473e8acf664d67474716bb9728ed601c5a0.zip
CBE: implement aggregateInit() for array of array case.
fixes `error(compilation): clang failed with stderr: error: array type 'uint32_t[10]' (aka 'unsigned int[10]') is not assignable`
Diffstat (limited to 'src')
-rw-r--r--src/codegen/c.zig40
1 files changed, 29 insertions, 11 deletions
diff --git a/src/codegen/c.zig b/src/codegen/c.zig
index 519b2b45d5..0c85f0f923 100644
--- a/src/codegen/c.zig
+++ b/src/codegen/c.zig
@@ -6852,17 +6852,35 @@ fn airAggregateInit(f: *Function, inst: Air.Inst.Index) !CValue {
switch (inst_ty.zigTypeTag()) {
.Array, .Vector => {
const elem_ty = inst_ty.childType();
- for (resolved_elements, 0..) |element, i| {
- try f.writeCValue(writer, local, .Other);
- try writer.print("[{d}] = ", .{i});
- try f.writeCValue(writer, element, .Other);
- try writer.writeAll(";\n");
- }
- if (inst_ty.sentinel()) |sentinel| {
- try f.writeCValue(writer, local, .Other);
- try writer.print("[{d}] = ", .{resolved_elements.len});
- try f.object.dg.renderValue(writer, elem_ty, sentinel, .Other);
- try writer.writeAll(";\n");
+
+ const is_array = lowersToArray(elem_ty, target);
+ const need_memcpy = is_array;
+ if (need_memcpy) {
+ for (resolved_elements, 0..) |element, i| {
+ try writer.writeAll("memcpy(");
+ try f.writeCValue(writer, local, .Other);
+ try writer.print("[{d}]", .{i});
+ try writer.writeAll(", ");
+ try f.writeCValue(writer, element, .Other);
+ try writer.writeAll(", sizeof(");
+ try f.renderType(writer, elem_ty);
+ try writer.writeAll("))");
+ try writer.writeAll(";\n");
+ }
+ assert(inst_ty.sentinel() == null);
+ } else {
+ for (resolved_elements, 0..) |element, i| {
+ try f.writeCValue(writer, local, .Other);
+ try writer.print("[{d}] = ", .{i});
+ try f.writeCValue(writer, element, .Other);
+ try writer.writeAll(";\n");
+ }
+ if (inst_ty.sentinel()) |sentinel| {
+ try f.writeCValue(writer, local, .Other);
+ try writer.print("[{d}] = ", .{resolved_elements.len});
+ try f.object.dg.renderValue(writer, elem_ty, sentinel, .Other);
+ try writer.writeAll(";\n");
+ }
}
},
.Struct => switch (inst_ty.containerLayout()) {