aboutsummaryrefslogtreecommitdiff
path: root/src/codegen/c.zig
diff options
context:
space:
mode:
authorkcbanner <kcbanner@gmail.com>2022-12-12 01:03:10 -0500
committerkcbanner <kcbanner@gmail.com>2023-01-01 16:44:28 -0500
commit351025dc0522f5ad170091c0040e9532e2938d79 (patch)
treef36437ad670ed26973586274451e1706b3e49f75 /src/codegen/c.zig
parent00b54a5fe565f404e0d7d8cdbc05a465d573fc32 (diff)
downloadzig-351025dc0522f5ad170091c0040e9532e2938d79.tar.gz
zig-351025dc0522f5ad170091c0040e9532e2938d79.zip
cbe: msvc compatible int casting inside renderValue .Packed branch
- Handle non-abiInt source types (like packed union) as sources in renderIntCast
Diffstat (limited to 'src/codegen/c.zig')
-rw-r--r--src/codegen/c.zig22
1 files changed, 9 insertions, 13 deletions
diff --git a/src/codegen/c.zig b/src/codegen/c.zig
index 7afcc854b7..8f26141d7a 100644
--- a/src/codegen/c.zig
+++ b/src/codegen/c.zig
@@ -1294,26 +1294,20 @@ pub const DeclGen = struct {
const field_ty = ty.structFieldType(index);
if (!field_ty.hasRuntimeBitsIgnoreComptime()) continue;
- //const cast_context = IntCastContext{ .value = .{ .value = field_val } };
+ const cast_context = IntCastContext{ .value = .{ .value = field_val } };
if (bit_offset_val_pl.data != 0) {
try writer.writeAll("zig_shl_");
try dg.renderTypeForBuiltinFnName(writer, ty);
try writer.writeByte('(');
-
- //try dg.renderIntCast(writer, ty,_context, field_ty, .FunctionArgument);
- try dg.renderValue(writer, field_ty, field_val, .FunctionArgument);
-
+ try dg.renderIntCast(writer, ty, cast_context, field_ty, .FunctionArgument);
try writer.writeAll(", ");
try dg.renderValue(writer, bit_offset_ty, bit_offset_val, .FunctionArgument);
try writer.writeByte(')');
} else {
-
- try dg.renderValue(writer, field_ty, field_val, .FunctionArgument);
- //try dg.renderIntCast(writer, ty, cast_context, field_ty, .FunctionArgument);
-
+ try dg.renderIntCast(writer, ty, cast_context, field_ty, .FunctionArgument);
}
- if (needs_closing_paren) try writer.writeByte(')');
+ if (needs_closing_paren) try writer.writeByte(')') ;
if (eff_index != eff_num_fields - 1) try writer.writeAll(", ");
bit_offset_val_pl.data += field_ty.bitSize(target);
@@ -2213,10 +2207,12 @@ pub const DeclGen = struct {
} else src_ty;
const src_bits = src_eff_ty.bitSize(target);
- const src_int_info = src_eff_ty.intInfo(target);
+ const src_int_info = if (src_eff_ty.isAbiInt()) src_eff_ty.intInfo(target) else null;
if (dest_bits <= 64 and src_bits <= 64) {
- const needs_cast = toCIntBits(dest_int_info.bits) != toCIntBits(src_int_info.bits) or
- dest_int_info.signedness != src_int_info.signedness;
+ const needs_cast = src_int_info == null or
+ (toCIntBits(dest_int_info.bits) != toCIntBits(src_int_info.?.bits) or
+ dest_int_info.signedness != src_int_info.?.signedness);
+
if (needs_cast) {
try w.writeByte('(');
try dg.renderTypecast(w, dest_ty);