aboutsummaryrefslogtreecommitdiff
path: root/src/ir.c
diff options
context:
space:
mode:
authorGinger Bill <bill@gingerbill.org>2017-06-04 11:53:33 +0100
committerGinger Bill <bill@gingerbill.org>2017-06-04 11:53:33 +0100
commitebe5beaafd90bccaee2ece8510e61d2cbf7a81c2 (patch)
tree0efe4ee84413bcde4260496c5ddac6cd47acd5bf /src/ir.c
parent029a6095d952e0319608aed8859508caf1101112 (diff)
Allow using on bit fields
Diffstat (limited to 'src/ir.c')
-rw-r--r--src/ir.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/src/ir.c b/src/ir.c
index 2002c7a4c..f2b75b88d 100644
--- a/src/ir.c
+++ b/src/ir.c
@@ -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);