|  | // RUN: %clang_cc1 -triple x86_64-unknown-unknown %s -fsyntax-only -verify -std=c++98 -Wno-inaccessible-base -Wno-invalid-offsetof -Wno-c++11-extensions | 
|  | // RUN: %clang_cc1 -triple x86_64-unknown-unknown %s -fsyntax-only -verify -std=c++11 -Wno-inaccessible-base -Wno-invalid-offsetof | 
|  | // RUN: %clang_cc1 -triple x86_64-apple-darwin    %s -fsyntax-only -verify -std=c++11 -Wno-inaccessible-base -Wno-invalid-offsetof -DCLANG_ABI_COMPAT=15 | 
|  | // RUN: %clang_cc1 -triple x86_64-scei-ps4        %s -fsyntax-only -verify -std=c++11 -Wno-inaccessible-base -Wno-invalid-offsetof -DCLANG_ABI_COMPAT=6 | 
|  | // RUN: %clang_cc1 -triple x86_64-sie-ps5         %s -fsyntax-only -verify -std=c++11 -Wno-inaccessible-base -Wno-invalid-offsetof -DCLANG_ABI_COMPAT=6 | 
|  | // RUN: %clang_cc1 -triple x86_64-unknown-unknown %s -fsyntax-only -verify -std=c++11 -Wno-inaccessible-base -Wno-invalid-offsetof -fclang-abi-compat=6 -DCLANG_ABI_COMPAT=6 | 
|  | // RUN: %clang_cc1 -triple x86_64-unknown-unknown %s -fsyntax-only -verify -std=c++11 -Wno-inaccessible-base -Wno-invalid-offsetof -fclang-abi-compat=14 -DCLANG_ABI_COMPAT=14 | 
|  | // RUN: %clang_cc1 -triple x86_64-unknown-unknown %s -fsyntax-only -verify -std=c++11 -Wno-inaccessible-base -Wno-invalid-offsetof -fclang-abi-compat=15 -DCLANG_ABI_COMPAT=15 | 
|  | // RUN: %clang_cc1 -triple x86_64-unknown-unknown %s -fsyntax-only -verify -std=c++11 -Wno-inaccessible-base -Wno-invalid-offsetof -fclang-abi-compat=16 -DCLANG_ABI_COMPAT=16 | 
|  | // RUN: %clang_cc1 -triple powerpc-ibm-aix7.3.0.0 %s -fsyntax-only -verify -std=c++11 -Wno-inaccessible-base -Wno-invalid-offsetof -DCLANG_ABI_COMPAT=15 | 
|  | // RUN: %clang_cc1 -triple powerpc-ibm-aix7.3.0.0 %s -fsyntax-only -verify -std=c++11 -Wno-inaccessible-base -Wno-invalid-offsetof -fclang-abi-compat=15 -DCLANG_ABI_COMPAT=15 | 
|  | // RUN: %clang_cc1 -triple powerpc64-ibm-aix7.3.0.0 %s -fsyntax-only -verify -std=c++11 -Wno-inaccessible-base -Wno-invalid-offsetof -DCLANG_ABI_COMPAT=15 | 
|  | // RUN: %clang_cc1 -triple powerpc64-ibm-aix7.3.0.0 %s -fsyntax-only -verify -std=c++11 -Wno-inaccessible-base -Wno-invalid-offsetof -fclang-abi-compat=15 -DCLANG_ABI_COMPAT=15 | 
|  | // RUN: %clang_cc1 -triple s390x-none-zos %s -fsyntax-only -verify -std=c++11 -Wno-inaccessible-base -Wno-invalid-offsetof | 
|  | // RUN: %clang_cc1 -triple s390x-none-zos %s -fsyntax-only -verify -std=c++11 -Wno-inaccessible-base -Wno-invalid-offsetof -fclang-abi-compat=15 -DCLANG_ABI_COMPAT=15 | 
|  |  | 
|  | // RUN: %clang_cc1 -fexperimental-new-constant-interpreter -triple x86_64-unknown-unknown %s -fsyntax-only -verify -std=c++98 -Wno-inaccessible-base -Wno-c++11-extensions -Wno-invalid-offsetof | 
|  | // RUN: %clang_cc1 -fexperimental-new-constant-interpreter -triple x86_64-unknown-unknown %s -fsyntax-only -verify -std=c++11 -Wno-inaccessible-base -Wno-invalid-offsetof | 
|  | // RUN: %clang_cc1 -fexperimental-new-constant-interpreter -triple x86_64-apple-darwin    %s -fsyntax-only -verify -std=c++11 -Wno-inaccessible-base -DCLANG_ABI_COMPAT=15 -Wno-invalid-offsetof | 
|  | // RUN: %clang_cc1 -fexperimental-new-constant-interpreter -triple x86_64-scei-ps4        %s -fsyntax-only -verify -std=c++11 -Wno-inaccessible-base -DCLANG_ABI_COMPAT=6 -Wno-invalid-offsetof | 
|  | // RUN: %clang_cc1 -fexperimental-new-constant-interpreter -triple x86_64-sie-ps5         %s -fsyntax-only -verify -std=c++11 -Wno-inaccessible-base -DCLANG_ABI_COMPAT=6 -Wno-invalid-offsetof | 
|  | // RUN: %clang_cc1 -fexperimental-new-constant-interpreter -triple x86_64-unknown-unknown %s -fsyntax-only -verify -std=c++11 -Wno-inaccessible-base -fclang-abi-compat=6 -DCLANG_ABI_COMPAT=6 -Wno-invalid-offsetof | 
|  | // RUN: %clang_cc1 -fexperimental-new-constant-interpreter -triple x86_64-unknown-unknown %s -fsyntax-only -verify -std=c++11 -Wno-inaccessible-base -fclang-abi-compat=14 -DCLANG_ABI_COMPAT=14 -Wno-invalid-offsetof | 
|  | // RUN: %clang_cc1 -fexperimental-new-constant-interpreter -triple x86_64-unknown-unknown %s -fsyntax-only -verify -std=c++11 -Wno-inaccessible-base -fclang-abi-compat=15 -DCLANG_ABI_COMPAT=15 -Wno-invalid-offsetof | 
|  | // RUN: %clang_cc1 -fexperimental-new-constant-interpreter -triple x86_64-unknown-unknown %s -fsyntax-only -verify -std=c++11 -Wno-inaccessible-base -fclang-abi-compat=16 -DCLANG_ABI_COMPAT=16 -Wno-invalid-offsetof | 
|  | // RUN: %clang_cc1 -fexperimental-new-constant-interpreter -triple powerpc-ibm-aix7.3.0.0 %s -fsyntax-only -verify -std=c++11 -Wno-inaccessible-base -DCLANG_ABI_COMPAT=15 -Wno-invalid-offsetof | 
|  | // RUN: %clang_cc1 -fexperimental-new-constant-interpreter -triple powerpc-ibm-aix7.3.0.0 %s -fsyntax-only -verify -std=c++11 -Wno-inaccessible-base -fclang-abi-compat=15 -DCLANG_ABI_COMPAT=15 -Wno-invalid-offsetof | 
|  | // RUN: %clang_cc1 -fexperimental-new-constant-interpreter -triple powerpc64-ibm-aix7.3.0.0 %s -fsyntax-only -verify -std=c++11 -Wno-inaccessible-base -DCLANG_ABI_COMPAT=15 -Wno-invalid-offsetof | 
|  | // RUN: %clang_cc1 -fexperimental-new-constant-interpreter -triple powerpc64-ibm-aix7.3.0.0 %s -fsyntax-only -verify -std=c++11 -Wno-inaccessible-base -fclang-abi-compat=15 -DCLANG_ABI_COMPAT=15 -Wno-invalid-offsetof | 
|  | // RUN: %clang_cc1 -fexperimental-new-constant-interpreter -triple s390x-none-zos %s -fsyntax-only -verify -std=c++11 -Wno-inaccessible-base -Wno-invalid-offsetof | 
|  | // RUN: %clang_cc1 -fexperimental-new-constant-interpreter -triple s390x-none-zos %s -fsyntax-only -verify -std=c++11 -Wno-inaccessible-base -fclang-abi-compat=15 -DCLANG_ABI_COMPAT=15 -Wno-invalid-offsetof | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  | // expected-no-diagnostics | 
|  |  | 
|  | #if !defined(__MVS__) && !defined(_AIX) | 
|  |  | 
|  | #define SA(n, p) int a##n[(p) ? 1 : -1] | 
|  |  | 
|  | struct A { | 
|  | int a; | 
|  | char b; | 
|  | }; | 
|  |  | 
|  | SA(0, sizeof(A) == 8); | 
|  |  | 
|  | struct B : A { | 
|  | char c; | 
|  | }; | 
|  |  | 
|  | SA(1, sizeof(B) == 12); | 
|  |  | 
|  | struct C { | 
|  | // Make fields private so C won't be a POD type. | 
|  | private: | 
|  | int a; | 
|  | char b; | 
|  | }; | 
|  |  | 
|  | SA(2, sizeof(C) == 8); | 
|  |  | 
|  | struct D : C { | 
|  | char c; | 
|  | }; | 
|  |  | 
|  | SA(3, sizeof(D) == 8); | 
|  |  | 
|  | struct __attribute__((packed)) E { | 
|  | char b; | 
|  | int a; | 
|  | }; | 
|  |  | 
|  | SA(4, sizeof(E) == 5); | 
|  |  | 
|  | struct __attribute__((packed)) F : E { | 
|  | char d; | 
|  | }; | 
|  |  | 
|  | SA(5, sizeof(F) == 6); | 
|  |  | 
|  | struct G { G(); }; | 
|  | struct H : G { }; | 
|  |  | 
|  | SA(6, sizeof(H) == 1); | 
|  |  | 
|  | struct I { | 
|  | char b; | 
|  | int a; | 
|  | } __attribute__((packed)); | 
|  |  | 
|  | SA(6_1, sizeof(I) == 5); | 
|  |  | 
|  | // PR5580 | 
|  | namespace PR5580 { | 
|  |  | 
|  | class A { bool iv0 : 1; }; | 
|  | SA(7, sizeof(A) == 1); | 
|  |  | 
|  | class B : A { bool iv0 : 1; }; | 
|  | SA(8, sizeof(B) == 2); | 
|  |  | 
|  | struct C { bool iv0 : 1; }; | 
|  | SA(9, sizeof(C) == 1); | 
|  |  | 
|  | struct D : C { bool iv0 : 1; }; | 
|  | SA(10, sizeof(D) == 2); | 
|  |  | 
|  | } | 
|  |  | 
|  | namespace Test1 { | 
|  |  | 
|  | // Test that we don't assert on this hierarchy. | 
|  | struct A { }; | 
|  | struct B : A { virtual void b(); }; | 
|  | class C : virtual A { int c; }; | 
|  | struct D : virtual B { }; | 
|  | struct E : C, virtual D { }; | 
|  | class F : virtual E { }; | 
|  | struct G : virtual E, F { }; | 
|  |  | 
|  | SA(0, sizeof(G) == 24); | 
|  |  | 
|  | } | 
|  |  | 
|  | namespace Test2 { | 
|  |  | 
|  | // Test that this somewhat complex class structure is laid out correctly. | 
|  | struct A { }; | 
|  | struct B : A { virtual void b(); }; | 
|  | struct C : virtual B { }; | 
|  | struct D : virtual A { }; | 
|  | struct E : virtual B, D { }; | 
|  | struct F : E, virtual C { }; | 
|  | struct G : virtual F, A { }; | 
|  | struct H { G g; }; | 
|  |  | 
|  | SA(0, sizeof(H) == 24); | 
|  |  | 
|  | } | 
|  |  | 
|  | namespace PR16537 { | 
|  | namespace test1 { | 
|  | struct pod_in_11_only { | 
|  | private: | 
|  | long long x; | 
|  | }; | 
|  |  | 
|  | struct tail_padded_pod_in_11_only { | 
|  | pod_in_11_only pod11; | 
|  | char tail_padding; | 
|  | }; | 
|  |  | 
|  | struct might_use_tail_padding : public tail_padded_pod_in_11_only { | 
|  | char may_go_into_tail_padding; | 
|  | }; | 
|  |  | 
|  | SA(0, sizeof(might_use_tail_padding) == 16); | 
|  | } | 
|  |  | 
|  | namespace test2 { | 
|  | struct pod_in_11_only { | 
|  | private: | 
|  | long long x; | 
|  | }; | 
|  |  | 
|  | struct tail_padded_pod_in_11_only { | 
|  | pod_in_11_only pod11 __attribute__((aligned(16))); | 
|  | }; | 
|  |  | 
|  | struct might_use_tail_padding : public tail_padded_pod_in_11_only { | 
|  | char may_go_into_tail_padding; | 
|  | }; | 
|  |  | 
|  | SA(0, sizeof(might_use_tail_padding) == 16); | 
|  | } | 
|  |  | 
|  | namespace test3 { | 
|  | struct pod_in_11_only { | 
|  | private: | 
|  | long long x; | 
|  | }; | 
|  |  | 
|  | struct tail_padded_pod_in_11_only { | 
|  | pod_in_11_only pod11; | 
|  | char tail_padding; | 
|  | }; | 
|  |  | 
|  | struct second_base { | 
|  | char foo; | 
|  | }; | 
|  |  | 
|  | struct might_use_tail_padding : public tail_padded_pod_in_11_only, public second_base { | 
|  |  | 
|  | }; | 
|  | SA(0, sizeof(might_use_tail_padding) == 16); | 
|  | } | 
|  |  | 
|  | namespace test4 { | 
|  | struct pod_in_11_only { | 
|  | private: | 
|  | long long x; | 
|  | }; | 
|  |  | 
|  | struct tail_padded_pod_in_11_only { | 
|  | pod_in_11_only pod11; | 
|  | char tail_padding; | 
|  | }; | 
|  |  | 
|  | struct second_base { | 
|  | char foo; | 
|  | }; | 
|  |  | 
|  | struct might_use_tail_padding : public tail_padded_pod_in_11_only, public second_base { | 
|  | char may_go_into_tail_padding; | 
|  | }; | 
|  | SA(0, sizeof(might_use_tail_padding) == 16); | 
|  | } | 
|  |  | 
|  | namespace test5 { | 
|  | struct pod_in_11_only { | 
|  | private: | 
|  | long long x; | 
|  | }; | 
|  |  | 
|  | struct pod_in_11_only2 { | 
|  | private: | 
|  | long long x; | 
|  | }; | 
|  |  | 
|  | struct tail_padded_pod_in_11_only { | 
|  | pod_in_11_only pod11; | 
|  | char tail_padding; | 
|  | }; | 
|  |  | 
|  | struct second_base { | 
|  | pod_in_11_only2 two; | 
|  | char foo; | 
|  | }; | 
|  |  | 
|  | struct might_use_tail_padding : public tail_padded_pod_in_11_only, public second_base { | 
|  | char may_go_into_tail_padding; | 
|  | }; | 
|  | SA(0, sizeof(might_use_tail_padding) == 32); | 
|  | } | 
|  |  | 
|  | namespace test6 { | 
|  | struct pod_in_11_only { | 
|  | private: | 
|  | long long x; | 
|  | }; | 
|  |  | 
|  | struct pod_in_11_only2 { | 
|  | private: | 
|  | long long x; | 
|  | }; | 
|  |  | 
|  | struct tail_padded_pod_in_11_only { | 
|  | pod_in_11_only pod11; | 
|  | char tail_padding; | 
|  | }; | 
|  |  | 
|  | struct second_base { | 
|  | pod_in_11_only2 two; | 
|  | char foo; | 
|  | }; | 
|  |  | 
|  | struct might_use_tail_padding : public tail_padded_pod_in_11_only, public second_base { | 
|  | char may_go_into_tail_padding; | 
|  | }; | 
|  | SA(0, sizeof(might_use_tail_padding) == 32); | 
|  | } | 
|  |  | 
|  | namespace test7 { | 
|  | struct pod_in_11_only { | 
|  | private: | 
|  | long long x; | 
|  | }; | 
|  |  | 
|  | struct tail_padded_pod_in_11_only { | 
|  | pod_in_11_only pod11; | 
|  | pod_in_11_only pod12; | 
|  | char tail_padding; | 
|  | }; | 
|  |  | 
|  | struct might_use_tail_padding : public tail_padded_pod_in_11_only { | 
|  | char may_go_into_tail_padding; | 
|  | }; | 
|  |  | 
|  | SA(0, sizeof(might_use_tail_padding) == 24); | 
|  | } | 
|  |  | 
|  | namespace test8 { | 
|  | struct pod_in_11_only { | 
|  | private: | 
|  | long long x; | 
|  | }; | 
|  |  | 
|  | struct tail_padded_pod_in_11_only { | 
|  | pod_in_11_only pod11; | 
|  | char tail_padding; | 
|  | }; | 
|  |  | 
|  | struct another_layer { | 
|  | tail_padded_pod_in_11_only pod; | 
|  | char padding; | 
|  | }; | 
|  |  | 
|  | struct might_use_tail_padding : public another_layer { | 
|  | char may_go_into_tail_padding; | 
|  | }; | 
|  |  | 
|  | SA(0, sizeof(might_use_tail_padding) == 24); | 
|  | } | 
|  |  | 
|  | namespace test9 { | 
|  | struct pod_in_11_only { | 
|  | private: | 
|  | long long x; | 
|  | }; | 
|  |  | 
|  | struct tail_padded_pod_in_11_only { | 
|  | pod_in_11_only pod11; | 
|  | char tail_padding; | 
|  | }; | 
|  |  | 
|  | struct another_layer : tail_padded_pod_in_11_only { | 
|  | }; | 
|  |  | 
|  | struct might_use_tail_padding : public another_layer { | 
|  | char may_go_into_tail_padding; | 
|  | }; | 
|  |  | 
|  | SA(0, sizeof(might_use_tail_padding) == 16); | 
|  | } | 
|  |  | 
|  | namespace test10 { | 
|  | struct pod_in_11_only { | 
|  | private: | 
|  | long long x; | 
|  | }; | 
|  |  | 
|  | struct A { | 
|  | pod_in_11_only a; | 
|  | char apad; | 
|  | }; | 
|  |  | 
|  | struct B { | 
|  | char b; | 
|  | }; | 
|  |  | 
|  | struct C { | 
|  | pod_in_11_only c; | 
|  | char cpad; | 
|  | }; | 
|  |  | 
|  | struct D { | 
|  | char d; | 
|  | }; | 
|  |  | 
|  | struct might_use_tail_padding : public A, public B, public C, public D { | 
|  | }; | 
|  |  | 
|  | SA(0, sizeof(might_use_tail_padding) == 32); | 
|  | } | 
|  |  | 
|  | namespace test11 { | 
|  | struct pod_in_11_only { | 
|  | private: | 
|  | long long x; | 
|  | }; | 
|  |  | 
|  | struct A { | 
|  | pod_in_11_only a; | 
|  | char apad; | 
|  | }; | 
|  |  | 
|  | struct B { | 
|  | char b_pre; | 
|  | pod_in_11_only b; | 
|  | char bpad; | 
|  | }; | 
|  |  | 
|  | struct C { | 
|  | char c_pre; | 
|  | pod_in_11_only c; | 
|  | char cpad; | 
|  | }; | 
|  |  | 
|  | struct D { | 
|  | char d_pre; | 
|  | pod_in_11_only d; | 
|  | char dpad; | 
|  | }; | 
|  |  | 
|  | struct might_use_tail_padding : public A, public B, public C, public D { | 
|  | char m; | 
|  | }; | 
|  |  | 
|  | SA(0, sizeof(might_use_tail_padding) == 88); | 
|  | } | 
|  |  | 
|  | namespace test12 { | 
|  | struct pod_in_11_only { | 
|  | private: | 
|  | long long x; | 
|  | }; | 
|  |  | 
|  | struct A { | 
|  | pod_in_11_only a __attribute__((aligned(128))); | 
|  | }; | 
|  |  | 
|  | struct B { | 
|  | char bpad; | 
|  | }; | 
|  |  | 
|  | struct C { | 
|  | char cpad; | 
|  | }; | 
|  |  | 
|  | struct D { | 
|  | char dpad; | 
|  | }; | 
|  |  | 
|  | struct might_use_tail_padding : public A, public B, public C, public D { | 
|  | char m; | 
|  | }; | 
|  | SA(0, sizeof(might_use_tail_padding) == 128); | 
|  | } | 
|  |  | 
|  | namespace test13 { | 
|  | struct pod_in_11_only { | 
|  | private: | 
|  | long long x; | 
|  | }; | 
|  |  | 
|  | struct A { | 
|  | pod_in_11_only a; | 
|  | char apad; | 
|  | }; | 
|  |  | 
|  | struct B { | 
|  | }; | 
|  |  | 
|  | struct C { | 
|  | char c_pre; | 
|  | pod_in_11_only c; | 
|  | char cpad; | 
|  | }; | 
|  |  | 
|  | struct D { | 
|  | }; | 
|  |  | 
|  | struct might_use_tail_padding : public A, public B, public C, public D { | 
|  | char m; | 
|  | }; | 
|  | SA(0, sizeof(might_use_tail_padding) == 40); | 
|  | } | 
|  |  | 
|  | namespace test14 { | 
|  | struct pod_in_11_only { | 
|  | private: | 
|  | long long x; | 
|  | }; | 
|  |  | 
|  | struct A { | 
|  | pod_in_11_only a; | 
|  | char apad; | 
|  | }; | 
|  |  | 
|  | struct might_use_tail_padding : public A { | 
|  | struct { | 
|  | int : 0; | 
|  | } x; | 
|  | }; | 
|  | SA(0, sizeof(might_use_tail_padding) == 16); | 
|  | } | 
|  |  | 
|  | namespace test15 { | 
|  | struct pod_in_11_only { | 
|  | private: | 
|  | long long x; | 
|  | }; | 
|  |  | 
|  | struct A { | 
|  | pod_in_11_only a; | 
|  | char apad; | 
|  | }; | 
|  |  | 
|  | struct might_use_tail_padding : public A { | 
|  | struct { | 
|  | char a:1; | 
|  | char b:2; | 
|  | char c:2; | 
|  | char d:2; | 
|  | char e:1; | 
|  | } x; | 
|  | }; | 
|  | SA(0, sizeof(might_use_tail_padding) == 16); | 
|  | } | 
|  |  | 
|  | namespace test16 { | 
|  | struct pod_in_11_only { | 
|  | private: | 
|  | long long x; | 
|  | }; | 
|  |  | 
|  | struct A  { | 
|  | pod_in_11_only a; | 
|  | char apad; | 
|  | }; | 
|  |  | 
|  | struct B { | 
|  | char bpod; | 
|  | pod_in_11_only b; | 
|  | char bpad; | 
|  | }; | 
|  |  | 
|  | struct C : public A, public B { | 
|  | }; | 
|  |  | 
|  | struct D : public C { | 
|  | }; | 
|  |  | 
|  | struct might_use_tail_padding : public D { | 
|  | char m; | 
|  | }; | 
|  | SA(0, sizeof(might_use_tail_padding) == 40); | 
|  | } | 
|  |  | 
|  | namespace test17 { | 
|  | struct pod_in_11_only { | 
|  | private: | 
|  | long long x; | 
|  | }; | 
|  |  | 
|  | struct A { | 
|  | pod_in_11_only a __attribute__((aligned(512))); | 
|  | }; | 
|  |  | 
|  | struct B { | 
|  | char bpad; | 
|  | pod_in_11_only foo; | 
|  | char btail; | 
|  | }; | 
|  |  | 
|  | struct C { | 
|  | char cpad; | 
|  | }; | 
|  |  | 
|  | struct D { | 
|  | char dpad; | 
|  | }; | 
|  |  | 
|  | struct might_use_tail_padding : public A, public B, public C, public D { | 
|  | char a; | 
|  | }; | 
|  | SA(0, sizeof(might_use_tail_padding) == 512); | 
|  | } | 
|  |  | 
|  | namespace test18 { | 
|  | struct pod_in_11_only { | 
|  | private: | 
|  | long long x; | 
|  | }; | 
|  |  | 
|  | struct A  { | 
|  | pod_in_11_only a; | 
|  | char apad; | 
|  | }; | 
|  |  | 
|  | struct B { | 
|  | char bpod; | 
|  | pod_in_11_only b; | 
|  | char bpad; | 
|  | }; | 
|  |  | 
|  | struct A1  { | 
|  | pod_in_11_only a; | 
|  | char apad; | 
|  | }; | 
|  |  | 
|  | struct B1 { | 
|  | char bpod; | 
|  | pod_in_11_only b; | 
|  | char bpad; | 
|  | }; | 
|  |  | 
|  | struct C : public A, public B { | 
|  | }; | 
|  |  | 
|  | struct D : public A1, public B1 { | 
|  | }; | 
|  |  | 
|  | struct E : public D, public C { | 
|  | }; | 
|  |  | 
|  | struct F : public E { | 
|  | }; | 
|  |  | 
|  | struct might_use_tail_padding : public F { | 
|  | char m; | 
|  | }; | 
|  | SA(0, sizeof(might_use_tail_padding) == 80); | 
|  | } | 
|  | } // namespace PR16537 | 
|  |  | 
|  | namespace PR37275 { | 
|  | struct X { char c; }; | 
|  |  | 
|  | struct A { int n; }; | 
|  | _Static_assert(_Alignof(A) == _Alignof(int), ""); | 
|  |  | 
|  | // __attribute__((packed)) does not apply to base classes. | 
|  | struct __attribute__((packed)) B : X, A {}; | 
|  | #if defined(CLANG_ABI_COMPAT) && CLANG_ABI_COMPAT <= 6 | 
|  | _Static_assert(_Alignof(B) == 1, ""); | 
|  | _Static_assert(__builtin_offsetof(B, n) == 1, ""); | 
|  | #else | 
|  | _Static_assert(_Alignof(B) == _Alignof(int), ""); | 
|  | _Static_assert(__builtin_offsetof(B, n) == 4, ""); | 
|  | #endif | 
|  |  | 
|  | // #pragma pack does, though. | 
|  | #pragma pack(push, 2) | 
|  | struct C : X, A {}; | 
|  | _Static_assert(_Alignof(C) == 2, ""); | 
|  | _Static_assert(__builtin_offsetof(C, n) == 2, ""); | 
|  |  | 
|  | struct __attribute__((packed)) D : X, A {}; | 
|  | #if defined(CLANG_ABI_COMPAT) && CLANG_ABI_COMPAT <= 6 | 
|  | _Static_assert(_Alignof(D) == 1, ""); | 
|  | _Static_assert(__builtin_offsetof(D, n) == 1, ""); | 
|  | #else | 
|  | _Static_assert(_Alignof(D) == 2, ""); | 
|  | _Static_assert(__builtin_offsetof(D, n) == 2, ""); | 
|  | #endif | 
|  | #pragma pack(pop) | 
|  | } | 
|  |  | 
|  | #endif // !defined(__MVS__) && !defined(__AIX__) | 
|  |  | 
|  | namespace non_pod { | 
|  | struct t1 { | 
|  | protected: | 
|  | int a; | 
|  | }; | 
|  | // GCC prints warning: ignoring packed attribute because of unpacked non-POD field 't1 t2::v1'` | 
|  | struct t2 { | 
|  | char c1; | 
|  | short s1; | 
|  | char c2; | 
|  | t1 v1; | 
|  | } __attribute__((packed)); | 
|  | #if defined(CLANG_ABI_COMPAT) && CLANG_ABI_COMPAT <= 15 | 
|  | _Static_assert(_Alignof(t1) == 4, ""); | 
|  | _Static_assert(_Alignof(t2) == 1, ""); | 
|  | #else | 
|  | _Static_assert(_Alignof(t1) == 4, ""); | 
|  | _Static_assert(_Alignof(t2) == 4, ""); | 
|  | #endif | 
|  | _Static_assert(sizeof(t2) == 8, ""); // it's still packing the rest of the struct | 
|  | } // namespace non_pod | 
|  |  | 
|  | namespace non_pod_packed { | 
|  | struct t1 { | 
|  | protected: | 
|  | int a; | 
|  | } __attribute__((packed)); | 
|  | struct t2 { | 
|  | t1 v1; | 
|  | } __attribute__((packed)); | 
|  | _Static_assert(_Alignof(t1) == 1, ""); | 
|  | _Static_assert(_Alignof(t2) == 1, ""); | 
|  | } // namespace non_pod_packed | 
|  |  | 
|  | namespace non_pod_packed_packed { | 
|  | struct B { | 
|  | int b; | 
|  | }; | 
|  | struct  FromB : B { | 
|  | } __attribute__((packed)); | 
|  | struct C { | 
|  | char a[3]; | 
|  | FromB b; | 
|  | } __attribute__((packed)); | 
|  | _Static_assert(__builtin_offsetof(C, b) == 3, ""); | 
|  | } | 
|  |  | 
|  | namespace cxx11_pod { | 
|  | struct t1 { | 
|  | t1() = default; | 
|  | t1(const t1&) = delete; | 
|  | ~t1() = delete; | 
|  | t1(t1&&) = default; | 
|  | int a; | 
|  | char c; | 
|  | }; | 
|  | struct t2 { | 
|  | t1 v1; | 
|  | } __attribute__((packed)); | 
|  | #if (defined(CLANG_ABI_COMPAT) && CLANG_ABI_COMPAT <= 15) || !defined(__MVS__) | 
|  | _Static_assert(_Alignof(t2) == 1, ""); | 
|  | #else | 
|  | _Static_assert(_Alignof(t2) == 4, ""); | 
|  | #endif | 
|  | struct t3 : t1 { | 
|  | char c; | 
|  | }; | 
|  | #if (defined(CLANG_ABI_COMPAT) && CLANG_ABI_COMPAT <= 15) || defined(__MVS__) | 
|  | _Static_assert(sizeof(t3) == 8, ""); | 
|  | #else | 
|  | _Static_assert(sizeof(t3) == 12, ""); | 
|  | #endif | 
|  | } |