Skip to content

Commit f23d4ee

Browse files
cypharemilio
authored andcommitted
tests: add tests for #[repr(packed)] and #[repr(align(...))]
The tests are very straightforward, and effecitvely are just ensuring that the formatting works correctly and is included in all of the important cases. It's also very important to ensure we do not generate laid-out structs for layouts which we cannot reasonably represent in C (such as in cases where we weren't told what annotation to use for packed and specifically-aligned structures). Thus, add some tests to verify that this is the case. Signed-off-by: Aleksa Sarai <[email protected]>
1 parent 725378d commit f23d4ee

27 files changed

+1415
-0
lines changed

tests/expectations/both/layout.c

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
#define CBINDGEN_PACKED __attribute__ ((packed))
2+
#define CBINDGEN_ALIGNED(n) __attribute__ ((aligned(n)))
3+
4+
5+
#include <stdarg.h>
6+
#include <stdbool.h>
7+
#include <stdint.h>
8+
#include <stdlib.h>
9+
10+
typedef struct RustAlign4Struct RustAlign4Struct;
11+
12+
typedef struct RustAlign4Union RustAlign4Union;
13+
14+
typedef struct RustPackedStruct RustPackedStruct;
15+
16+
typedef struct RustPackedUnion RustPackedUnion;
17+
18+
typedef struct UnsupportedAlign4Enum UnsupportedAlign4Enum;
19+
20+
typedef struct UnsupportedPacked4Struct UnsupportedPacked4Struct;
21+
22+
typedef struct UnsupportedPacked4Union UnsupportedPacked4Union;
23+
24+
typedef struct CBINDGEN_ALIGNED(1) Align1Struct {
25+
uintptr_t arg1;
26+
uint8_t *arg2;
27+
} Align1Struct;
28+
29+
typedef struct CBINDGEN_ALIGNED(2) Align2Struct {
30+
uintptr_t arg1;
31+
uint8_t *arg2;
32+
} Align2Struct;
33+
34+
typedef struct CBINDGEN_ALIGNED(4) Align4Struct {
35+
uintptr_t arg1;
36+
uint8_t *arg2;
37+
} Align4Struct;
38+
39+
typedef struct CBINDGEN_ALIGNED(8) Align8Struct {
40+
uintptr_t arg1;
41+
uint8_t *arg2;
42+
} Align8Struct;
43+
44+
typedef struct CBINDGEN_ALIGNED(32) Align32Struct {
45+
uintptr_t arg1;
46+
uint8_t *arg2;
47+
} Align32Struct;
48+
49+
typedef struct CBINDGEN_PACKED PackedStruct {
50+
uintptr_t arg1;
51+
uint8_t *arg2;
52+
} PackedStruct;
53+
54+
typedef union CBINDGEN_ALIGNED(1) Align1Union {
55+
uintptr_t variant1;
56+
uint8_t *variant2;
57+
} Align1Union;
58+
59+
typedef union CBINDGEN_ALIGNED(4) Align4Union {
60+
uintptr_t variant1;
61+
uint8_t *variant2;
62+
} Align4Union;
63+
64+
typedef union CBINDGEN_ALIGNED(16) Align16Union {
65+
uintptr_t variant1;
66+
uint8_t *variant2;
67+
} Align16Union;
68+
69+
typedef union CBINDGEN_PACKED PackedUnion {
70+
uintptr_t variant1;
71+
uint8_t *variant2;
72+
} PackedUnion;
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
#define CBINDGEN_PACKED __attribute__ ((packed))
2+
#define CBINDGEN_ALIGNED(n) __attribute__ ((aligned(n)))
3+
4+
5+
#include <stdarg.h>
6+
#include <stdbool.h>
7+
#include <stdint.h>
8+
#include <stdlib.h>
9+
10+
typedef struct RustAlign4Struct RustAlign4Struct;
11+
12+
typedef struct RustAlign4Union RustAlign4Union;
13+
14+
typedef struct RustPackedStruct RustPackedStruct;
15+
16+
typedef struct RustPackedUnion RustPackedUnion;
17+
18+
typedef struct UnsupportedAlign4Enum UnsupportedAlign4Enum;
19+
20+
typedef struct UnsupportedPacked4Struct UnsupportedPacked4Struct;
21+
22+
typedef struct UnsupportedPacked4Union UnsupportedPacked4Union;
23+
24+
typedef struct CBINDGEN_ALIGNED(1) Align1Struct {
25+
uintptr_t arg1;
26+
uint8_t *arg2;
27+
} Align1Struct;
28+
29+
typedef struct CBINDGEN_ALIGNED(2) Align2Struct {
30+
uintptr_t arg1;
31+
uint8_t *arg2;
32+
} Align2Struct;
33+
34+
typedef struct CBINDGEN_ALIGNED(4) Align4Struct {
35+
uintptr_t arg1;
36+
uint8_t *arg2;
37+
} Align4Struct;
38+
39+
typedef struct CBINDGEN_ALIGNED(8) Align8Struct {
40+
uintptr_t arg1;
41+
uint8_t *arg2;
42+
} Align8Struct;
43+
44+
typedef struct CBINDGEN_ALIGNED(32) Align32Struct {
45+
uintptr_t arg1;
46+
uint8_t *arg2;
47+
} Align32Struct;
48+
49+
typedef struct CBINDGEN_PACKED PackedStruct {
50+
uintptr_t arg1;
51+
uint8_t *arg2;
52+
} PackedStruct;
53+
54+
typedef union CBINDGEN_ALIGNED(1) Align1Union {
55+
uintptr_t variant1;
56+
uint8_t *variant2;
57+
} Align1Union;
58+
59+
typedef union CBINDGEN_ALIGNED(4) Align4Union {
60+
uintptr_t variant1;
61+
uint8_t *variant2;
62+
} Align4Union;
63+
64+
typedef union CBINDGEN_ALIGNED(16) Align16Union {
65+
uintptr_t variant1;
66+
uint8_t *variant2;
67+
} Align16Union;
68+
69+
typedef union CBINDGEN_PACKED PackedUnion {
70+
uintptr_t variant1;
71+
uint8_t *variant2;
72+
} PackedUnion;
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#define CBINDGEN_PACKED __attribute__ ((packed))
2+
#define CBINDGEN_ALIGNED(n) __attribute__ ((aligned(n)))
3+
4+
5+
#include <stdarg.h>
6+
#include <stdbool.h>
7+
#include <stdint.h>
8+
#include <stdlib.h>
9+
10+
typedef struct OpaqueAlign16Union OpaqueAlign16Union;
11+
12+
typedef struct OpaqueAlign1Struct OpaqueAlign1Struct;
13+
14+
typedef struct OpaqueAlign1Union OpaqueAlign1Union;
15+
16+
typedef struct OpaqueAlign2Struct OpaqueAlign2Struct;
17+
18+
typedef struct OpaqueAlign32Struct OpaqueAlign32Struct;
19+
20+
typedef struct OpaqueAlign4Struct OpaqueAlign4Struct;
21+
22+
typedef struct OpaqueAlign4Union OpaqueAlign4Union;
23+
24+
typedef struct OpaqueAlign8Struct OpaqueAlign8Struct;
25+
26+
typedef struct CBINDGEN_PACKED PackedStruct {
27+
uintptr_t arg1;
28+
uint8_t *arg2;
29+
} PackedStruct;
30+
31+
typedef union CBINDGEN_PACKED PackedUnion {
32+
uintptr_t variant1;
33+
uint8_t *variant2;
34+
} PackedUnion;
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#define CBINDGEN_PACKED __attribute__ ((packed))
2+
#define CBINDGEN_ALIGNED(n) __attribute__ ((aligned(n)))
3+
4+
5+
#include <stdarg.h>
6+
#include <stdbool.h>
7+
#include <stdint.h>
8+
#include <stdlib.h>
9+
10+
typedef struct OpaqueAlign16Union OpaqueAlign16Union;
11+
12+
typedef struct OpaqueAlign1Struct OpaqueAlign1Struct;
13+
14+
typedef struct OpaqueAlign1Union OpaqueAlign1Union;
15+
16+
typedef struct OpaqueAlign2Struct OpaqueAlign2Struct;
17+
18+
typedef struct OpaqueAlign32Struct OpaqueAlign32Struct;
19+
20+
typedef struct OpaqueAlign4Struct OpaqueAlign4Struct;
21+
22+
typedef struct OpaqueAlign4Union OpaqueAlign4Union;
23+
24+
typedef struct OpaqueAlign8Struct OpaqueAlign8Struct;
25+
26+
typedef struct CBINDGEN_PACKED PackedStruct {
27+
uintptr_t arg1;
28+
uint8_t *arg2;
29+
} PackedStruct;
30+
31+
typedef union CBINDGEN_PACKED PackedUnion {
32+
uintptr_t variant1;
33+
uint8_t *variant2;
34+
} PackedUnion;
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
#define CBINDGEN_PACKED __attribute__ ((packed))
2+
#define CBINDGEN_ALIGNED(n) __attribute__ ((aligned(n)))
3+
4+
5+
#include <stdarg.h>
6+
#include <stdbool.h>
7+
#include <stdint.h>
8+
#include <stdlib.h>
9+
10+
typedef struct OpaquePackedStruct OpaquePackedStruct;
11+
12+
typedef struct OpaquePackedUnion OpaquePackedUnion;
13+
14+
typedef union CBINDGEN_ALIGNED(1) Align1Union {
15+
uintptr_t variant1;
16+
uint8_t *variant2;
17+
} Align1Union;
18+
19+
typedef union CBINDGEN_ALIGNED(4) Align4Union {
20+
uintptr_t variant1;
21+
uint8_t *variant2;
22+
} Align4Union;
23+
24+
typedef union CBINDGEN_ALIGNED(16) Align16Union {
25+
uintptr_t variant1;
26+
uint8_t *variant2;
27+
} Align16Union;
28+
29+
typedef struct CBINDGEN_ALIGNED(1) Align1Struct {
30+
uintptr_t arg1;
31+
uint8_t *arg2;
32+
} Align1Struct;
33+
34+
typedef struct CBINDGEN_ALIGNED(2) Align2Struct {
35+
uintptr_t arg1;
36+
uint8_t *arg2;
37+
} Align2Struct;
38+
39+
typedef struct CBINDGEN_ALIGNED(4) Align4Struct {
40+
uintptr_t arg1;
41+
uint8_t *arg2;
42+
} Align4Struct;
43+
44+
typedef struct CBINDGEN_ALIGNED(8) Align8Struct {
45+
uintptr_t arg1;
46+
uint8_t *arg2;
47+
} Align8Struct;
48+
49+
typedef struct CBINDGEN_ALIGNED(32) Align32Struct {
50+
uintptr_t arg1;
51+
uint8_t *arg2;
52+
} Align32Struct;
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
#define CBINDGEN_PACKED __attribute__ ((packed))
2+
#define CBINDGEN_ALIGNED(n) __attribute__ ((aligned(n)))
3+
4+
5+
#include <stdarg.h>
6+
#include <stdbool.h>
7+
#include <stdint.h>
8+
#include <stdlib.h>
9+
10+
typedef struct OpaquePackedStruct OpaquePackedStruct;
11+
12+
typedef struct OpaquePackedUnion OpaquePackedUnion;
13+
14+
typedef union CBINDGEN_ALIGNED(1) Align1Union {
15+
uintptr_t variant1;
16+
uint8_t *variant2;
17+
} Align1Union;
18+
19+
typedef union CBINDGEN_ALIGNED(4) Align4Union {
20+
uintptr_t variant1;
21+
uint8_t *variant2;
22+
} Align4Union;
23+
24+
typedef union CBINDGEN_ALIGNED(16) Align16Union {
25+
uintptr_t variant1;
26+
uint8_t *variant2;
27+
} Align16Union;
28+
29+
typedef struct CBINDGEN_ALIGNED(1) Align1Struct {
30+
uintptr_t arg1;
31+
uint8_t *arg2;
32+
} Align1Struct;
33+
34+
typedef struct CBINDGEN_ALIGNED(2) Align2Struct {
35+
uintptr_t arg1;
36+
uint8_t *arg2;
37+
} Align2Struct;
38+
39+
typedef struct CBINDGEN_ALIGNED(4) Align4Struct {
40+
uintptr_t arg1;
41+
uint8_t *arg2;
42+
} Align4Struct;
43+
44+
typedef struct CBINDGEN_ALIGNED(8) Align8Struct {
45+
uintptr_t arg1;
46+
uint8_t *arg2;
47+
} Align8Struct;
48+
49+
typedef struct CBINDGEN_ALIGNED(32) Align32Struct {
50+
uintptr_t arg1;
51+
uint8_t *arg2;
52+
} Align32Struct;

