| #include "struct-layout-1.h" |
| |
| struct Info info; |
| int fails; |
| int intarray[256]; |
| int fn0 (void) { return 0; } |
| int fn1 (void) { return 1; } |
| int fn2 (void) { return 2; } |
| int fn3 (void) { return 3; } |
| int fn4 (void) { return 4; } |
| int fn5 (void) { return 5; } |
| int fn6 (void) { return 6; } |
| int fn7 (void) { return 7; } |
| int fn8 (void) { return 8; } |
| int fn9 (void) { return 9; } |
| |
| /* This macro is intended for fields where their |
| addresses/sizes/alignments and value passing should be checked. */ |
| #define F(n, x, v, w) \ |
| info.flds[i] = &s##n.x; \ |
| info.sizes[i] = sizeof (s##n.x); \ |
| info.aligns[i] = __alignof__ (s##n.x); \ |
| s##n.x = v; \ |
| a##n[2].x = w; \ |
| ++i; |
| /* This macro is for fields where just their addresses/sizes/alignments |
| should be checked. */ |
| #define N(n, x) \ |
| info.flds[i] = &s##n.x; \ |
| info.sizes[i] = sizeof (s##n.x); \ |
| info.aligns[i] = __alignof__ (s##n.x); \ |
| ++i; |
| /* This macro is for fields where just value passing should be checked. */ |
| #define B(n, x, v, w) \ |
| s##n.x = v; \ |
| a##n[2].x = w; \ |
| ++j; |
| #ifdef CXX14_VS_CXX17 |
| struct empty_base {}; |
| #define EMPTY_BASE : public empty_base |
| #else |
| #define EMPTY_BASE |
| #endif |
| #define TX(n, type, attrs, fields, ops) \ |
| type S##n EMPTY_BASE { fields } attrs; \ |
| type S##n s##n; \ |
| extern type S##n a##n[5]; \ |
| extern type S##n check##n (type S##n, type S##n *, \ |
| type S##n); \ |
| extern void check##n##va (int i, ...); \ |
| extern void checkx##n (type S##n); \ |
| void test##n (void) \ |
| { \ |
| int i, j; \ |
| memset (&s##n, '\0', sizeof (s##n)); \ |
| memset (a##n, '\0', sizeof (a##n)); \ |
| memset (&info, '\0', sizeof (info)); \ |
| info.sp = &s##n; \ |
| info.a0p = &a##n[0]; \ |
| info.a3p = &a##n[3]; \ |
| info.sz = sizeof (s##n); \ |
| info.als = __alignof__ (s##n); \ |
| info.ala0 = __alignof__ (a##n[0]); \ |
| info.ala3 = __alignof__ (a##n[3]); \ |
| if (((long) (__SIZE_TYPE__) &a##n[3]) & (info.als - 1)) \ |
| FAIL (n, 1); \ |
| i = 0; j = 0; \ |
| ops \ |
| info.nfields = i; \ |
| info.nbitfields = j; \ |
| checkx##n (check##n (s##n, &a##n[1], a##n[2])); \ |
| check##n##va (1, 1.0, s##n, 2LL, a##n[2], a##n[2]); \ |
| check##n##va (2, s##n, s##n, 2.0L, a##n[2], s##n); \ |
| } |