Commit 4eb7b28700

Robin Voetter <robin@voetter.nl>
2021-10-25 03:41:23
stage2: generate correct constants for zero-sized arrays
1 parent 7062c8a
Changed files (3)
src
codegen
test
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);
         }
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{}));
+}
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);