diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2016-12-18 13:55:34 -0500 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2016-12-18 13:55:34 -0500 |
| commit | 2e6aa6d813cf3fd4180b8c9ffc671b4bcee54586 (patch) | |
| tree | a9ada6a05284c7692ac608c78f0fcc20f54588e1 /src | |
| parent | a76b048354e5754b18ecd83ad21cf45c5a34e276 (diff) | |
| download | zig-2e6aa6d813cf3fd4180b8c9ffc671b4bcee54586.tar.gz zig-2e6aa6d813cf3fd4180b8c9ffc671b4bcee54586.zip | |
IR: fix codegen of ref instruction
Diffstat (limited to 'src')
| -rw-r--r-- | src/codegen.cpp | 2 | ||||
| -rw-r--r-- | src/ir.cpp | 10 |
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; } } |
