
This just adds a warning for bitfields placed next to other bitfields where the underlying type has different storage. Under the MS struct bitfield packing ABI such bitfields are not packed.
204 lines
3.0 KiB
C
204 lines
3.0 KiB
C
// RUN: %clang_cc1 %s -fsyntax-only -verify -triple=i686-apple-darwin9
|
|
// RUN: %clang_cc1 %s -fsyntax-only -verify -triple=arm-linux-gnueabihf
|
|
// RUN: %clang_cc1 %s -fsyntax-only -verify -triple=aarch64-linux-gnu
|
|
// RUN: %clang_cc1 %s -fsyntax-only -verify -triple=x86_64-pc-linux-gnu
|
|
// RUN: %clang_cc1 %s -fsyntax-only -verify -triple=i686-apple-darwin9 -Wms-bitfield-padding
|
|
// expected-no-diagnostics
|
|
|
|
#define CHECK_SIZE(name, size) \
|
|
extern int name##_1[sizeof(name) == size ? 1 : -1];
|
|
|
|
|
|
struct __attribute__((packed)) {
|
|
int a;
|
|
int b : 4;
|
|
int c : 32;
|
|
} s0;
|
|
CHECK_SIZE(s0,9)
|
|
|
|
#pragma pack (1)
|
|
struct {
|
|
int a;
|
|
int b : 4;
|
|
int c : 32;
|
|
} s1;
|
|
CHECK_SIZE(s1,9)
|
|
|
|
#pragma pack (2)
|
|
struct {
|
|
int a;
|
|
int b : 4;
|
|
int c : 32;
|
|
} s2;
|
|
CHECK_SIZE(s2,10)
|
|
|
|
#pragma pack (2)
|
|
struct __attribute__((packed)) {
|
|
int a;
|
|
int b : 4;
|
|
int c : 32;
|
|
} s3;
|
|
CHECK_SIZE(s3,10)
|
|
|
|
#pragma pack (4)
|
|
struct __attribute__((packed)) {
|
|
int a;
|
|
int b : 4;
|
|
int c : 32;
|
|
} s4;
|
|
CHECK_SIZE(s4,12)
|
|
|
|
#pragma pack (16)
|
|
struct {
|
|
int a;
|
|
int __attribute__((packed)) b : 4;
|
|
int __attribute__((packed)) c : 32;
|
|
} s41;
|
|
CHECK_SIZE(s41,12)
|
|
|
|
#pragma pack (16)
|
|
struct {
|
|
int a;
|
|
int b : 4;
|
|
int c : 32;
|
|
} s5;
|
|
CHECK_SIZE(s5,12)
|
|
|
|
#pragma pack (1)
|
|
struct __attribute__((aligned(4))) {
|
|
int a;
|
|
int b : 4;
|
|
int c : 32;
|
|
} s6;
|
|
CHECK_SIZE(s6,12)
|
|
|
|
#pragma pack (2)
|
|
struct {
|
|
char a;
|
|
int b : 4;
|
|
int c : 32;
|
|
char s;
|
|
} s7;
|
|
CHECK_SIZE(s7,8)
|
|
|
|
#pragma pack (1)
|
|
struct {
|
|
char a;
|
|
int b : 4;
|
|
int c : 28;
|
|
char s;
|
|
} s8;
|
|
CHECK_SIZE(s8,6)
|
|
|
|
#pragma pack (8)
|
|
struct {
|
|
char a;
|
|
int b : 4;
|
|
int c : 28;
|
|
char s;
|
|
} s9;
|
|
CHECK_SIZE(s9,8)
|
|
|
|
#pragma pack (8)
|
|
struct {
|
|
char a;
|
|
char s;
|
|
} s10;
|
|
CHECK_SIZE(s10,2)
|
|
|
|
#pragma pack(4)
|
|
struct {
|
|
char a;
|
|
int b : 4;
|
|
int c : 28;
|
|
char s1;
|
|
char s2;
|
|
char s3;
|
|
} s11;
|
|
CHECK_SIZE(s11,8)
|
|
|
|
#pragma pack(4)
|
|
struct {
|
|
short s1;
|
|
int a1 : 17;
|
|
int a2 : 17;
|
|
int a3 : 30;
|
|
short s2;
|
|
} s12;
|
|
CHECK_SIZE(s12,12)
|
|
|
|
#pragma pack(4)
|
|
struct {
|
|
char c1;
|
|
int i1 : 17;
|
|
int i2 : 17;
|
|
int i3 : 30;
|
|
char c2;
|
|
} s13;
|
|
CHECK_SIZE(s13,12)
|
|
|
|
#pragma pack(2)
|
|
struct {
|
|
char a;
|
|
int s;
|
|
} s14;
|
|
CHECK_SIZE(s14,6)
|
|
|
|
#pragma pack(4)
|
|
struct {
|
|
char a;
|
|
short s;
|
|
} s15;
|
|
CHECK_SIZE(s15,4)
|
|
|
|
#pragma pack(2)
|
|
struct {
|
|
char a;
|
|
int b : 4;
|
|
int c : 28;
|
|
char s1;
|
|
char s2;
|
|
char s3;
|
|
} s16;
|
|
CHECK_SIZE(s16,8)
|
|
|
|
#pragma pack (16)
|
|
struct {
|
|
int __attribute__((packed)) a;
|
|
int __attribute__((packed)) b : 4;
|
|
int __attribute__((packed)) c : 32;
|
|
} s17;
|
|
CHECK_SIZE(s17,12)
|
|
|
|
#pragma pack (16)
|
|
struct {
|
|
int __attribute__((aligned(8))) a;
|
|
int __attribute__((aligned(8))) b : 4;
|
|
int __attribute__((aligned(8))) c : 32;
|
|
} s18;
|
|
CHECK_SIZE(s18,24)
|
|
|
|
#pragma pack (16)
|
|
struct {
|
|
int __attribute__((aligned(1))) a;
|
|
int __attribute__((aligned(1))) b : 4;
|
|
int __attribute__((aligned(1))) c : 32;
|
|
} s19;
|
|
CHECK_SIZE(s19,12)
|
|
|
|
#pragma pack (1)
|
|
struct __attribute__((aligned(8))) {
|
|
int a;
|
|
int b : 4;
|
|
int c : 32;
|
|
} s20;
|
|
CHECK_SIZE(s20,16)
|
|
|
|
#pragma pack (2)
|
|
struct {
|
|
int __attribute__((aligned(8))) a;
|
|
int __attribute__((aligned(8))) b : 4;
|
|
int __attribute__((aligned(8))) c : 32;
|
|
} s21;
|
|
CHECK_SIZE(s21,10)
|