authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2022-12-26 23:13:01-05:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2022-12-27 00:12:56-05:00
log81318e870418d017244d6d133aabca19f2c63b58
treecf2798c2ada2b1901f6e2129ea45c6566c40febe
parent46b49a0a766a39ca37ba48f1a1c2ed28c260b08b

llvm: add asserts and behavior tests for #14063

Closes #14063

2 files changed, 18 insertions(+), 0 deletions(-)

src/codegen/llvm.zig+4
......@@ -1928,6 +1928,7 @@ pub const Object = struct {
19281928 if (ty.castTag(.@"struct")) |payload| {
19291929 const struct_obj = payload.data;
19301930 if (struct_obj.layout == .Packed and struct_obj.haveFieldTypes()) {
1931 assert(struct_obj.haveLayout());
19311932 const info = struct_obj.backing_int_ty.intInfo(target);
19321933 const dwarf_encoding: c_uint = switch (info.signedness) {
19331934 .signed => DW.ATE.signed,
......@@ -2931,6 +2932,7 @@ pub const DeclGen = struct {
29312932 const struct_obj = t.castTag(.@"struct").?.data;
29322933
29332934 if (struct_obj.layout == .Packed) {
2935 assert(struct_obj.haveLayout());
29342936 const int_llvm_ty = try dg.lowerType(struct_obj.backing_int_ty);
29352937 gop.value_ptr.* = int_llvm_ty;
29362938 return int_llvm_ty;
......@@ -3632,6 +3634,7 @@ pub const DeclGen = struct {
36323634 const struct_obj = tv.ty.castTag(.@"struct").?.data;
36333635
36343636 if (struct_obj.layout == .Packed) {
3637 assert(struct_obj.haveLayout());
36353638 const big_bits = struct_obj.backing_int_ty.bitSize(target);
36363639 const int_llvm_ty = dg.context.intType(@intCast(c_uint, big_bits));
36373640 const fields = struct_obj.fields.values();
......@@ -9152,6 +9155,7 @@ pub const FuncGen = struct {
91529155 .Struct => {
91539156 if (result_ty.containerLayout() == .Packed) {
91549157 const struct_obj = result_ty.castTag(.@"struct").?.data;
9158 assert(struct_obj.haveLayout());
91559159 const big_bits = struct_obj.backing_int_ty.bitSize(target);
91569160 const int_llvm_ty = self.context.intType(@intCast(c_uint, big_bits));
91579161 const fields = struct_obj.fields.values();
test/behavior/struct.zig+14
......@@ -1430,6 +1430,12 @@ test "struct has only one reference" {
14301430 fn errorUnionStructReturn() error{Foo}!struct { x: u8 } {
14311431 return error.Foo;
14321432 }
1433
1434 fn pointerPackedStruct(_: *packed struct { x: u8 }) void {}
1435 fn nestedPointerPackedStruct(_: struct { x: *packed struct { x: u8 } }) void {}
1436 fn pointerNestedPackedStruct(_: *struct { x: packed struct { x: u8 } }) void {}
1437 fn pointerNestedPointerPackedStruct(_: *struct { x: *packed struct { x: u8 } }) void {}
1438
14331439 fn optionalComptimeIntParam(comptime x: ?comptime_int) comptime_int {
14341440 return x.?;
14351441 }
......@@ -1446,6 +1452,14 @@ test "struct has only one reference" {
14461452 const error_union_struct_return: *const anyopaque = &S.errorUnionStructReturn;
14471453 try expect(optional_struct_return != error_union_struct_return);
14481454
1455 const pointer_packed_struct: *const anyopaque = &S.pointerPackedStruct;
1456 const nested_pointer_packed_struct: *const anyopaque = &S.nestedPointerPackedStruct;
1457 try expect(pointer_packed_struct != nested_pointer_packed_struct);
1458
1459 const pointer_nested_packed_struct: *const anyopaque = &S.pointerNestedPackedStruct;
1460 const pointer_nested_pointer_packed_struct: *const anyopaque = &S.pointerNestedPointerPackedStruct;
1461 try expect(pointer_nested_packed_struct != pointer_nested_pointer_packed_struct);
1462
14491463 try expectEqual(@alignOf(struct {}), S.optionalComptimeIntParam(@alignOf(struct {})));
14501464 try expectEqual(@alignOf(struct { x: u8 }), S.errorUnionComptimeIntParam(@alignOf(struct { x: u8 })));
14511465 try expectEqual(@sizeOf(struct { x: u16 }), S.optionalComptimeIntParam(@sizeOf(struct { x: u16 })));