Commit 81318e8704
Changed files (2)
src
codegen
test
behavior
src/codegen/llvm.zig
@@ -1928,6 +1928,7 @@ pub const Object = struct {
if (ty.castTag(.@"struct")) |payload| {
const struct_obj = payload.data;
if (struct_obj.layout == .Packed and struct_obj.haveFieldTypes()) {
+ assert(struct_obj.haveLayout());
const info = struct_obj.backing_int_ty.intInfo(target);
const dwarf_encoding: c_uint = switch (info.signedness) {
.signed => DW.ATE.signed,
@@ -2931,6 +2932,7 @@ pub const DeclGen = struct {
const struct_obj = t.castTag(.@"struct").?.data;
if (struct_obj.layout == .Packed) {
+ assert(struct_obj.haveLayout());
const int_llvm_ty = try dg.lowerType(struct_obj.backing_int_ty);
gop.value_ptr.* = int_llvm_ty;
return int_llvm_ty;
@@ -3632,6 +3634,7 @@ pub const DeclGen = struct {
const struct_obj = tv.ty.castTag(.@"struct").?.data;
if (struct_obj.layout == .Packed) {
+ assert(struct_obj.haveLayout());
const big_bits = struct_obj.backing_int_ty.bitSize(target);
const int_llvm_ty = dg.context.intType(@intCast(c_uint, big_bits));
const fields = struct_obj.fields.values();
@@ -9152,6 +9155,7 @@ pub const FuncGen = struct {
.Struct => {
if (result_ty.containerLayout() == .Packed) {
const struct_obj = result_ty.castTag(.@"struct").?.data;
+ assert(struct_obj.haveLayout());
const big_bits = struct_obj.backing_int_ty.bitSize(target);
const int_llvm_ty = self.context.intType(@intCast(c_uint, big_bits));
const fields = struct_obj.fields.values();
test/behavior/struct.zig
@@ -1430,6 +1430,12 @@ test "struct has only one reference" {
fn errorUnionStructReturn() error{Foo}!struct { x: u8 } {
return error.Foo;
}
+
+ fn pointerPackedStruct(_: *packed struct { x: u8 }) void {}
+ fn nestedPointerPackedStruct(_: struct { x: *packed struct { x: u8 } }) void {}
+ fn pointerNestedPackedStruct(_: *struct { x: packed struct { x: u8 } }) void {}
+ fn pointerNestedPointerPackedStruct(_: *struct { x: *packed struct { x: u8 } }) void {}
+
fn optionalComptimeIntParam(comptime x: ?comptime_int) comptime_int {
return x.?;
}
@@ -1446,6 +1452,14 @@ test "struct has only one reference" {
const error_union_struct_return: *const anyopaque = &S.errorUnionStructReturn;
try expect(optional_struct_return != error_union_struct_return);
+ const pointer_packed_struct: *const anyopaque = &S.pointerPackedStruct;
+ const nested_pointer_packed_struct: *const anyopaque = &S.nestedPointerPackedStruct;
+ try expect(pointer_packed_struct != nested_pointer_packed_struct);
+
+ const pointer_nested_packed_struct: *const anyopaque = &S.pointerNestedPackedStruct;
+ const pointer_nested_pointer_packed_struct: *const anyopaque = &S.pointerNestedPointerPackedStruct;
+ try expect(pointer_nested_packed_struct != pointer_nested_pointer_packed_struct);
+
try expectEqual(@alignOf(struct {}), S.optionalComptimeIntParam(@alignOf(struct {})));
try expectEqual(@alignOf(struct { x: u8 }), S.errorUnionComptimeIntParam(@alignOf(struct { x: u8 })));
try expectEqual(@sizeOf(struct { x: u16 }), S.optionalComptimeIntParam(@sizeOf(struct { x: u16 })));