mirror of
https://github.com/ziglang/zig.git
synced 2026-01-20 14:25:16 +00:00
stage2: generate correct constants for zero-sized arrays
This commit is contained in:
parent
7062c8a886
commit
4eb7b28700
@ -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);
|
||||
}
|
||||
|
||||
@ -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{}));
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user