aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Voetter <robin@voetter.nl>2021-10-25 03:41:23 +0200
committerRobin Voetter <robin@voetter.nl>2021-10-25 20:41:15 +0200
commit4eb7b28700b23d8465a36e364e60394b2a1da41b (patch)
treecb46cfbbd0a3efc2dc2862cee7a871c593427e9b
parent7062c8a8865bbd2fb8181b579da552295cd68e6a (diff)
downloadzig-4eb7b28700b23d8465a36e364e60394b2a1da41b.tar.gz
zig-4eb7b28700b23d8465a36e364e60394b2a1da41b.zip
stage2: generate correct constants for zero-sized arrays
-rw-r--r--src/codegen/llvm.zig6
-rw-r--r--test/behavior/slice.zig9
-rw-r--r--test/behavior/slice_stage1.zig9
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);