Commit 2e6aa6d813

Andrew Kelley <superjoe30@gmail.com>
2016-12-18 19:55:34
IR: fix codegen of ref instruction
1 parent a76b048
Changed files (2)
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;
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;
     }
 }