250 lines · cpp
1// REQUIRES: aarch64-registered-target2// RUN: %clang_cc1 -triple aarch64-linux-gnu -x c++ -std=c++1z %s -verify3// expected-no-diagnostics4 5#include <stddef.h>6 7struct t18{9 int foo : 1;10 char : 0;11 char bar;12 13};14static_assert(offsetof(struct t1, bar) == 1);15static_assert(sizeof(struct t1) == 4);16 17struct t218{19 int foo : 1;20 short : 0;21 char bar;22};23static_assert(offsetof(struct t2, bar) == 2);24static_assert(sizeof(struct t2) == 4);25 26struct t327{28 int foo : 1;29 int : 0;30 char bar;31};32static_assert(offsetof(struct t3, bar) == 4);33static_assert(sizeof(struct t3) == 8);34 35struct t436{37 int foo : 1;38 long : 0;39 char bar;40};41static_assert(offsetof(struct t4, bar) == 8);42static_assert(sizeof(struct t4) == 16);43 44struct t545{46 int foo : 1;47 long long : 0;48 char bar;49};50static_assert(offsetof(struct t5, bar) == 8);51static_assert(sizeof(struct t5) == 16);52 53struct t654{55 int foo : 1;56 char : 0;57 char bar : 1;58 char bar2;59};60static_assert(offsetof(struct t6, bar2) == 2);61static_assert(sizeof(struct t6) == 4);62 63struct t764{65 int foo : 1;66 short : 0;67 char bar1 : 1;68 char bar2;69};70static_assert(offsetof(struct t7, bar2) == 3);71static_assert(sizeof(struct t7) == 4);72 73struct t874{75 int foo : 1;76 int : 0;77 char bar1 : 1;78 char bar2;79};80static_assert(offsetof(struct t8, bar2) == 5);81static_assert(sizeof(struct t8) == 8);82 83struct t984{85 int foo : 1;86 long : 0;87 char bar1 : 1;88 char bar2;89};90static_assert(offsetof(struct t9, bar2) == 9);91static_assert(sizeof(struct t9) == 16);92 93struct t1094{95 int foo : 1;96 long long : 0;97 char bar1 : 1;98 char bar2;99};100static_assert(offsetof(struct t10, bar2) == 9);101static_assert(sizeof(struct t10) == 16);102 103struct t11104{105 int foo : 1;106 long long : 0;107 char : 0;108 char bar1 : 1;109 char bar2;110};111static_assert(offsetof(struct t11, bar2) == 9);112static_assert(sizeof(struct t11) == 16);113 114struct t12115{116 int foo : 1;117 char : 0;118 long long : 0;119 char : 0;120 char bar;121};122static_assert(offsetof(struct t12, bar) == 8);123static_assert(sizeof(struct t12) == 16);124 125struct t13126{127 char foo;128 long : 0;129 char bar;130};131static_assert(offsetof(struct t13, bar) == 8);132static_assert(sizeof(struct t13) == 16);133 134struct t14135{136 char foo1;137 int : 0;138 char foo2 : 1;139 short foo3 : 16;140 char : 0;141 short foo4 : 16;142 char bar1;143 int : 0;144 char bar2;145};146static_assert(offsetof(struct t14, bar1) == 10);147static_assert(offsetof(struct t14, bar2) == 12);148static_assert(sizeof(struct t14) == 16);149 150struct t15151{152 char foo;153 char : 0;154 int : 0;155 char bar;156 long : 0;157 char : 0;158};159static_assert(offsetof(struct t15, bar) == 4);160static_assert(sizeof(struct t15) == 8);161 162struct t16163{164 long : 0;165 char bar;166};167static_assert(offsetof(struct t16, bar) == 0);168static_assert(sizeof(struct t16) == 8);169 170struct t17171{172 char foo;173 long : 0;174 long : 0;175 char : 0;176 char bar;177};178static_assert(offsetof(struct t17, bar) == 8);179static_assert(sizeof(struct t17) == 16);180 181struct t18182{183 long : 0;184 long : 0;185 char : 0;186};187static_assert(sizeof(struct t18) == 8);188 189struct t19190{191 char foo1;192 long foo2 : 1;193 char : 0;194 long foo3 : 32;195 char bar;196};197static_assert(offsetof(struct t19, bar) == 6);198static_assert(sizeof(struct t19) == 8);199 200struct t20201{202 short : 0;203 int foo : 1;204 long : 0;205 char bar;206};207static_assert(offsetof(struct t20, bar) == 8);208static_assert(sizeof(struct t20) == 16);209 210struct t21211{212 short : 0;213 int foo1 : 1;214 char : 0;215 int foo2 : 16;216 long : 0;217 char bar1;218 int bar2;219 long bar3;220 char foo3 : 8;221 char : 0;222 long : 0;223 int foo4 : 32;224 short foo5: 1;225 long bar4;226 short foo6: 16;227 short foo7: 16;228 short foo8: 16;229};230static_assert(offsetof(struct t21, bar1) == 8);231static_assert(offsetof(struct t21, bar2) == 12);232static_assert(offsetof(struct t21, bar3) == 16);233static_assert(offsetof(struct t21, bar4) == 40);234static_assert(sizeof(struct t21) == 56);235 236// The rules also apply to anonymous bitfields with non-zero length.237struct t22238{239 char foo;240 short :2;241 char bar;242};243static_assert(alignof(struct t22) == 2);244static_assert(offsetof(struct t22, bar) == 2);245 246int main() {247 return 0;248}249 250