diff options
| author | Ginger Bill <bill@gingerbill.org> | 2017-06-04 11:53:33 +0100 |
|---|---|---|
| committer | Ginger Bill <bill@gingerbill.org> | 2017-06-04 11:53:33 +0100 |
| commit | ebe5beaafd90bccaee2ece8510e61d2cbf7a81c2 (patch) | |
| tree | 0efe4ee84413bcde4260496c5ddac6cd47acd5bf /src/ir.c | |
| parent | 029a6095d952e0319608aed8859508caf1101112 (diff) | |
Allow using on bit fields
Diffstat (limited to 'src/ir.c')
| -rw-r--r-- | src/ir.c | 16 |
1 files changed, 12 insertions, 4 deletions
@@ -4836,10 +4836,18 @@ irAddr ir_build_addr(irProcedure *proc, AstNode *expr) { if (sel.entity->type->kind == Type_BitFieldValue) { irAddr addr = ir_build_addr(proc, se->expr); Type *bft = type_deref(ir_addr_type(addr)); - GB_ASSERT(is_type_bit_field(bft)); - GB_ASSERT(sel.index.count == 1); - i32 index = sel.index.e[0]; - return ir_addr_bit_field(addr.addr, index); + if (sel.index.count == 1) { + GB_ASSERT(is_type_bit_field(bft)); + i32 index = sel.index.e[0]; + return ir_addr_bit_field(addr.addr, index); + } else { + Selection s = sel; + s.index.count--; + i32 index = s.index.e[s.index.count-1]; + irValue *a = addr.addr; + a = ir_emit_deep_field_gep(proc, a, s); + return ir_addr_bit_field(a, index); + } } else { irValue *a = ir_build_addr(proc, se->expr).addr; a = ir_emit_deep_field_gep(proc, a, sel); |