authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-12-28 01:31:46-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-12-28 01:31:46-05:00
logf6ac2fa70e7e2eb5d3299dc90c581d139b0bea1b
treea5f5e4c0135f24aafd07c9c7799083c4d8f75140
parent25a5fc32fe68f911f7ac34e513e98cacb0ca17b1

IR: pass pointerToVoidReturnType test


4 files changed, 22 insertions(+), 23 deletions(-)

src/analyze.cpp+4-6
......@@ -330,12 +330,7 @@ TypeTableEntry *get_pointer_to_type(CodeGen *g, TypeTableEntry *child_type, bool
330330 TypeTableEntry *canon_child_type = get_underlying_type(child_type);
331331 assert(canon_child_type->id != TypeTableEntryIdInvalid);
332332
333
334 if (type_is_complete(canon_child_type)) {
335 entry->zero_bits = !type_has_bits(canon_child_type);
336 } else {
337 entry->zero_bits = false;
338 }
333 entry->zero_bits = !type_has_bits(canon_child_type);
339334
340335 if (!entry->zero_bits) {
341336 entry->type_ref = LLVMPointerType(child_type->type_ref, 0);
......@@ -345,6 +340,8 @@ TypeTableEntry *get_pointer_to_type(CodeGen *g, TypeTableEntry *child_type, bool
345340 assert(child_type->di_type);
346341 entry->di_type = ZigLLVMCreateDebugPointerType(g->dbuilder, child_type->di_type,
347342 debug_size_in_bits, debug_align_in_bits, buf_ptr(&entry->name));
343 } else {
344 entry->di_type = g->builtin_types.entry_void->di_type;
348345 }
349346
350347 entry->data.pointer.child_type = child_type;
......@@ -2895,6 +2892,7 @@ bool fn_eval_eql(Scope *a, Scope *b) {
28952892bool type_has_bits(TypeTableEntry *type_entry) {
28962893 assert(type_entry);
28972894 assert(type_entry->id != TypeTableEntryIdInvalid);
2895 assert(type_has_zero_bits_known(type_entry));
28982896 return !type_entry->zero_bits;
28992897}
29002898
src/ir.cpp+4-1
......@@ -4898,7 +4898,9 @@ static TypeTableEntry *ir_analyze_const_ptr(IrAnalyze *ira, IrInstruction *instr
48984898{
48994899 if (pointee_type->id == TypeTableEntryIdMetaType) {
49004900 TypeTableEntry *type_entry = pointee->data.x_type;
4901 ConstExprValue *const_val = ir_build_const_from(ira, instruction, depends_on_compile_var || pointee->depends_on_compile_var);
4901 ConstExprValue *const_val = ir_build_const_from(ira, instruction,
4902 depends_on_compile_var || pointee->depends_on_compile_var);
4903 type_ensure_zero_bits_known(ira->codegen, type_entry);
49024904 const_val->data.x_type = get_pointer_to_type(ira->codegen, type_entry, ptr_is_const);
49034905 return pointee_type;
49044906 } else {
......@@ -7199,6 +7201,7 @@ static TypeTableEntry *ir_analyze_var_ptr(IrAnalyze *ira, IrInstruction *instruc
71997201 return ir_analyze_const_ptr(ira, instruction, mem_slot, var->value.type, false, ptr_special, var->src_is_const);
72007202 } else {
72017203 ir_build_var_ptr_from(&ira->new_irb, instruction, var);
7204 type_ensure_zero_bits_known(ira->codegen, var->value.type);
72027205 return get_pointer_to_type(ira->codegen, var->value.type, var->src_is_const);
72037206 }
72047207}
test/cases/misc.zig+14
......@@ -473,6 +473,20 @@ fn castSliceToU8Slice() {
473473 assert(bytes[11] == @maxValue(u8));
474474}
475475
476fn pointerToVoidReturnType() {
477 @setFnTest(this);
478
479 %%testPointerToVoidReturnType();
480}
481fn testPointerToVoidReturnType() -> %void {
482 const a = testPointerToVoidReturnType2();
483 return *a;
484}
485const test_pointer_to_void_return_type_x = void{};
486fn testPointerToVoidReturnType2() -> &const void {
487 return &test_pointer_to_void_return_type_x;
488}
489
476490// TODO import from std.cstr
477491pub fn cstrlen(ptr: &const u8) -> usize {
478492 var count: usize = 0;
test/self_hosted.zig-16
......@@ -9,19 +9,3 @@ fn getByte(ptr: ?&u8) -> u8 {*??ptr}
99fn getFirstByte(inline T: type, mem: []T) -> u8 {
1010 getByte((&u8)(&mem[0]))
1111}
12
13
14// TODO not passing
15fn pointerToVoidReturnType() {
16 @setFnTest(this);
17
18 %%testPointerToVoidReturnType();
19}
20fn testPointerToVoidReturnType() -> %void {
21 const a = testPointerToVoidReturnType2();
22 return *a;
23}
24const test_pointer_to_void_return_type_x = void{};
25fn testPointerToVoidReturnType2() -> &const void {
26 return &test_pointer_to_void_return_type_x;
27}