190 lines · cpp
1// RUN: %clang_cc1 -triple=x86_64-none-none -Wpadded -Wpacked -Wno-padded-bitfield -verify=expected,top %s -emit-llvm-only2// RUN: %clang_cc1 -triple=x86_64-none-none -Wpadded -Wpacked -Wno-padded-bitfield -verify=expected,abi15 -fclang-abi-compat=15 %s -emit-llvm-only3// -Wpacked-non-pod itself should not emit the "packed attribute is unnecessary" warnings.4// RUN: %clang_cc1 -triple=x86_64-none-none -Wpacked-non-pod -verify=top %s -emit-llvm-only5// -Wall should not emit the "packed attribute is unnecessary" warnings without -Wpacked.6// RUN: %clang_cc1 -triple=x86_64-none-none -Wall -verify=top %s -emit-llvm-only7 8 9struct S1 {10 char c;11 short s; // expected-warning {{padding struct 'S1' with 1 byte to align 's'}}12 long l; // expected-warning {{padding struct 'S1' with 4 bytes to align 'l'}}13};14 15struct S2 { // expected-warning {{padding size of 'S2' with 3 bytes to alignment boundary}}16 int i;17 char c;18};19 20struct S3 {21 char c;22 int i;23} __attribute__((packed));24 25struct S4 {26 int i;27 char c;28} __attribute__((packed));29 30struct S5 {31 char c;32 union {33 char c;34 int i;35 } u; // expected-warning {{padding struct 'S5' with 3 bytes to align 'u'}}36};37 38struct S6 { // expected-warning {{padding size of 'S6' with 30 bits to alignment boundary}}39 int i : 2;40};41 42struct S7 { // expected-warning {{padding size of 'S7' with 7 bytes to alignment boundary}}43 char c;44 virtual void m();45};46 47struct B {48 char c;49};50 51struct S8 : B {52 int i; // expected-warning {{padding struct 'S8' with 3 bytes to align 'i'}}53};54 55struct S9 {56 int x;57 int y;58} __attribute__((packed));59 60struct S10 {61 int x;62 char a,b,c,d;63} __attribute__((packed));64 65 66struct S11 { // expected-warning {{packed attribute is unnecessary for 'S11'}}67 bool x;68 char a,b,c,d;69} __attribute__((packed));70 71struct S12 {72 bool b : 1;73 char c; // expected-warning {{padding struct 'S12' with 7 bits to align 'c'}}74};75 76struct S13 { // expected-warning {{padding size of 'S13' with 6 bits to alignment boundary}}77 char c;78 bool b : 10;79};80 81struct S14 { // expected-warning {{packed attribute is unnecessary for 'S14'}}82 char a,b,c,d;83} __attribute__((packed));84 85struct S15 { // expected-warning {{packed attribute is unnecessary for 'S15'}}86 struct S14 s;87 char a;88} __attribute__((packed));89 90struct S16 { // expected-warning {{padding size of 'S16' with 2 bytes to alignment boundary}} expected-warning {{packed attribute is unnecessary for 'S16'}}91 char a,b;92} __attribute__((packed, aligned(4)));93 94struct S17 {95 struct S16 s;96 char a,b;97} __attribute__((packed, aligned(2)));98 99struct S18 { // expected-warning {{padding size of 'S18' with 2 bytes to alignment boundary}} expected-warning {{packed attribute is unnecessary for 'S18'}}100 struct S16 s;101 char a,b;102} __attribute__((packed, aligned(4)));103 104struct S19 { // expected-warning {{packed attribute is unnecessary for 'S19'}}105 bool b;106 char a;107} __attribute__((packed, aligned(1)));108 109struct S20 {110 int i;111 char a;112} __attribute__((packed, aligned(1)));113 114struct S21 { // expected-warning {{padding size of 'S21' with 4 bits to alignment boundary}}115 unsigned char a : 6;116 unsigned char b : 6;117} __attribute__((packed, aligned(1)));118 119struct S22 { // expected-warning {{packed attribute is unnecessary for 'S22'}}120 unsigned char a : 4;121 unsigned char b : 4;122} __attribute__((packed));123 124struct S23 { // expected-warning {{padding size of 'S23' with 4 bits to alignment boundary}} expected-warning {{packed attribute is unnecessary for 'S23'}}125 unsigned char a : 2;126 unsigned char b : 2;127} __attribute__((packed));128 129struct S24 {130 unsigned char a : 6;131 unsigned char b : 6;132 unsigned char c : 6;133 unsigned char d : 6;134 unsigned char e : 6;135 unsigned char f : 6;136 unsigned char g : 6;137 unsigned char h : 6;138} __attribute__((packed));139 140struct S25 { // expected-warning {{padding size of 'S25' with 7 bits to alignment boundary}} expected-warning {{packed attribute is unnecessary for 'S25'}}141 unsigned char a;142 unsigned char b : 1;143} __attribute__((packed));144 145struct S26 { // expected-warning {{packed attribute is unnecessary for 'S26'}}146 unsigned char a : 1;147 unsigned char b; //expected-warning {{padding struct 'S26' with 7 bits to align 'b'}}148} __attribute__((packed));149 150struct S27 { // expected-warning {{padding size of 'S27' with 7 bits to alignment boundary}}151 unsigned char a : 1;152 unsigned char b : 8;153} __attribute__((packed));154 155struct S28_non_pod {156 protected:157 int i;158};159struct S28 {160 char c1;161 short s1;162 char c2;163 S28_non_pod p1; // top-warning {{not packing field 'p1' as it is non-POD for the purposes of layout}}164} __attribute__((packed));165 166struct S29_non_pod_align_1 {167 protected:168 char c;169};170struct S29 {171 S29_non_pod_align_1 p1;172 int i;173} __attribute__((packed)); // no warning174static_assert(alignof(S29) == 1, "");175 176struct S30 {177protected:178 short s;179} __attribute__((packed)); // no warning180struct S30_use { // abi15-warning {{packed attribute is unnecessary for 'S30_use'}}181 char c;182 S30 u;183} __attribute__((packed));184static_assert(sizeof(S30_use) == 3, "");185 186// The warnings are emitted when the layout of the structs is computed, so we have to use them.187void f(S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11, S12, S13,188 S14, S15, S16, S17, S18, S19, S20, S21, S22, S23, S24, S25,189 S26, S27, S28, S29){}190