// 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