aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2016-12-18 13:55:34 -0500
committerAndrew Kelley <superjoe30@gmail.com>2016-12-18 13:55:34 -0500
commit2e6aa6d813cf3fd4180b8c9ffc671b4bcee54586 (patch)
treea9ada6a05284c7692ac608c78f0fcc20f54588e1 /src
parenta76b048354e5754b18ecd83ad21cf45c5a34e276 (diff)
downloadzig-2e6aa6d813cf3fd4180b8c9ffc671b4bcee54586.tar.gz
zig-2e6aa6d813cf3fd4180b8c9ffc671b4bcee54586.zip
IR: fix codegen of ref instruction
Diffstat (limited to 'src')
-rw-r--r--src/codegen.cpp2
-rw-r--r--src/ir.cpp10
2 files changed, 11 insertions, 1 deletions
diff --git a/src/codegen.cpp b/src/codegen.cpp
index dd734cbf63..c6e5827154 100644
--- a/src/codegen.cpp
+++ b/src/codegen.cpp
@@ -2854,6 +2854,8 @@ static void do_code_gen(CodeGen *g) {
} else if (instruction->id == IrInstructionIdRef) {
IrInstructionRef *ref_instruction = (IrInstructionRef *)instruction;
slot = &ref_instruction->tmp_ptr;
+ assert(instruction->type_entry->id == TypeTableEntryIdPointer);
+ slot_type = instruction->type_entry->data.pointer.child_type;
} else if (instruction->id == IrInstructionIdContainerInitList) {
IrInstructionContainerInitList *container_init_list_instruction = (IrInstructionContainerInitList *)instruction;
slot = &container_init_list_instruction->tmp_ptr;
diff --git a/src/ir.cpp b/src/ir.cpp
index b215721acb..b920ee2f70 100644
--- a/src/ir.cpp
+++ b/src/ir.cpp
@@ -4732,7 +4732,15 @@ static IrInstruction *ir_analyze_cast_ref(IrAnalyze *ira, IrInstruction *source_
IrInstructionLoadPtr *load_ptr_inst = (IrInstructionLoadPtr *)value;
return load_ptr_inst->ptr;
} else {
- zig_panic("TODO more ways to cast to const pointer");
+ IrInstruction *new_instruction = ir_build_ref(&ira->new_irb, source_instr->scope, source_instr->source_node, value);
+
+ TypeTableEntry *child_type = wanted_type->data.pointer.child_type;
+ if (type_has_bits(child_type)) {
+ FnTableEntry *fn_entry = exec_fn_entry(ira->new_irb.exec);
+ assert(fn_entry);
+ fn_entry->alloca_list.append(new_instruction);
+ }
+ return new_instruction;
}
}