| // REQUIRES: aarch64-registered-target |
| // RUN: %clang_cc1 -triple aarch64-linux-gnu -x c++ -std=c++1z %s -verify |
| // expected-no-diagnostics |
| |
| #include <stddef.h> |
| |
| struct t1 |
| { |
| int foo : 1; |
| char : 0; |
| char bar; |
| |
| }; |
| static_assert(offsetof(struct t1, bar) == 1); |
| static_assert(sizeof(struct t1) == 4); |
| |
| struct t2 |
| { |
| int foo : 1; |
| short : 0; |
| char bar; |
| }; |
| static_assert(offsetof(struct t2, bar) == 2); |
| static_assert(sizeof(struct t2) == 4); |
| |
| struct t3 |
| { |
| int foo : 1; |
| int : 0; |
| char bar; |
| }; |
| static_assert(offsetof(struct t3, bar) == 4); |
| static_assert(sizeof(struct t3) == 8); |
| |
| struct t4 |
| { |
| int foo : 1; |
| long : 0; |
| char bar; |
| }; |
| static_assert(offsetof(struct t4, bar) == 8); |
| static_assert(sizeof(struct t4) == 16); |
| |
| struct t5 |
| { |
| int foo : 1; |
| long long : 0; |
| char bar; |
| }; |
| static_assert(offsetof(struct t5, bar) == 8); |
| static_assert(sizeof(struct t5) == 16); |
| |
| struct t6 |
| { |
| int foo : 1; |
| char : 0; |
| char bar : 1; |
| char bar2; |
| }; |
| static_assert(offsetof(struct t6, bar2) == 2); |
| static_assert(sizeof(struct t6) == 4); |
| |
| struct t7 |
| { |
| int foo : 1; |
| short : 0; |
| char bar1 : 1; |
| char bar2; |
| }; |
| static_assert(offsetof(struct t7, bar2) == 3); |
| static_assert(sizeof(struct t7) == 4); |
| |
| struct t8 |
| { |
| int foo : 1; |
| int : 0; |
| char bar1 : 1; |
| char bar2; |
| }; |
| static_assert(offsetof(struct t8, bar2) == 5); |
| static_assert(sizeof(struct t8) == 8); |
| |
| struct t9 |
| { |
| int foo : 1; |
| long : 0; |
| char bar1 : 1; |
| char bar2; |
| }; |
| static_assert(offsetof(struct t9, bar2) == 9); |
| static_assert(sizeof(struct t9) == 16); |
| |
| struct t10 |
| { |
| int foo : 1; |
| long long : 0; |
| char bar1 : 1; |
| char bar2; |
| }; |
| static_assert(offsetof(struct t10, bar2) == 9); |
| static_assert(sizeof(struct t10) == 16); |
| |
| struct t11 |
| { |
| int foo : 1; |
| long long : 0; |
| char : 0; |
| char bar1 : 1; |
| char bar2; |
| }; |
| static_assert(offsetof(struct t11, bar2) == 9); |
| static_assert(sizeof(struct t11) == 16); |
| |
| struct t12 |
| { |
| int foo : 1; |
| char : 0; |
| long long : 0; |
| char : 0; |
| char bar; |
| }; |
| static_assert(offsetof(struct t12, bar) == 8); |
| static_assert(sizeof(struct t12) == 16); |
| |
| struct t13 |
| { |
| char foo; |
| long : 0; |
| char bar; |
| }; |
| static_assert(offsetof(struct t13, bar) == 8); |
| static_assert(sizeof(struct t13) == 16); |
| |
| struct t14 |
| { |
| char foo1; |
| int : 0; |
| char foo2 : 1; |
| short foo3 : 16; |
| char : 0; |
| short foo4 : 16; |
| char bar1; |
| int : 0; |
| char bar2; |
| }; |
| static_assert(offsetof(struct t14, bar1) == 10); |
| static_assert(offsetof(struct t14, bar2) == 12); |
| static_assert(sizeof(struct t14) == 16); |
| |
| struct t15 |
| { |
| char foo; |
| char : 0; |
| int : 0; |
| char bar; |
| long : 0; |
| char : 0; |
| }; |
| static_assert(offsetof(struct t15, bar) == 4); |
| static_assert(sizeof(struct t15) == 8); |
| |
| struct t16 |
| { |
| long : 0; |
| char bar; |
| }; |
| static_assert(offsetof(struct t16, bar) == 0); |
| static_assert(sizeof(struct t16) == 8); |
| |
| struct t17 |
| { |
| char foo; |
| long : 0; |
| long : 0; |
| char : 0; |
| char bar; |
| }; |
| static_assert(offsetof(struct t17, bar) == 8); |
| static_assert(sizeof(struct t17) == 16); |
| |
| struct t18 |
| { |
| long : 0; |
| long : 0; |
| char : 0; |
| }; |
| static_assert(sizeof(struct t18) == 8); |
| |
| struct t19 |
| { |
| char foo1; |
| long foo2 : 1; |
| char : 0; |
| long foo3 : 32; |
| char bar; |
| }; |
| static_assert(offsetof(struct t19, bar) == 6); |
| static_assert(sizeof(struct t19) == 8); |
| |
| struct t20 |
| { |
| short : 0; |
| int foo : 1; |
| long : 0; |
| char bar; |
| }; |
| static_assert(offsetof(struct t20, bar) == 8); |
| static_assert(sizeof(struct t20) == 16); |
| |
| struct t21 |
| { |
| short : 0; |
| int foo1 : 1; |
| char : 0; |
| int foo2 : 16; |
| long : 0; |
| char bar1; |
| int bar2; |
| long bar3; |
| char foo3 : 8; |
| char : 0; |
| long : 0; |
| int foo4 : 32; |
| short foo5: 1; |
| long bar4; |
| short foo6: 16; |
| short foo7: 16; |
| short foo8: 16; |
| }; |
| static_assert(offsetof(struct t21, bar1) == 8); |
| static_assert(offsetof(struct t21, bar2) == 12); |
| static_assert(offsetof(struct t21, bar3) == 16); |
| static_assert(offsetof(struct t21, bar4) == 40); |
| static_assert(sizeof(struct t21) == 56); |
| |
| // The rules also apply to anonymous bitfields with non-zero length. |
| struct t22 |
| { |
| char foo; |
| short :2; |
| char bar; |
| }; |
| static_assert(alignof(struct t22) == 2); |
| static_assert(offsetof(struct t22, bar) == 2); |
| |
| int main() { |
| return 0; |
| } |
| |