authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-03-06 17:19:45-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-03-06 17:19:45-05:00
log44ae891bd79cc8b2f9040a39c176317ebf4a4ef8
tree3d4586803b1549dc64a8ad977ba39f03d4b74b68
parentcc0f660ad245b0482981b8dcc2b200c7d68b943d

fix assertion when taking slice of zero-length array

closes #788

2 files changed, 15 insertions(+), 1 deletions(-)

src/ir.cpp+5-1
...@@ -15821,9 +15821,13 @@ static TypeTableEntry *ir_analyze_instruction_slice(IrAnalyze *ira, IrInstructio...@@ -15821,9 +15821,13 @@ static TypeTableEntry *ir_analyze_instruction_slice(IrAnalyze *ira, IrInstructio
15821 TypeTableEntry *return_type;15821 TypeTableEntry *return_type;
1582215822
15823 if (array_type->id == TypeTableEntryIdArray) {15823 if (array_type->id == TypeTableEntryIdArray) {
15824 uint32_t byte_alignment = ptr_type->data.pointer.alignment;
15825 if (array_type->data.array.len == 0 && byte_alignment == 0) {
15826 byte_alignment = get_abi_alignment(ira->codegen, array_type->data.array.child_type);
15827 }
15824 TypeTableEntry *slice_ptr_type = get_pointer_to_type_extra(ira->codegen, array_type->data.array.child_type,15828 TypeTableEntry *slice_ptr_type = get_pointer_to_type_extra(ira->codegen, array_type->data.array.child_type,
15825 ptr_type->data.pointer.is_const, ptr_type->data.pointer.is_volatile,15829 ptr_type->data.pointer.is_const, ptr_type->data.pointer.is_volatile,
15826 ptr_type->data.pointer.alignment, 0, 0);15830 byte_alignment, 0, 0);
15827 return_type = get_slice_type(ira->codegen, slice_ptr_type);15831 return_type = get_slice_type(ira->codegen, slice_ptr_type);
15828 } else if (array_type->id == TypeTableEntryIdPointer) {15832 } else if (array_type->id == TypeTableEntryIdPointer) {
15829 TypeTableEntry *slice_ptr_type = get_pointer_to_type_extra(ira->codegen, array_type->data.pointer.child_type,15833 TypeTableEntry *slice_ptr_type = get_pointer_to_type_extra(ira->codegen, array_type->data.pointer.child_type,
test/cases/misc.zig+10
...@@ -650,3 +650,13 @@ test "packed struct, enum, union parameters in extern function" {...@@ -650,3 +650,13 @@ test "packed struct, enum, union parameters in extern function" {
650650
651export fn testPackedStuff(a: &const PackedStruct, b: &const PackedUnion, c: PackedEnum) void {651export fn testPackedStuff(a: &const PackedStruct, b: &const PackedUnion, c: PackedEnum) void {
652}652}
653
654
655test "slicing zero length array" {
656 const s1 = ""[0..];
657 const s2 = ([]u32{})[0..];
658 assert(s1.len == 0);
659 assert(s2.len == 0);
660 assert(mem.eql(u8, s1, ""));
661 assert(mem.eql(u32, s2, []u32{}));
662}