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.

transMemberDesignator

Translator.transMemberDesignator
fn transMemberDesignator(t: *Translator, scope: *Scope, arg: Node.Index) TransError!ZigNode

File

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

Code

fn transMemberDesignator(t: *Translator, scope: *Scope, arg: Node.Index) TransError!ZigNode {
    switch (arg.get(t.tree)) {
        .default_init_expr => |default| {
            const elem_node = try t.transType(scope, default.qt, default.last_tok);
            const ptr_ty = try ZigTag.single_pointer.create(t.arena, .{
                .elem_type = elem_node,
                .is_allowzero = true,
                .is_const = false,
                .is_volatile = false,
            });
            const zero = try ZigTag.ptr_from_int.create(t.arena, ZigTag.zero_literal.init());
            return ZigTag.as.create(t.arena, .{ .lhs = ptr_ty, .rhs = zero });
        },
        .array_access_expr => |access| {
            const base = try t.transMemberDesignator(scope, access.base);
            return t.transArrayAccess(scope, access, base);
        },
        .member_access_expr => |access| {
            const base = try t.transMemberDesignator(scope, access.base);
            // In offsetof context, flexible array members must be accessed via
            // the backing field (`_name`) rather than the accessor function,
            // because you can't take the address of a function call result.
            return t.transMemberAccess(scope, .normal, access, base, .backing);
        },
        .cast => |cast| {
            assert(cast.kind == .array_to_pointer);
            return t.transMemberDesignator(scope, cast.operand);
        },
        else => unreachable,
    }
}