tests/expectations/layout.c

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
#define CBINDGEN_PACKED __attribute__ ((packed))
2+
#define CBINDGEN_ALIGNED(n) __attribute__ ((aligned(n)))
3+
4+
5+
#include <stdarg.h>
6+
#include <stdbool.h>
7+
#include <stdint.h>
8+
#include <stdlib.h>
9+
10+
typedef struct RustAlign4Struct RustAlign4Struct;
11+
12+
typedef struct RustAlign4Union RustAlign4Union;
13+
14+
typedef struct RustPackedStruct RustPackedStruct;
15+
16+
typedef struct RustPackedUnion RustPackedUnion;
17+
18+
typedef struct UnsupportedAlign4Enum UnsupportedAlign4Enum;
19+
20+
typedef struct UnsupportedPacked4Struct UnsupportedPacked4Struct;
21+
22+
typedef struct UnsupportedPacked4Union UnsupportedPacked4Union;
23+
24+
typedef struct CBINDGEN_ALIGNED(1) {
25+
uintptr_t arg1;
26+
uint8_t *arg2;
27+
} Align1Struct;
28+
29+
typedef struct CBINDGEN_ALIGNED(2) {
30+
uintptr_t arg1;
31+
uint8_t *arg2;
32+
} Align2Struct;
33+
34+
typedef struct CBINDGEN_ALIGNED(4) {
35+
uintptr_t arg1;
36+
uint8_t *arg2;
37+
} Align4Struct;
38+
39+
typedef struct CBINDGEN_ALIGNED(8) {
40+
uintptr_t arg1;
41+
uint8_t *arg2;
42+
} Align8Struct;
43+
44+
typedef struct CBINDGEN_ALIGNED(32) {
45+
uintptr_t arg1;
46+
uint8_t *arg2;
47+
} Align32Struct;
48+
49+
typedef struct CBINDGEN_PACKED {
50+
uintptr_t arg1;
51+
uint8_t *arg2;
52+
} PackedStruct;
53+
54+
typedef union CBINDGEN_ALIGNED(1) {
55+
uintptr_t variant1;
56+
uint8_t *variant2;
57+
} Align1Union;
58+
59+
typedef union CBINDGEN_ALIGNED(4) {
60+
uintptr_t variant1;
61+
uint8_t *variant2;
62+
} Align4Union;
63+
64+
typedef union CBINDGEN_ALIGNED(16) {
65+
uintptr_t variant1;
66+
uint8_t *variant2;
67+
} Align16Union;
68+
69+
typedef union CBINDGEN_PACKED {
70+
uintptr_t variant1;
71+
uint8_t *variant2;
72+
} PackedUnion;

0 commit comments

Comments
 (0)