10e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// REQUIRES: aarch64-registered-target
20e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// RUN: %clang_cc1 -triple aarch64-linux-gnu -x c++ -std=c++1z %s -verify
30e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// expected-no-diagnostics
40e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
50e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#include <stddef.h>
60e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
70e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct t1
80e2c34f92f00628d48968dfea096d36381f494cbStephen Hines{
90e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int foo : 1;
100e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char : 0;
110e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char bar;
120e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
130e2c34f92f00628d48968dfea096d36381f494cbStephen Hines};
140e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(offsetof(struct t1, bar) == 1);
150e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(sizeof(struct t1) == 4);
160e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
170e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct t2
180e2c34f92f00628d48968dfea096d36381f494cbStephen Hines{
190e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int foo : 1;
200e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  short : 0;
210e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char bar;
220e2c34f92f00628d48968dfea096d36381f494cbStephen Hines};
230e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(offsetof(struct t2, bar) == 2);
240e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(sizeof(struct t2) == 4);
250e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
260e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct t3
270e2c34f92f00628d48968dfea096d36381f494cbStephen Hines{
280e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int foo : 1;
290e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int : 0;
300e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char bar;
310e2c34f92f00628d48968dfea096d36381f494cbStephen Hines};
320e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(offsetof(struct t3, bar) == 4);
330e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(sizeof(struct t3) == 8);
340e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
350e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct t4
360e2c34f92f00628d48968dfea096d36381f494cbStephen Hines{
370e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int foo : 1;
380e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  long : 0;
390e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char bar;
400e2c34f92f00628d48968dfea096d36381f494cbStephen Hines};
410e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(offsetof(struct t4, bar) == 8);
420e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(sizeof(struct t4) == 16);
430e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
440e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct t5
450e2c34f92f00628d48968dfea096d36381f494cbStephen Hines{
460e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int foo : 1;
470e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  long long : 0;
480e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char bar;
490e2c34f92f00628d48968dfea096d36381f494cbStephen Hines};
500e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(offsetof(struct t5, bar) == 8);
510e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(sizeof(struct t5) == 16);
520e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
530e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct t6
540e2c34f92f00628d48968dfea096d36381f494cbStephen Hines{
550e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int foo : 1;
560e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char : 0;
570e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char bar : 1;
580e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char bar2;
590e2c34f92f00628d48968dfea096d36381f494cbStephen Hines};
600e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(offsetof(struct t6, bar2) == 2);
610e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(sizeof(struct t6) == 4);
620e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
630e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct t7
640e2c34f92f00628d48968dfea096d36381f494cbStephen Hines{
650e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int foo : 1;
660e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  short : 0;
670e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char bar1 : 1;
680e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char bar2;
690e2c34f92f00628d48968dfea096d36381f494cbStephen Hines};
700e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(offsetof(struct t7, bar2) == 3);
710e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(sizeof(struct t7) == 4);
720e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
730e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct t8
740e2c34f92f00628d48968dfea096d36381f494cbStephen Hines{
750e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int foo : 1;
760e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int : 0;
770e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char bar1 : 1;
780e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char bar2;
790e2c34f92f00628d48968dfea096d36381f494cbStephen Hines};
800e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(offsetof(struct t8, bar2) == 5);
810e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(sizeof(struct t8) == 8);
820e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
830e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct t9
840e2c34f92f00628d48968dfea096d36381f494cbStephen Hines{
850e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int foo : 1;
860e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  long : 0;
870e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char bar1 : 1;
880e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char bar2;
890e2c34f92f00628d48968dfea096d36381f494cbStephen Hines};
900e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(offsetof(struct t9, bar2) == 9);
910e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(sizeof(struct t9) == 16);
920e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
930e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct t10
940e2c34f92f00628d48968dfea096d36381f494cbStephen Hines{
950e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int foo : 1;
960e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  long long : 0;
970e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char bar1 : 1;
980e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char bar2;
990e2c34f92f00628d48968dfea096d36381f494cbStephen Hines};
1000e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(offsetof(struct t10, bar2) == 9);
1010e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(sizeof(struct t10) == 16);
1020e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
1030e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct t11
1040e2c34f92f00628d48968dfea096d36381f494cbStephen Hines{
1050e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int foo : 1;
1060e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  long long : 0;
1070e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char : 0;
1080e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char bar1 : 1;
1090e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char bar2;
1100e2c34f92f00628d48968dfea096d36381f494cbStephen Hines};
1110e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(offsetof(struct t11, bar2) == 9);
1120e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(sizeof(struct t11) == 16);
1130e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
1140e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct t12
1150e2c34f92f00628d48968dfea096d36381f494cbStephen Hines{
1160e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int foo : 1;
1170e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char : 0;
1180e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  long long : 0;
1190e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char : 0;
1200e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char bar;
1210e2c34f92f00628d48968dfea096d36381f494cbStephen Hines};
1220e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(offsetof(struct t12, bar) == 8);
1230e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(sizeof(struct t12) == 16);
1240e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
1250e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct t13
1260e2c34f92f00628d48968dfea096d36381f494cbStephen Hines{
1270e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char foo;
1280e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  long : 0;
1290e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char bar;
1300e2c34f92f00628d48968dfea096d36381f494cbStephen Hines};
1310e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(offsetof(struct t13, bar) == 8);
1320e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(sizeof(struct t13) == 16);
1330e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
1340e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct t14
1350e2c34f92f00628d48968dfea096d36381f494cbStephen Hines{
1360e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char foo1;
1370e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int : 0;
1380e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char foo2 : 1;
1390e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  short foo3 : 16;
1400e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char : 0;
1410e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  short foo4 : 16;
1420e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char bar1;
1430e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int : 0;
1440e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char bar2;
1450e2c34f92f00628d48968dfea096d36381f494cbStephen Hines};
1460e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(offsetof(struct t14, bar1) == 10);
1470e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(offsetof(struct t14, bar2) == 12);
1480e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(sizeof(struct t14) == 16);
1490e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
1500e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct t15
1510e2c34f92f00628d48968dfea096d36381f494cbStephen Hines{
1520e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char foo;
1530e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char : 0;
1540e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int : 0;
1550e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char bar;
1560e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  long : 0;
1570e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char : 0;
1580e2c34f92f00628d48968dfea096d36381f494cbStephen Hines};
1590e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(offsetof(struct t15, bar) == 4);
1600e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(sizeof(struct t15) == 8);
1610e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
1620e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct t16
1630e2c34f92f00628d48968dfea096d36381f494cbStephen Hines{
1640e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  long : 0;
1650e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char bar;
1660e2c34f92f00628d48968dfea096d36381f494cbStephen Hines};
1670e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(offsetof(struct t16, bar) == 0);
1680e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(sizeof(struct t16) == 8);
1690e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
1700e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct t17
1710e2c34f92f00628d48968dfea096d36381f494cbStephen Hines{
1720e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char foo;
1730e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  long : 0;
1740e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  long : 0;
1750e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char : 0;
1760e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char bar;
1770e2c34f92f00628d48968dfea096d36381f494cbStephen Hines};
1780e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(offsetof(struct t17, bar) == 8);
1790e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(sizeof(struct t17) == 16);
1800e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
1810e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct t18
1820e2c34f92f00628d48968dfea096d36381f494cbStephen Hines{
1830e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  long : 0;
1840e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  long : 0;
1850e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char : 0;
1860e2c34f92f00628d48968dfea096d36381f494cbStephen Hines};
1870e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(sizeof(struct t18) == 8);
1880e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
1890e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct t19
1900e2c34f92f00628d48968dfea096d36381f494cbStephen Hines{
1910e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char foo1;
1920e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  long foo2 : 1;
1930e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char : 0;
1940e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  long foo3 : 32;
1950e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char bar;
1960e2c34f92f00628d48968dfea096d36381f494cbStephen Hines};
1970e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(offsetof(struct t19, bar) == 6);
1980e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(sizeof(struct t19) == 8);
1990e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
2000e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct t20
2010e2c34f92f00628d48968dfea096d36381f494cbStephen Hines{
2020e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  short : 0;
2030e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int foo : 1;
2040e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  long : 0;
2050e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char bar;
2060e2c34f92f00628d48968dfea096d36381f494cbStephen Hines};
2070e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(offsetof(struct t20, bar) == 8);
2080e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(sizeof(struct t20) == 16);
2090e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
2100e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct t21
2110e2c34f92f00628d48968dfea096d36381f494cbStephen Hines{
2120e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  short : 0;
2130e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int foo1 : 1;
2140e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char : 0;
2150e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int foo2 : 16;
2160e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  long : 0;
2170e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char bar1;
2180e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int bar2;
2190e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  long bar3;
2200e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char foo3 : 8;
2210e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char : 0;
2220e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  long : 0;
2230e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int foo4 : 32;
2240e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  short foo5: 1;
2250e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  long bar4;
2260e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  short foo6: 16;
2270e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  short foo7: 16;
2280e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  short foo8: 16;
2290e2c34f92f00628d48968dfea096d36381f494cbStephen Hines};
2300e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(offsetof(struct t21, bar1) == 8);
2310e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(offsetof(struct t21, bar2) == 12);
2320e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(offsetof(struct t21, bar3) == 16);
2330e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(offsetof(struct t21, bar4) == 40);
2340e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(sizeof(struct t21) == 56);
2350e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
2360e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// The rules also apply to anonymous bitfields with non-zero length.
2370e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct t22
2380e2c34f92f00628d48968dfea096d36381f494cbStephen Hines{
2390e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char foo;
2400e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  short :2;
2410e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  char bar;
2420e2c34f92f00628d48968dfea096d36381f494cbStephen Hines};
2430e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(alignof(struct t22) == 2);
2440e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(offsetof(struct t22, bar) == 2);
2450e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
2460e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesint main() {
2470e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  return 0;
2480e2c34f92f00628d48968dfea096d36381f494cbStephen Hines}
2490e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
250