Zig 0.17.0-dev (Split by item)

This is an example of documentation generated by ZigDoc, an alternative to Zig's built-in Auto Doc feature. See also examples in other modes/formats. The project being documented here (as the example) is the Zig library itself.

transIntCast

Translator.transIntCast
fn transIntCast(t: *Translator, operand: ZigNode, src_qt: QualType, dest_qt: QualType) !ZigNode

File

lib/compiler/translate-c/Translator.zig:2691

Code

fn transIntCast(t: *Translator, operand: ZigNode, src_qt: QualType, dest_qt: QualType) !ZigNode {
    const src_dest_order = src_qt.intRankOrder(dest_qt, t.comp);
    const different_sign = t.signedness(src_qt) != t.signedness(dest_qt);
    const needs_bitcast = different_sign and !(t.signedness(src_qt) == .unsigned and src_dest_order == .lt);

    var casted = operand;
    if (casted.isBoolRes()) {
        casted = try ZigTag.int_from_bool.create(t.arena, casted);
    } else if (src_dest_order == .gt) {
        // No C type is smaller than the 1 bit from @intFromBool
        casted = try ZigTag.truncate.create(t.arena, casted);
    }
    if (needs_bitcast) {
        if (src_dest_order != .eq) {
            casted = try ZigTag.as.create(t.arena, .{
                .lhs = try t.transTypeIntWidthOf(dest_qt, t.signedness(src_qt) == .signed),
                .rhs = casted,
            });
        }
        return ZigTag.bit_cast.create(t.arena, casted);
    }
    return casted;
}