cosmopolitan/third_party/chibicc/test/bitfield_test.c

152 lines
2.7 KiB
C

#include "third_party/chibicc/test/test.h"
#define TYPE_SIGNED(type) (((type)-1) < 0)
struct {
char a;
int b : 5;
int c : 10;
} g45 = {1, 2, 3}, g46 = {};
int main() {
/* NOTE: Consistent w/ GCC (but MSVC would fail this) */
ASSERT(1, 2 == ({
struct {
enum { a, b, c } e : 2;
} x = {
.e = 2,
};
x.e;
}));
/* NOTE: GCC forbids typeof(bitfield). */
ASSERT(0, ({
struct {
enum { a, b, c } e : 2;
} x = {
.e = 2,
};
TYPE_SIGNED(typeof(x.e));
}));
ASSERT(4, sizeof(struct { int x : 1; }));
ASSERT(8, sizeof(struct { long x : 1; }));
struct bit1 {
short a;
char b;
int c : 2;
int d : 3;
int e : 3;
};
ASSERT(4, sizeof(struct bit1));
ASSERT(1, ({
struct bit1 x;
x.a = 1;
x.b = 2;
x.c = 3;
x.d = 4;
x.e = 5;
x.a;
}));
ASSERT(1, ({
struct bit1 x = {1, 2, 3, 4, 5};
x.a;
}));
ASSERT(2, ({
struct bit1 x = {1, 2, 3, 4, 5};
x.b;
}));
ASSERT(-1, ({
struct bit1 x = {1, 2, 3, 4, 5};
x.c;
}));
ASSERT(-4, ({
struct bit1 x = {1, 2, 3, 4, 5};
x.d;
}));
ASSERT(-3, ({
struct bit1 x = {1, 2, 3, 4, 5};
x.e;
}));
ASSERT(1, g45.a);
ASSERT(2, g45.b);
ASSERT(3, g45.c);
ASSERT(0, g46.a);
ASSERT(0, g46.b);
ASSERT(0, g46.c);
typedef struct {
int a : 10;
int b : 10;
int c : 10;
} T3;
ASSERT(1, ({
T3 x = {1, 2, 3};
x.a++;
}));
ASSERT(2, ({
T3 x = {1, 2, 3};
x.b++;
}));
ASSERT(3, ({
T3 x = {1, 2, 3};
x.c++;
}));
ASSERT(2, ({
T3 x = {1, 2, 3};
++x.a;
}));
ASSERT(3, ({
T3 x = {1, 2, 3};
++x.b;
}));
ASSERT(4, ({
T3 x = {1, 2, 3};
++x.c;
}));
ASSERT(4, sizeof(struct {
int a : 3;
int c : 1;
int c : 5;
}));
ASSERT(8, sizeof(struct {
int a : 3;
int : 0;
int c : 5;
}));
ASSERT(4, sizeof(struct {
int a : 3;
int : 0;
}));
typedef struct {
long p : 1;
long a : 40;
long b : 20;
} T4;
ASSERT(0xfffffffffffaaaaa, ({
T4 x = {1, 0x31337313371337, 0xaaaaaaaaaaaaaaaa};
x.b++;
}));
ASSERT(0x7313371337, ({
T4 x = {1, 0x31337313371337, 0xaaaaaaaaaaaaaaaa};
x.a++;
}));
ASSERT(0xffffffffffffffd4, ({
T4 x;
x.b = -44;
x.b++;
}));
return 0;
}