diff options
| author | Robin Voetter <robin@voetter.nl> | 2021-10-25 03:41:23 +0200 |
|---|---|---|
| committer | Robin Voetter <robin@voetter.nl> | 2021-10-25 20:41:15 +0200 |
| commit | 4eb7b28700b23d8465a36e364e60394b2a1da41b (patch) | |
| tree | cb46cfbbd0a3efc2dc2862cee7a871c593427e9b | |
| parent | 7062c8a8865bbd2fb8181b579da552295cd68e6a (diff) | |
| download | zig-4eb7b28700b23d8465a36e364e60394b2a1da41b.tar.gz zig-4eb7b28700b23d8465a36e364e60394b2a1da41b.zip | |
stage2: generate correct constants for zero-sized arrays
| -rw-r--r-- | src/codegen/llvm.zig | 6 | ||||
| -rw-r--r-- | test/behavior/slice.zig | 9 | ||||
| -rw-r--r-- | test/behavior/slice_stage1.zig | 9 |
3 files changed, 12 insertions, 12 deletions
diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 80f2d8b653..646633a90d 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -762,7 +762,7 @@ pub const DeclGen = struct { } const llvm_addrspace = dg.llvmAddressSpace(t.ptrAddressSpace()); const elem_ty = t.childType(); - const llvm_elem_ty = if (elem_ty.hasCodeGenBits()) + const llvm_elem_ty = if (elem_ty.hasCodeGenBits() or elem_ty.zigTypeTag() == .Array) try dg.llvmType(elem_ty) else dg.context.intType(8); @@ -1475,7 +1475,7 @@ pub const DeclGen = struct { } const llvm_type = try self.llvmType(tv.ty); - if (!tv.ty.childType().hasCodeGenBits()) { + if (!tv.ty.childType().hasCodeGenBits() or !decl.ty.hasCodeGenBits()) { return self.lowerPtrToVoid(tv.ty); } @@ -1497,7 +1497,7 @@ pub const DeclGen = struct { // for non-optional pointers. We also need to respect the alignment, even though // the address will never be dereferenced. const llvm_usize = try dg.llvmType(Type.usize); - const llvm_ptr_ty = dg.context.intType(8).pointerType(0); + const llvm_ptr_ty = try dg.llvmType(ptr_ty); if (alignment != 0) { return llvm_usize.constInt(alignment, .False).constIntToPtr(llvm_ptr_ty); } diff --git a/test/behavior/slice.zig b/test/behavior/slice.zig index dfe2b39297..0332cff802 100644 --- a/test/behavior/slice.zig +++ b/test/behavior/slice.zig @@ -157,3 +157,12 @@ test "comptime pointer cast array and then slice" { try expect(sliceA[1] == 2); try expect(sliceB[1] == 2); } + +test "slicing zero length array" { + const s1 = ""[0..]; + const s2 = ([_]u32{})[0..]; + try expect(s1.len == 0); + try expect(s2.len == 0); + try expect(mem.eql(u8, s1, "")); + try expect(mem.eql(u32, s2, &[_]u32{})); +} diff --git a/test/behavior/slice_stage1.zig b/test/behavior/slice_stage1.zig index e587c5fb53..5bbadc3cc6 100644 --- a/test/behavior/slice_stage1.zig +++ b/test/behavior/slice_stage1.zig @@ -4,15 +4,6 @@ const expectEqualSlices = std.testing.expectEqualSlices; const expectEqual = std.testing.expectEqual; const mem = std.mem; -test "slicing zero length array" { - const s1 = ""[0..]; - const s2 = ([_]u32{})[0..]; - try expect(s1.len == 0); - try expect(s2.len == 0); - try expect(mem.eql(u8, s1, "")); - try expect(mem.eql(u32, s2, &[_]u32{})); -} - test "slice string literal has correct type" { comptime { try expect(@TypeOf("aoeu"[0..]) == *const [4:0]u8); |
