aboutsummaryrefslogtreecommitdiffstats
path: root/test/regression/alignas.c
blob: 777c13a56dc623829039e988371a245e54502498 (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>

#ifdef _Alignas
#undef _Alignas
#endif

#if  __STDC_VERSION__ < 201100 && defined(__GNUC__)
#define _Alignas(x) __attribute((aligned(x)))
#endif

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

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

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

/* _Alignas is not allowed in typedefs but the "aligned" attribute is */
typedef __attribute((aligned(16))) int int16;
int16 bbb[3];

char filler2;

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

struct s c;
char filler3;

struct s _Alignas(64) 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, address mod 16 = %u\n",
         (unsigned) sizeof(a), ((unsigned) &a) & 0xF);
  printf("b: size = %u, address mod 16 = %u\n",
         (unsigned) sizeof(b), ((unsigned) &b) & 0xF);
  printf("bb: size = %u, address mod 16 = %u\n",
         (unsigned) sizeof(bb), ((unsigned) &bb) & 0xF);
  printf("bbb: size = %u, address mod 16 = %u\n",
         (unsigned) sizeof(bbb), ((unsigned) &bbb) & 0xF);
  printf("c: size = %u, address mod 16 = %u\n",
         (unsigned) sizeof(c), ((unsigned) &c) & 0xF);
  printf("d: size = %u, address mod 64 = %u\n",
         (unsigned) sizeof(d), ((unsigned) &d) & 0x3F);
  printf("e: size = %u, address mod 16 = %u\n",
         (unsigned) sizeof(e), ((unsigned) &e) & 0xF);
  printf("f: size = %u, address mod 32 = %u\n",
         (unsigned) sizeof(f), ((unsigned) &f) & 0x1F);
  printf("g: size = %u, address mod 16 = %u\n",
         (unsigned) sizeof(g), ((unsigned) &g) & 0xF);
  printf("h: size = %u, address mod 64 = %u\n",
         (unsigned) sizeof(h), ((unsigned) &h) & 0x3F);
  return 0;
}