xref: /llvm-project/clang/test/CodeGenCXX/warn-padded-bitfields.cpp (revision 43feb3eeb1ba4de920d6eaa12b7a5c21f6dd6229)
1*43feb3eeSDan Klishch // RUN: %clang_cc1 -triple=x86_64-none-none -Wpadded-bitfield -verify=expected %s -emit-llvm-only
2*43feb3eeSDan Klishch 
3*43feb3eeSDan Klishch struct S1 {
4*43feb3eeSDan Klishch   unsigned a : 1;
5*43feb3eeSDan Klishch   unsigned long long : 0; // expected-warning {{padding struct 'S1' with 63 bits to align anonymous bit-field}}
6*43feb3eeSDan Klishch };
7*43feb3eeSDan Klishch 
8*43feb3eeSDan Klishch struct S2 {
9*43feb3eeSDan Klishch   unsigned a : 1;
10*43feb3eeSDan Klishch   unsigned long long b : 64; // expected-warning {{padding struct 'S2' with 63 bits to align 'b'}}
11*43feb3eeSDan Klishch };
12*43feb3eeSDan Klishch 
13*43feb3eeSDan Klishch struct S3 {
14*43feb3eeSDan Klishch   char a : 1;
15*43feb3eeSDan Klishch   short b : 16; // expected-warning {{padding struct 'S3' with 15 bits to align 'b'}}
16*43feb3eeSDan Klishch };
17*43feb3eeSDan Klishch 
18*43feb3eeSDan Klishch struct [[gnu::packed]] S4 {
19*43feb3eeSDan Klishch   char a : 1;
20*43feb3eeSDan Klishch   short b : 16;
21*43feb3eeSDan Klishch };
22*43feb3eeSDan Klishch 
23*43feb3eeSDan Klishch struct S5 {
24*43feb3eeSDan Klishch   unsigned a : 1;
25*43feb3eeSDan Klishch   unsigned long long b : 63;
26*43feb3eeSDan Klishch };
27*43feb3eeSDan Klishch 
28*43feb3eeSDan Klishch struct S6 {
29*43feb3eeSDan Klishch   unsigned a : 1;
30*43feb3eeSDan Klishch   unsigned long long b;
31*43feb3eeSDan Klishch };
32*43feb3eeSDan Klishch 
33*43feb3eeSDan Klishch struct S7 {
34*43feb3eeSDan Klishch   int word;
35*43feb3eeSDan Klishch   struct {
36*43feb3eeSDan Klishch     int filler __attribute__ ((aligned (8)));
37*43feb3eeSDan Klishch   };
38*43feb3eeSDan Klishch };
39*43feb3eeSDan Klishch 
40*43feb3eeSDan Klishch // The warnings are emitted when the layout of the structs is computed, so we have to use them.
f(S1,S2,S3,S4,S5,S6,S7)41*43feb3eeSDan Klishch void f(S1, S2, S3, S4, S5, S6, S7){}
42