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