| // RUN: %clang_cc1 -triple powerpc-ibm-aix-xcoff -fdump-record-layouts \ |
| // RUN: -fxl-pragma-pack -verify -fsyntax-only -x c++ %s | \ |
| // RUN: FileCheck %s |
| |
| // RUN: %clang_cc1 -triple powerpc64-ibm-aix-xcoff -fdump-record-layouts \ |
| // RUN: -fxl-pragma-pack -verify -fsyntax-only -x c++ %s | \ |
| // RUN: FileCheck %s |
| |
| namespace test1 { |
| #pragma align(natural) |
| #pragma pack(4) |
| #pragma pack(2) |
| struct A { |
| int i; |
| double d; |
| }; |
| |
| int a = sizeof(A); |
| #pragma pack() |
| #pragma pack(show) // expected-warning {{value of #pragma pack(show) == 4}} |
| #pragma pack(pop) |
| #pragma pack(show) // expected-warning {{value of #pragma pack(show) == 8}} |
| struct B { |
| int i; |
| double d; |
| }; |
| #pragma align(reset) |
| |
| int b = sizeof(B); |
| |
| // CHECK: *** Dumping AST Record Layout |
| // CHECK-NEXT: 0 | struct test1::A |
| // CHECK-NEXT: 0 | int i |
| // CHECK-NEXT: 4 | double d |
| // CHECK-NEXT: | [sizeof=12, dsize=12, align=2, preferredalign=2, |
| // CHECK-NEXT: | nvsize=12, nvalign=2, preferrednvalign=2] |
| |
| // CHECK: *** Dumping AST Record Layout |
| // CHECK-NEXT: 0 | struct test1::B |
| // CHECK-NEXT: 0 | int i |
| // CHECK-NEXT: 8 | double d |
| // CHECK-NEXT: | [sizeof=16, dsize=16, align=4, preferredalign=8, |
| // CHECK-NEXT: | nvsize=16, nvalign=4, preferrednvalign=8] |
| |
| } // namespace test1 |
| |
| namespace test2 { |
| #pragma align(natural) |
| #pragma pack(2) |
| struct A { |
| int i; |
| double d; |
| }; |
| |
| int a = sizeof(A); |
| #pragma align(reset) |
| |
| struct B { |
| int i; |
| double d; |
| }; |
| |
| int b = sizeof(B); |
| |
| // CHECK: *** Dumping AST Record Layout |
| // CHECK-NEXT: 0 | struct test2::A |
| // CHECK-NEXT: 0 | int i |
| // CHECK-NEXT: 4 | double d |
| // CHECK-NEXT: | [sizeof=12, dsize=12, align=2, preferredalign=2, |
| // CHECK-NEXT: | nvsize=12, nvalign=2, preferrednvalign=2] |
| |
| // CHECK: *** Dumping AST Record Layout |
| // CHECK-NEXT: 0 | struct test2::B |
| // CHECK-NEXT: 0 | int i |
| // CHECK-NEXT: 4 | double d |
| // CHECK-NEXT: | [sizeof=12, dsize=12, align=4, preferredalign=4, |
| // CHECK-NEXT: | nvsize=12, nvalign=4, preferrednvalign=4] |
| |
| } // namespace test2 |
| |
| namespace test3 { |
| #pragma pack(2) |
| #pragma align(natural) |
| struct A { |
| double d; |
| }; |
| #pragma align(reset) |
| #pragma pack(pop) |
| |
| int a = sizeof(A); |
| |
| // CHECK: *** Dumping AST Record Layout |
| // CHECK-NEXT: 0 | struct test3::A |
| // CHECK-NEXT: 0 | double d |
| // CHECK-NEXT: | [sizeof=8, dsize=8, align=4, preferredalign=8, |
| // CHECK-NEXT: | nvsize=8, nvalign=4, preferrednvalign=8] |
| |
| } // namespace test3 |
| |
| namespace test4 { |
| #pragma pack(2) |
| #pragma align(natural) |
| #pragma pack(pop) |
| |
| struct A { |
| int i; |
| double d; |
| } a; |
| #pragma align(reset) |
| #pragma pack(pop) |
| |
| int i = sizeof(A); |
| |
| // CHECK: *** Dumping AST Record Layout |
| // CHECK-NEXT: 0 | struct test4::A |
| // CHECK-NEXT: 0 | int i |
| // CHECK-NEXT: 8 | double d |
| // CHECK-NEXT: | [sizeof=16, dsize=16, align=4, preferredalign=8, |
| // CHECK-NEXT: | nvsize=16, nvalign=4, preferrednvalign=8] |
| |
| } // namespace test4 |
| |
| namespace test5 { |
| #pragma align(power) |
| #pragma align(natural) |
| #pragma pack(2) |
| #pragma align(reset) |
| struct A { |
| int i; |
| double d; |
| }; |
| #pragma align(reset) |
| |
| int a = sizeof(A); |
| |
| // CHECK: *** Dumping AST Record Layout |
| // CHECK-NEXT: 0 | struct test5::A |
| // CHECK-NEXT: 0 | int i |
| // CHECK-NEXT: 4 | double d |
| // CHECK-NEXT: | [sizeof=12, dsize=12, align=4, preferredalign=4, |
| // CHECK-NEXT: | nvsize=12, nvalign=4, preferrednvalign=4] |
| |
| } // namespace test5 |
| |
| namespace test6 { |
| #pragma align(natural) |
| #pragma pack(0) // expected-error {{expected #pragma pack parameter to be '1', '2', '4', '8', or '16'}} |
| #pragma pack(show) // expected-warning {{value of #pragma pack(show) == 8}} |
| |
| struct A { |
| int i; |
| double d; |
| } a; |
| #pragma align(reset) |
| |
| int i = sizeof(a); |
| |
| // CHECK: *** Dumping AST Record Layout |
| // CHECK-NEXT: 0 | struct test6::A |
| // CHECK-NEXT: 0 | int i |
| // CHECK-NEXT: 8 | double d |
| // CHECK-NEXT: | [sizeof=16, dsize=16, align=4, preferredalign=8, |
| // CHECK-NEXT: | nvsize=16, nvalign=4, preferrednvalign=8] |
| |
| } // namespace test6 |
| |
| namespace test7 { |
| #pragma align = natural // expected-warning {{missing '(' after '#pragma align' - ignoring}} |
| #pragma align(reset) // expected-warning {{#pragma options align=reset failed: stack empty}} |
| } // namespace test7 |
| |
| namespace test8 { |
| #pragma align(packed) |
| #pragma pack(2) |
| #pragma pack(show) // expected-warning {{value of #pragma pack(show) == 2}} |
| struct A { |
| int i; |
| double d; |
| }; |
| #pragma align(reset) |
| |
| int a = sizeof(A); |
| |
| // CHECK: *** Dumping AST Record Layout |
| // CHECK-NEXT: 0 | struct test8::A |
| // CHECK-NEXT: 0 | int i |
| // CHECK-NEXT: 4 | double d |
| // CHECK-NEXT: | [sizeof=12, dsize=12, align=2, preferredalign=2, |
| // CHECK-NEXT: | nvsize=12, nvalign=2, preferrednvalign=2] |
| |
| } // namespace test8 |
| |
| namespace test9 { |
| #pragma pack(push, r1, 2) // expected-error {{specifying an identifier within `#pragma pack` is not supported on this target}} |
| struct A { |
| int i; |
| double d; |
| }; |
| #pragma pack(pop) // expected-warning {{#pragma pack(pop, ...) failed: stack empty}} |
| |
| int a = sizeof(A); |
| |
| // CHECK: *** Dumping AST Record Layout |
| // CHECK-NEXT: 0 | struct test9::A |
| // CHECK-NEXT: 0 | int i |
| // CHECK-NEXT: 4 | double d |
| // CHECK-NEXT: | [sizeof=12, dsize=12, align=4, preferredalign=4, |
| // CHECK-NEXT: | nvsize=12, nvalign=4, preferrednvalign=4] |
| |
| } // namespace test9 |
| |
| namespace test10 { |
| #pragma pack(2) |
| #pragma align(reset) |
| struct A { |
| int i; |
| double d; |
| }; |
| |
| int a = sizeof(A); |
| |
| // CHECK: *** Dumping AST Record Layout |
| // CHECK-NEXT: 0 | struct test10::A |
| // CHECK-NEXT: 0 | int i |
| // CHECK-NEXT: 4 | double d |
| // CHECK-NEXT: | [sizeof=12, dsize=12, align=4, preferredalign=4, |
| // CHECK-NEXT: | nvsize=12, nvalign=4, preferrednvalign=4] |
| |
| } // namespace test10 |