summaryrefslogtreecommitdiff
path: root/test/regression/alignas.c
blob: 4e887d3a3f5e3ac0c90ca4b23ff4921c8441264e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/* _Alignas and its interactions with sizeof */

#include <stdio.h>

#if  __STDC_VERSION__ < 201100 && defined(__GNUC__)
#define _Alignas(x) __attribute__((aligned(x)))
#define _Alignof(x) __alignof__(x)
#endif

/* Base type */
int _Alignas(16) a;
char filler1;

/* Array */
_Alignas(16) int b[3];

typedef int int3[3];
_Alignas(16) int3 bb;

#if 0
typedef _Alignas(16) int int16;
int16 bbb[3];
#endif

char filler2;

/* Struct */
struct s {
  char y;
  int _Alignas(16) x;
};

struct s c;
char filler3;

struct s _Alignas(32) d;
char filler4;

/* Union */
union u {
  int _Alignas(16) x;
  char y;
};

union u e;
char filler5;

union u _Alignas(32) f;
char filler6;

/* Arrays of structs */

struct s g[3];
char filler7;

struct _Alignas(64) ss {
  char y;
  int _Alignas(16) x;
};

struct ss h[3];
char filler8;

/* Test harness */

int main()
{
  printf("a: size = %u, alignment = %u, address mod 16 = %u\n",
         (unsigned) sizeof(a), (unsigned) _Alignof(a), ((unsigned) &a) & 0xF);
  printf("b: size = %u, alignment = %u, address mod 16 = %u\n",
         (unsigned) sizeof(b), (unsigned) _Alignof(b), ((unsigned) &b) & 0xF);
  printf("bb: size = %u, alignment = %u, address mod 16 = %u\n",
         (unsigned) sizeof(bb), (unsigned) _Alignof(bb), ((unsigned) &bb) & 0xF);
#if 0
  printf("bbb: size = %u, alignment = %u, address mod 16 = %u\n",
         (unsigned) sizeof(bbb), (unsigned) _Alignof(bbb), ((unsigned) &bbb) & 0xF);
#endif
  printf("c: size = %u, alignment = %u, address mod 16 = %u\n",
         (unsigned) sizeof(c), (unsigned) _Alignof(c), ((unsigned) &c) & 0xF);
  printf("d: size = %u, alignment = %u, address mod 32 = %u\n",
         (unsigned) sizeof(d), (unsigned) _Alignof(d), ((unsigned) &d) & 0x1F);
  printf("e: size = %u, alignment = %u, address mod 16 = %u\n",
         (unsigned) sizeof(e), (unsigned) _Alignof(e), ((unsigned) &e) & 0xF);
  printf("f: size = %u, alignment = %u, address mod 32 = %u\n",
         (unsigned) sizeof(f), (unsigned) _Alignof(f), ((unsigned) &f) & 0x1F);
  printf("g: size = %u, alignment = %u, address mod 16 = %u\n",
         (unsigned) sizeof(g), (unsigned) _Alignof(g), ((unsigned) &g) & 0xF);
  printf("h: size = %u, alignment = %u, address mod 64 = %u\n",
         (unsigned) sizeof(h), (unsigned) _Alignof(h), ((unsigned) &h) & 0x3F);
  return 0;
}