shithub: scc

Download patch

ref: 5847b49f8a3226cd00215890fbf40278138d5c23
parent: fb8c741117159163641f0bea9509b64e4d6c73e7
author: FRIGN <dev@frign.de>
date: Wed May 18 08:15:52 EDT 2016

Replace struct type bitfield with enum-bitflags

This simplifies the code in many places. Also update tests to
reflect prior changes.

"La noche es la mejor representación de la infinitud del universo. Nos
hace creer que nada tiene principio y nada, fin."
   - Carlos Fuentes

--- a/cc1/arch/amd64-sysv/arch.c
+++ b/cc1/arch/amd64-sysv/arch.c
@@ -17,212 +17,155 @@
 	{       /* 0 = voidtype */
 		.op = VOID,
 		.letter = L_VOID,
-		.printed = 1
+		.prop = TPRINTED,
 	},
 	{       /* 1 = pvoidtype */
 		.op = PTR,
 		.letter = L_POINTER,
+		.prop = TPRINTED | TDEFINED,
 		.size = 2,
 		.align = 2,
-		.printed = 1,
-		.defined = 1,
 	},
 	{      /* 2 = booltype */
 		.op = INT,
 		.letter = L_BOOL,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TPRINTED,
 		.size = 1,
-		.integer = 1,
-		.arith = 1,
 		.align = 1,
 		.n.rank = RANK_BOOL,
-		.printed = 1
 	},
 	{       /* 3 = schartype */
 		.op = INT,
 		.letter = L_INT8,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TSIGNED | TPRINTED,
 		.size = 1,
-		.integer = 1,
-		.arith = 1,
 		.align = 1,
-		.sign = 1,
 		.n.rank = RANK_SCHAR,
-		.printed = 1
 	},
 	{      /* 4 = uchartype */
 		.op = INT,
 		.letter = L_UINT8,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TPRINTED,
 		.size = 1,
-		.integer = 1,
-		.arith = 1,
 		.align = 1,
 		.n.rank = RANK_UCHAR,
-		.printed = 1
 	},
 	{      /* 5 = chartype */
 		.op = INT,
 		.letter = L_INT8,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TSIGNED | TPRINTED,
 		.size = 1,
-		.integer = 1,
-		.arith = 1,
 		.align = 1,
-		.sign = 1,
 		.n.rank = RANK_CHAR,
-		.printed = 1
 	},
 	{       /* 6 = ushortype */
 		.op = INT,
 		.letter = L_UINT16,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TPRINTED,
 		.size = 2,
-		.integer = 1,
-		.arith = 1,
 		.align = 2,
 		.n.rank = RANK_USHORT,
-		.printed = 1
 	},
 	{       /* 7 = shortype */
 		.op = INT,
 		.letter = L_INT16,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TSIGNED | TPRINTED,
 		.size = 2,
-		.integer = 1,
-		.arith = 1,
 		.align = 2,
-		.sign = 1,
 		.n.rank = RANK_SHORT,
-		.printed = 1
 	},
 	{       /* 8 = uinttype */
 		.op = INT,
 		.letter = L_UINT32,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TPRINTED,
 		.size = 4,
-		.integer = 1,
-		.arith = 1,
 		.align = 4,
 		.n.rank = RANK_UINT,
-		.printed = 1
 	},
 	{       /* 9 = inttype */
 		.op = INT,
 		.letter = L_INT32,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TSIGNED | TPRINTED,
 		.size = 4,
-		.integer = 1,
-		.arith = 1,
 		.align = 4,
-		.sign = 1,
 		.n.rank = RANK_INT,
-		.printed = 1
 	},
 	{      /* 10 = longtype */
 		.op = INT,
 		.letter = L_INT64,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TSIGNED | TPRINTED,
 		.size = 8,
-		.integer = 1,
-		.arith = 1,
 		.align = 8,
-		.sign = 1,
 		.n.rank = RANK_LONG,
-		.printed = 1
 	},
 	{       /* 11 = ulongtype */
 		.op = INT,
 		.letter = L_UINT64,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TPRINTED,
 		.size = 8,
-		.integer = 1,
-		.arith = 1,
 		.align = 8,
 		.n.rank = RANK_ULONG,
-		.printed = 1
 	},
 	{	/* 12 = ullongtype */
 		.op = INT,
 		.letter = L_UINT64,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TPRINTED,
 		.size = 8,
-		.integer = 1,
-		.arith = 1,
 		.align = 8,
 		.n.rank = RANK_ULLONG,
-		.printed = 1
 	},
 	{       /* 13 = llongtype */
 		.op = INT,
 		.letter = L_INT64,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TSIGNED | TPRINTED,
 		.size = 8,
-		.integer = 1,
-		.arith = 1,
 		.align = 8,
-		.sign = 1,
 		.n.rank = RANK_LLONG,
-		.printed = 1
 	},
 	{       /* 14 = floattype */
 		.op = FLOAT,
 		.letter = L_FLOAT,
-		.defined = 1,
+		.prop = TDEFINED | TARITH | TPRINTED,
 		.size = 4,
-		.arith = 1,
 		.align = 4,
 		.n.rank = RANK_FLOAT,
-		.printed = 1
 	},
 	{       /* 15 = doubletype */
 		.op = FLOAT,
 		.letter = L_DOUBLE,
-		.defined = 1,
+		.prop = TDEFINED | TARITH | TPRINTED,
 		.size = 8,
-		.arith = 1,
 		.align = 8,
 		.n.rank = RANK_DOUBLE,
-		.printed = 1
 	},
 	{       /* 16 = ldoubletype */
 		.op = FLOAT,
 		.letter = L_LDOUBLE,
-		.defined = 1,
+		.prop = TDEFINED | TARITH | TPRINTED,
 		.size = 16,
-		.arith = 1,
 		.align = 16,
 		.n.rank = RANK_LDOUBLE,
-		.printed = 1
 	},
 	{       /* 17 = sizettype */
 		.op = INT,
 		.letter = L_UINT32,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TPRINTED,
 		.size = 8,
-		.integer = 1,
-		.arith = 1,
 		.align = 8,
 		.n.rank = RANK_UINT,
-		.printed = 1
 	},
 	{      /* 18 = ellipsis */
 		.op = ELLIPSIS,
 		.letter = L_ELLIPSIS,
-		.defined = 1,
-		.printed = 1
+		.prop = TDEFINED | TPRINTED,
 	},
 	{      /* 19 = pdifftype */
 		.op = INT,
 		.letter = L_INT64,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TSIGNED | TPRINTED,
 		.size = 8,
-		.integer = 1,
-		.arith = 1,
 		.align = 8,
-		.sign = 1,
 		.n.rank = RANK_LONG,
-		.printed = 1
 	},
 };
 
--- a/cc1/arch/i386-sysv/arch.c
+++ b/cc1/arch/i386-sysv/arch.c
@@ -17,212 +17,155 @@
 	{       /* 0 = voidtype */
 		.op = VOID,
 		.letter = L_VOID,
-		.printed = 1
+		.prop = TPRINTED,
 	},
 	{       /* 1 = pvoidtype */
 		.op = PTR,
 		.letter = L_POINTER,
+		.prop = TDEFINED | TPRINTED,
 		.size = 4,
 		.align = 4,
-		.printed = 1,
-		.defined = 1,
 	},
 	{      /* 2 = booltype */
 		.op = INT,
 		.letter = L_BOOL,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TPRINTED,
 		.size = 1,
-		.integer = 1,
-		.arith = 1,
 		.align = 1,
 		.n.rank = RANK_BOOL,
-		.printed = 1
 	},
 	{       /* 3 = schartype */
 		.op = INT,
 		.letter = L_INT8,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TSIGNED | TPRINTED,
 		.size = 1,
-		.integer = 1,
-		.arith = 1,
 		.align = 1,
-		.sign = 1,
 		.n.rank = RANK_SCHAR,
-		.printed = 1
 	},
 	{      /* 4 = uchartype */
 		.op = INT,
 		.letter = L_UINT8,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TPRINTED,
 		.size = 1,
-		.integer = 1,
-		.arith = 1,
 		.align = 1,
 		.n.rank = RANK_UCHAR,
-		.printed = 1
 	},
 	{      /* 5 = chartype */
 		.op = INT,
 		.letter = L_INT8,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TSIGNED | TPRINTED,
 		.size = 1,
-		.integer = 1,
-		.arith = 1,
 		.align = 1,
-		.sign = 1,
 		.n.rank = RANK_CHAR,
-		.printed = 1
 	},
 	{       /* 6 = ushortype */
 		.op = INT,
 		.letter = L_UINT16,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TPRINTED,
 		.size = 2,
-		.integer = 1,
-		.arith = 1,
 		.align = 2,
 		.n.rank = RANK_USHORT,
-		.printed = 1
 	},
 	{       /* 7 = shortype */
 		.op = INT,
 		.letter = L_INT16,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TSIGNED | TPRINTED,
 		.size = 2,
-		.integer = 1,
-		.arith = 1,
 		.align = 2,
-		.sign = 1,
 		.n.rank = RANK_SHORT,
-		.printed = 1
 	},
 	{       /* 8 = uinttype */
 		.op = INT,
 		.letter = L_UINT32,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TPRINTED,
 		.size = 4,
-		.integer = 1,
-		.arith = 1,
 		.align = 4,
 		.n.rank = RANK_UINT,
-		.printed = 1
 	},
 	{       /* 9 = inttype */
 		.op = INT,
 		.letter = L_INT32,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TSIGNED | TPRINTED,
 		.size = 4,
-		.integer = 1,
-		.arith = 1,
 		.align = 4,
-		.sign = 1,
 		.n.rank = RANK_INT,
-		.printed = 1
 	},
 	{      /* 10 = longtype */
 		.op = INT,
 		.letter = L_INT32,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TSIGNED | TPRINTED,
 		.size = 4,
-		.integer = 1,
-		.arith = 1,
 		.align = 4,
-		.sign = 1,
 		.n.rank = RANK_LONG,
-		.printed = 1
 	},
 	{       /* 11 = ulongtype */
 		.op = INT,
 		.letter = L_UINT32,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TPRINTED,
 		.size = 4,
-		.integer = 1,
-		.arith = 1,
 		.align = 4,
 		.n.rank = RANK_ULONG,
-		.printed = 1
 	},
 	{	/* 12 = ullongtype */
 		.op = INT,
 		.letter = L_UINT64,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TPRINTED,
 		.size = 8,
-		.integer = 1,
-		.arith = 1,
 		.align = 4,
 		.n.rank = RANK_ULLONG,
-		.printed = 1
 	},
 	{       /* 13 = llongtype */
 		.op = INT,
 		.letter = L_INT64,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TSIGNED | TPRINTED,
 		.size = 8,
-		.integer = 1,
-		.arith = 1,
 		.align = 4,
-		.sign = 1,
 		.n.rank = RANK_LLONG,
-		.printed = 1
 	},
 	{       /* 14 = floattype */
 		.op = FLOAT,
 		.letter = L_FLOAT,
-		.defined = 1,
+		.prop = TDEFINED | TARITH | TPRINTED,
 		.size = 4,
-		.arith = 1,
 		.align = 4,
 		.n.rank = RANK_FLOAT,
-		.printed = 1
 	},
 	{       /* 15 = doubletype */
 		.op = FLOAT,
 		.letter = L_DOUBLE,
-		.defined = 1,
+		.prop = TDEFINED | TARITH | TPRINTED,
 		.size = 8,
-		.arith = 1,
 		.align = 4,
 		.n.rank = RANK_DOUBLE,
-		.printed = 1
 	},
 	{       /* 16 = ldoubletype */
 		.op = FLOAT,
 		.letter = L_LDOUBLE,
-		.defined = 1,
+		.prop = TDEFINED | TARITH | TPRINTED,
 		.size = 12,
-		.arith = 1,
 		.align = 4,
 		.n.rank = RANK_LDOUBLE,
-		.printed = 1
 	},
 	{       /* 17 = sizettype */
 		.op = INT,
 		.letter = L_UINT32,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TPRINTED,
 		.size = 4,
-		.integer = 1,
-		.arith = 1,
 		.align = 4,
 		.n.rank = RANK_UINT,
-		.printed = 1
 	},
 	{      /* 18 = ellipsis */
 		.op = ELLIPSIS,
 		.letter = L_ELLIPSIS,
-		.defined = 1,
-		.printed = 1
+		.prop = TDEFINED | TPRINTED,
 	},
 	{       /* 19 = pdifftype */
 		.op = INT,
 		.letter = L_INT32,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TSIGNED | TPRINTED,
 		.size = 4,
-		.integer = 1,
-		.arith = 1,
 		.align = 4,
-		.sign = 1,
 		.n.rank = RANK_INT,
-		.printed = 1
 	},
 };
 
--- a/cc1/arch/qbe/arch.c
+++ b/cc1/arch/qbe/arch.c
@@ -17,212 +17,155 @@
 	{       /* 0 = voidtype */
 		.op = VOID,
 		.letter = L_VOID,
-		.printed = 1
+		.prop = TPRINTED,
 	},
 	{       /* 1 = pvoidtype */
 		.op = PTR,
 		.letter = L_POINTER,
+		.prop = TDEFINED | TPRINTED,
 		.size = 2,
 		.align = 2,
-		.printed = 1,
-		.defined = 1,
 	},
 	{      /* 2 = booltype */
 		.op = INT,
 		.letter = L_BOOL,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TPRINTED,
 		.size = 1,
-		.integer = 1,
-		.arith = 1,
 		.align = 1,
 		.n.rank = RANK_BOOL,
-		.printed = 1
 	},
 	{       /* 3 = schartype */
 		.op = INT,
 		.letter = L_INT8,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | SIGNED | TPRINTED,
 		.size = 1,
-		.integer = 1,
-		.arith = 1,
 		.align = 1,
-		.sign = 1,
 		.n.rank = RANK_SCHAR,
-		.printed = 1
 	},
 	{      /* 4 = uchartype */
 		.op = INT,
 		.letter = L_UINT8,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TPRINTED,
 		.size = 1,
-		.integer = 1,
-		.arith = 1,
 		.align = 1,
 		.n.rank = RANK_UCHAR,
-		.printed = 1
 	},
 	{      /* 5 = chartype */
 		.op = INT,
 		.letter = L_INT8,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TSIGNED | TPRINTED,
 		.size = 1,
-		.integer = 1,
-		.arith = 1,
 		.align = 1,
-		.sign = 1,
 		.n.rank = RANK_CHAR,
-		.printed = 1
 	},
 	{       /* 6 = ushortype */
 		.op = INT,
 		.letter = L_UINT16,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TPRINTED,
 		.size = 2,
-		.integer = 1,
-		.arith = 1,
 		.align = 2,
 		.n.rank = RANK_USHORT,
-		.printed = 1
 	},
 	{       /* 7 = shortype */
 		.op = INT,
 		.letter = L_INT16,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TSIGNED | TPRINTED,
 		.size = 2,
-		.integer = 1,
-		.arith = 1,
 		.align = 2,
-		.sign = 1,
 		.n.rank = RANK_SHORT,
-		.printed = 1
 	},
 	{       /* 8 = uinttype */
 		.op = INT,
 		.letter = L_UINT32,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TPRINTED,
 		.size = 4,
-		.integer = 1,
-		.arith = 1,
 		.align = 4,
 		.n.rank = RANK_UINT,
-		.printed = 1
 	},
 	{       /* 9 = inttype */
 		.op = INT,
 		.letter = L_INT32,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TSIGNED | TPRINTED,
 		.size = 4,
-		.integer = 1,
-		.arith = 1,
 		.align = 4,
-		.sign = 1,
 		.n.rank = RANK_INT,
-		.printed = 1
 	},
 	{      /* 10 = longtype */
 		.op = INT,
 		.letter = L_INT64,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TSIGNED | TPRINTED,
 		.size = 8,
-		.integer = 1,
-		.arith = 1,
 		.align = 8,
-		.sign = 1,
 		.n.rank = RANK_LONG,
-		.printed = 1
 	},
 	{       /* 11 = ulongtype */
 		.op = INT,
 		.letter = L_UINT64,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TPRINTED,
 		.size = 8,
-		.integer = 1,
-		.arith = 1,
 		.align = 8,
 		.n.rank = RANK_ULONG,
-		.printed = 1
 	},
 	{	/* 12 = ullongtype */
 		.op = INT,
 		.letter = L_UINT64,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TPRINTED,
 		.size = 8,
-		.integer = 1,
-		.arith = 1,
 		.align = 8,
 		.n.rank = RANK_ULLONG,
-		.printed = 1
 	},
 	{       /* 13 = llongtype */
 		.op = INT,
 		.letter = L_INT64,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TSIGNED | TPRINTED,
 		.size = 8,
-		.integer = 1,
-		.arith = 1,
 		.align = 8,
-		.sign = 1,
 		.n.rank = RANK_LLONG,
-		.printed = 1
 	},
 	{       /* 14 = floattype */
 		.op = FLOAT,
 		.letter = L_FLOAT,
-		.defined = 1,
+		.prop = TDEFINED | TARITH | TPRINTED,
 		.size = 4,
-		.arith = 1,
 		.align = 4,
 		.n.rank = RANK_FLOAT,
-		.printed = 1
 	},
 	{       /* 15 = doubletype */
 		.op = FLOAT,
 		.letter = L_DOUBLE,
-		.defined = 1,
+		.prop = TDEFINED | TARITH | TPRINTED,
 		.size = 8,
-		.arith = 1,
 		.align = 8,
 		.n.rank = RANK_DOUBLE,
-		.printed = 1
 	},
 	{       /* 16 = ldoubletype */
 		.op = FLOAT,
 		.letter = L_LDOUBLE,
-		.defined = 1,
+		.prop = TDEFINED | TARITH | TPRINTED,
 		.size = 16,
-		.arith = 1,
 		.align = 16,
 		.n.rank = RANK_LDOUBLE,
-		.printed = 1
 	},
 	{       /* 17 = sizettype */
 		.op = INT,
 		.letter = L_UINT32,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TPRINTED,
 		.size = 8,
-		.integer = 1,
-		.arith = 1,
 		.align = 8,
 		.n.rank = RANK_UINT,
-		.printed = 1
 	},
 	{      /* 18 = ellipsis */
 		.op = ELLIPSIS,
 		.letter = L_ELLIPSIS,
-		.defined = 1,
-		.printed = 1
+		.prop = TDEFINED | TPRINTED,
 	},
 	{      /* 19 = pdifftype */
 		.op = INT,
 		.letter = L_INT64,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TSIGNED | TPRINTED,
 		.size = 8,
-		.integer = 1,
-		.arith = 1,
 		.align = 8,
-		.sign = 1,
 		.n.rank = RANK_LONG,
-		.printed = 1
 	},
 };
 
--- a/cc1/arch/z80/arch.c
+++ b/cc1/arch/z80/arch.c
@@ -17,212 +17,155 @@
 	{       /* 0 = voidtype */
 		.op = VOID,
 		.letter = L_VOID,
-		.printed = 1
+		.prop = TPRINTED,
 	},
 	{       /* 1 = pvoidtype */
 		.op = PTR,
 		.letter = L_POINTER,
+		.prop = TDEFINED | TPRINTED,
 		.size = 2,
 		.align = 2,
-		.printed = 1,
-		.defined = 1,
 	},
 	{      /* 2 = booltype */
 		.op = INT,
 		.letter = L_BOOL,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TPRINTED,
 		.size = 1,
-		.integer = 1,
-		.arith = 1,
 		.align = 1,
 		.n.rank = RANK_BOOL,
-		.printed = 1
 	},
 	{       /* 3 = schartype */
 		.op = INT,
 		.letter = L_INT8,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TSIGNED | TPRINTED,
 		.size = 1,
-		.integer = 1,
-		.arith = 1,
 		.align = 1,
-		.sign = 1,
 		.n.rank = RANK_SCHAR,
-		.printed = 1
 	},
 	{      /* 4 = uchartype */
 		.op = INT,
 		.letter = L_UINT8,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TPRINTED,
 		.size = 1,
-		.integer = 1,
-		.arith = 1,
 		.align = 1,
 		.n.rank = RANK_UCHAR,
-		.printed = 1
 	},
 	{      /* 5 = chartype */
 		.op = INT,
 		.letter = L_UINT8,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TSIGNED | TPRINTED,
 		.size = 1,
-		.integer = 1,
-		.arith = 1,
 		.align = 1,
-		.sign = 1,
 		.n.rank = RANK_CHAR,
-		.printed = 1
 	},
 	{       /* 6 = ushortype */
 		.op = INT,
 		.letter = L_UINT16,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TPRINTED,
 		.size = 2,
-		.integer = 1,
-		.arith = 1,
 		.align = 1,
 		.n.rank = RANK_USHORT,
-		.printed = 1
 	},
 	{       /* 7 = shortype */
 		.op = INT,
 		.letter = L_INT16,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TSIGNED | TPRINTED,
 		.size = 2,
-		.integer = 1,
-		.arith = 1,
 		.align = 1,
-		.sign = 1,
 		.n.rank = RANK_SHORT,
-		.printed = 1
 	},
 	{       /* 8 = uinttype */
 		.op = INT,
 		.letter = L_UINT16,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TPRINTED,
 		.size = 2,
-		.integer = 1,
-		.arith = 1,
 		.align = 1,
 		.n.rank = RANK_UINT,
-		.printed = 1
 	},
 	{       /* 9 = inttype */
 		.op = INT,
 		.letter = L_INT16,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TSIGNED | TPRINTED,
 		.size = 2,
-		.integer = 1,
-		.arith = 1,
 		.align = 1,
-		.sign = 1,
 		.n.rank = RANK_INT,
-		.printed = 1
 	},
 	{      /* 10 = longtype */
 		.op = INT,
 		.letter = L_INT32,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TSIGNED | TPRINTED,
 		.size = 4,
-		.integer = 1,
-		.arith = 1,
 		.align = 1,
-		.sign = 1,
 		.n.rank = RANK_LONG,
-		.printed = 1
 	},
 	{       /* 11 = ulongtype */
 		.op = INT,
 		.letter = L_UINT32,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TPRINTED,
 		.size = 4,
-		.integer = 1,
-		.arith = 1,
 		.align = 1,
 		.n.rank = RANK_ULONG,
-		.printed = 1
 	},
 	{	/* 12 = ullongtype */
 		.op = INT,
 		.letter = L_UINT64,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TPRINTED,
 		.size = 8,
-		.integer = 1,
-		.arith = 1,
 		.align = 1,
 		.n.rank = RANK_ULLONG,
-		.printed = 1
 	},
 	{       /* 13 = llongtype */
 		.op = INT,
 		.letter = L_INT64,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TSIGNED | TPRINTED,
 		.size = 8,
-		.integer = 1,
-		.arith = 1,
 		.align = 1,
-		.sign = 1,
 		.n.rank = RANK_LLONG,
-		.printed = 1
 	},
 	{       /* 14 = floattype */
 		.op = FLOAT,
 		.letter = L_FLOAT,
-		.defined = 1,
+		.prop = TDEFINED | TARITH | TPRINTED,
 		.size = 4,
-		.arith = 1,
 		.align = 1,
 		.n.rank = RANK_FLOAT,
-		.printed = 1
 	},
 	{       /* 15 = doubletype */
 		.op = FLOAT,
 		.letter = L_DOUBLE,
-		.defined = 1,
+		.prop = TDEFINED | TARITH | TPRINTED,
 		.size = 8,
-		.arith = 1,
 		.align = 1,
 		.n.rank = RANK_DOUBLE,
-		.printed = 1
 	},
 	{       /* 16 = ldoubletype */
 		.op = FLOAT,
 		.letter = L_LDOUBLE,
-		.defined = 1,
+		.prop = TDEFINED | TARITH | TPRINTED,
 		.size = 16,
-		.arith = 1,
 		.align = 1,
 		.n.rank = RANK_LDOUBLE,
-		.printed = 1
 	},
 	{       /* 17 = sizettype */
 		.op = INT,
 		.letter = L_UINT16,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TPRINTED,
 		.size = 2,
-		.integer = 1,
-		.arith = 1,
 		.align = 1,
 		.n.rank = RANK_UINT,
-		.printed = 1
 	},
 	{      /* 18 = ellipsis */
 		.op = ELLIPSIS,
 		.letter = L_ELLIPSIS,
-		.defined = 1,
-		.printed = 1
+		.prop = TDEFINED | TPRINTED,
 	},
 	{       /* 7 = pdifftype */
 		.op = INT,
 		.letter = L_INT16,
-		.defined = 1,
+		.prop = TDEFINED | TINTEGER | TARITH | TSIGNED | TPRINTED,
 		.size = 2,
-		.integer = 1,
-		.arith = 1,
 		.align = 1,
-		.sign = 1,
 		.n.rank = RANK_SHORT,
-		.printed = 1
 	},
 };
 
--- a/cc1/cc1.h
+++ b/cc1/cc1.h
@@ -30,18 +30,22 @@
 	unsigned char token, value;
 };
 
+enum typeprops {
+	TDEFINED = 1 << 0,    /* type defined */
+	TSIGNED  = 1 << 1,    /* signedness of the type */
+	TPRINTED = 1 << 2,    /* the type was already printed */
+	TINTEGER = 1 << 3,    /* the type is INT of enum */
+	TARITH   = 1 << 4,    /* the type is INT, ENUM or FLOAT */
+	TAGGREG  = 1 << 5,    /* the type is struct or union */
+	TK_R     = 1 << 6,    /* this is a K&R-function */
+};
+
 struct type {
 	unsigned char op;           /* type builder operator */
 	char ns;                    /* namespace for struct members */
 	short id;                   /* type id, used in dcls */
 	char letter;                /* letter of the type */
-	bool defined : 1;           /* type defined */
-	bool sign : 1;              /* signess of the type */
-	bool printed : 1;           /* the type already was printed */
-	bool integer : 1;           /* this type is INT or enum */
-	bool arith : 1;             /* this type is INT, ENUM, FLOAT */
-	bool aggreg : 1;            /* this type is struct or union */
-	bool k_r : 1;               /* This is a k&r function */
+	enum typeprops prop;        /* type properties */
 	TSIZE size;                 /* sizeof the type */
 	TSIZE align;                /* align of the type */
 	Type *type;                 /* base type */
--- a/cc1/code.c
+++ b/cc1/code.c
@@ -194,7 +194,7 @@
 	case PTR:
 	case INT:
 	case ENUM:
-		u = (tp->sign) ? (TUINT) sym->u.i : sym->u.u;
+		u = (tp->prop & TSIGNED) ? (TUINT) sym->u.i : sym->u.u;
 		printf("#%c%llX",
 		       np->type->letter,
 		       (long long) sym->u.i & ones(tp->size));
@@ -240,9 +240,9 @@
 	Symbol **sp;
 	char *tag;
 
-	if (tp->printed || !tp->defined)
+	if ((tp->prop & TPRINTED) || !(tp->prop & TDEFINED))
 		return;
-	tp->printed = 1;
+	tp->prop |= TPRINTED;
 
 	switch (tp->op) {
 	case ARY:
--- a/cc1/decl.c
+++ b/cc1/decl.c
@@ -160,7 +160,7 @@
 
 	switch (tp->op) {
 	case VOID:
-		if (n != 0 || funtp->k_r) {
+		if (n != 0 || (funtp->prop & TK_R)) {
 			errorp("incorrect void parameter");
 			return NULL;
 		}
@@ -177,11 +177,11 @@
 	}
 	if (!empty(sym, tp)) {
 		Symbol *p = install(NS_IDEN, sym);
-		if (!p && !funtp->k_r) {
+		if (!p && !(funtp->prop & TK_R)) {
 			errorp("redefinition of parameter '%s'", name);
 			return NULL;
 		}
-		if (p && funtp->k_r) {
+		if (p && (funtp->prop & TK_R)) {
 			errorp("declaration for parameter ‘%s’ but no such parameter",
 			       sym->name);
 			return NULL;
@@ -287,7 +287,7 @@
 	pushctx();
 	expect('(');
 	type.n.elem = 0;
-	type.k_r = 0;
+	type.prop = 0;
 
 	k_r = (yytoken == ')' || yytoken == IDEN);
 	(*(k_r ? krfun : ansifun))(&type, types, syms, &ntypes, &nsyms);
@@ -518,9 +518,9 @@
 		return tp;
 	}
 
-	if (tp->defined)
+	if (tp->prop & TDEFINED)
 		error("redefinition of struct/union '%s'", sym->name);
-	tp->defined = 1;
+	tp->prop |= TDEFINED;
 
 	if (nested == NR_STRUCT_LEVEL)
 		error("too many levels of nested structure or union definitions");
@@ -551,9 +551,9 @@
 
 	if (!accept('{'))
 		goto restore_name;
-	if (tp->defined)
+	if (tp->prop & TDEFINED)
 		errorp("redefinition of enumeration '%s'", tagsym->name);
-	tp->defined = 1;
+	tp->prop |= TDEFINED;
 	namespace = NS_IDEN;
 
 	/* TODO: check incorrect values in val */
@@ -626,7 +626,7 @@
 		errorp("storage class in struct/union field");
 		err = 1;
 	}
-	if (!tp->defined) {
+	if (!(tp->prop & TDEFINED)) {
 		error("field '%s' has incomplete type", name);
 		err = 1;
 	}
@@ -729,7 +729,7 @@
 		return sym;
 
 	/* TODO: Add warning about ANSI limits */
-	if (!tp->defined                          &&
+	if (!(tp->prop & TDEFINED)                &&
 	    sclass != EXTERN && sclass != TYPEDEF &&
 	    !(tp->op == ARY && yytoken == '=')) {
 		errorp("declared variable '%s' of incomplete type", name);
@@ -860,7 +860,7 @@
 		curfun = ocurfun;
 		return;
 	}
-	if (sym->type->k_r) {
+	if (sym->type->prop & TK_R) {
 		while (yytoken != '{') {
 			par = dodcl(1, parameter, NS_IDEN, sym->type);
 			expect(';');
--- a/cc1/expr.c
+++ b/cc1/expr.c
@@ -28,7 +28,7 @@
 	case PTR:
 	case INT:
 		mask = (val > 1) ? ones(np->type->size) : -1;
-		nodeval = (tp->sign) ? sym->u.i : sym->u.u;
+		nodeval = (tp->prop & TSIGNED) ? sym->u.i : sym->u.u;
 		return (nodeval & mask) == (val & mask);
 	case FLOAT:
 		return sym->u.f == val;
@@ -100,9 +100,14 @@
 	if (tp1 == tp2)
 		goto set_p1_p2;
 
-	s1 = tp1->sign, r1 = tp1->n.rank, lp1 = getlimits(tp1);
-	s2 = tp2->sign, r2 = tp2->n.rank, lp2 = getlimits(tp2);
+	s1 = (tp1->prop & TSIGNED) != 0;
+	r1 = tp1->n.rank;
+	lp1 = getlimits(tp1);
 
+	s2 = (tp2->prop & TSIGNED) != 0;
+	r2 = tp2->n.rank;
+	lp2 = getlimits(tp2);
+
 	if (s1 == s2 || tp1->op == FLOAT || tp2->op == FLOAT) {
 		to = r1 - r2;
 	} else if (!s1) {
@@ -149,15 +154,15 @@
 	 */
 
 	if (!eqtype(yes->type, no->type)) {
-		if (yes->type->arith && no->type->arith) {
+		if ((yes->type->prop & TARITH) && (no->type->prop & TARITH)) {
 			arithconv(&yes, &no);
 		} else if (yes->type->op != PTR && no->type->op != PTR) {
 			goto wrong_type;
 		} else {
 			/* convert integer 0 to NULL */
-			if (yes->type->integer && cmpnode(yes, 0))
+			if ((yes->type->prop & TINTEGER) && cmpnode(yes, 0))
 				yes = convert(yes, pvoidtype, 0);
-			if (no->type->integer && cmpnode(no, 0))
+			if ((no->type->prop & TINTEGER) && cmpnode(no, 0))
 				no = convert(no, pvoidtype, 0);
 			/*
 			 * At this point the type of both should be
@@ -225,7 +230,7 @@
 static Node *
 integerop(char op, Node *lp, Node *rp)
 {
-	if (!lp->type->integer || !rp->type->integer)
+	if (!(lp->type->prop & TINTEGER) || !(rp->type->prop & TINTEGER))
 		error("operator requires integer operands");
 	arithconv(&lp, &rp);
 	return simplify(op, lp->type, lp, rp);
@@ -234,7 +239,7 @@
 static Node *
 integeruop(char op, Node *np)
 {
-	if (!np->type->integer)
+	if (!(np->type->prop & TINTEGER))
 		error("unary operator requires integer operand");
 	np = promote(np);
 	if (op == OCPL && np->op == OCPL)
@@ -245,7 +250,7 @@
 static Node *
 numericaluop(char op, Node *np)
 {
-	if (!np->type->arith)
+	if (!(np->type->prop & TARITH))
 		error("unary operator requires numerical operand");
 	np = promote(np);
 	if (op == ONEG && np->op == ONEG)
@@ -321,7 +326,7 @@
 		lp = node(OSUB, pdifftype, lp, rp);
 		return node(ODIV, inttype, lp, size);
 	}
-	if (!rp->type->integer)
+	if (!(rp->type->prop & TINTEGER))
 		goto incorrect;
 
 	rp = convert(promote(rp), sizettype, 0);
@@ -340,7 +345,7 @@
 {
 	Type *ltp = lp->type, *rtp = rp->type;
 
-	if (ltp->arith && rtp->arith) {
+	if ((ltp->prop & TARITH) && (rtp->prop & TARITH)) {
 		arithconv(&lp, &rp);
 	} else if ((ltp->op == PTR || rtp->op == PTR) &&
 	           (op == OADD || op == OSUB)) {
@@ -357,10 +362,10 @@
 	Node *np;
 	int err = 0;
 
-	if (lp->type->integer)
+	if (lp->type->prop & TINTEGER)
 		XCHG(lp, rp, np);
 
-	if (rp->type->integer) {
+	if (rp->type->prop & TINTEGER) {
 		if (!cmpnode(rp, 0))
 			err = 1;
 		rp = convert(rp, pvoidtype, 1);
@@ -388,7 +393,7 @@
 
 	if (ltp->op == PTR || rtp->op == PTR) {
 		return pcompare(op, rp, lp);
-	} else if (ltp->arith && rtp->arith) {
+	} else if ((ltp->prop & TARITH) && (rtp->prop & TARITH)) {
 		arithconv(&lp, &rp);
 		return simplify(op, inttype, lp, rp);
 	} else {
@@ -426,7 +431,7 @@
 exp2cond(Node *np, char neg)
 {
 	np = decay(np);
-	if (np->type->aggreg) {
+	if (np->type->prop & TAGGREG) {
 		errorp("used struct/union type value where scalar is required");
 		np = constnode(zero);
 	}
@@ -457,7 +462,7 @@
 		unexpected();
 	next();
 
-	if (!np->type->aggreg) {
+	if (!(np->type->prop & TAGGREG)) {
 		errorp("request for member '%s' in something not a structure or union",
 		      yylval.sym->name);
 		goto free_np;
@@ -504,7 +509,7 @@
 	Type *tp;
 	Node *np;
 
-	if (!lp->type->integer && !rp->type->integer)
+	if (!(lp->type->prop & TINTEGER) && !(rp->type->prop & TINTEGER))
 		error("array subscript is not an integer");
 	np = arithmetic(OADD, decay(lp), decay(rp));
 	tp = np->type;
@@ -533,10 +538,10 @@
 	chklvalue(np);
 	np->flags |= NEFFECT;
 
-	if (!tp->defined) {
+	if (!(tp->prop & TDEFINED)) {
 		errorp("invalid use of undefined type");
 		return np;
-	} else if (tp->arith) {
+	} else if (tp->prop & TARITH) {
 		inc = constnode(one);
 	} else if (tp->op == PTR) {
 		inc = sizeofnode(tp->type);
@@ -573,7 +578,7 @@
 negation(char op, Node *np)
 {
 	np = decay(np);
-	if (!np->type->arith && np->type->op != PTR) {
+	if (!(np->type->prop & TARITH) && np->type->op != PTR) {
 		errorp("invalid argument of unary '!'");
 		freetree(np);
 		return constnode(zero);
@@ -795,7 +800,7 @@
 	case SIZEOF:
 		next();
 		tp = (yytoken == '(') ? sizeexp() : typeof(unary());
-		if (!tp->defined)
+		if (!(tp->prop & TDEFINED))
 			errorp("sizeof applied to an incomplete type");
 		return sizeofnode(tp);
 	case INC:
--- a/cc1/fold.c
+++ b/cc1/fold.c
@@ -335,7 +335,7 @@
 	switch (type = optype->op) {
 	case ENUM:
 	case INT:
-		if (!optype->sign)
+		if (!(optype->prop & TSIGNED))
 			type = UNSIGNED;
 	case PTR:
 	case FLOAT:
@@ -549,7 +549,7 @@
 		case PTR:
 		case INT:
 		case ENUM:
-			u = (oldtp->sign) ? osym->u.i : osym->u.u;
+			u = (oldtp->prop & TSIGNED) ? osym->u.i : osym->u.u;
 			break;
 		case FLOAT:
 			oldtp = newtp;
@@ -559,7 +559,7 @@
 			goto noconstant;
 		}
 		mask = ones(newtp->size);
-		if (newtp->sign) {
+		if (newtp->prop & TSIGNED) {
 			negmask = ~mask;
 			if (u & (negmask >> 1) & mask)
 				u |= negmask;
@@ -570,7 +570,7 @@
 		break;
 	case FLOAT:
 		/* FIXME: The cast can be from another float type */
-		aux.u.f = (oldtp->sign) ? osym->u.i : osym->u.u;
+		aux.u.f = (oldtp->prop & TSIGNED) ? osym->u.i : osym->u.u;
 		break;
 	default:
 		goto noconstant;
--- a/cc1/init.c
+++ b/cc1/init.c
@@ -39,7 +39,7 @@
 	next();
 	np = iconstexpr();
 	npos = np->sym->u.i;
-	if (npos < 0 || tp->defined && npos >= tp->n.elem) {
+	if (npos < 0 || (tp->prop & TDEFINED) && npos >= tp->n.elem) {
 		errorp("array index in initializer exceeds array bounds");
 		npos = 0;
 	}
@@ -55,7 +55,7 @@
 	Symbol *sym, **p;
 	Type *tp = ip->type;
 
-	if (!tp->aggreg)
+	if (!(tp->prop & TAGGREG))
 		errorp("field name not in record or union initializer");
 	ons = namespace;
 	namespace = tp->ns;
@@ -119,8 +119,8 @@
 			goto return_zero;
 		}
 		len = sym->type->n.elem-1;
-		if (!tp->defined) {
-			tp->defined = 1;
+		if (!(tp->prop & TDEFINED)) {
+			tp->prop |= TDEFINED;
 			tp->n.elem = len+1;
 		} else if (tp->n.elem < len) {
 			warn("initializer-string for array of chars is too long");
@@ -221,7 +221,7 @@
 		switch (tp->op) {
 		case ARY:
 			newtp = tp->type;
-			if (!tp->defined || in.pos < tp->n.elem)
+			if (!(tp->prop & TDEFINED) || in.pos < tp->n.elem)
 				break;
 			if (!toomany)
 				warn("excess elements in array initializer");
@@ -271,9 +271,9 @@
 	if (braces)
 		expect('}');
 
-	if (tp->op == ARY && !tp->defined) {
+	if (tp->op == ARY && !(tp->prop & TDEFINED)) {
 		tp->n.elem = in.max;
-		tp->defined = 1;
+		tp->prop |= TDEFINED;
 	}
 	if (tp->op == ARY || tp->op == STRUCT)
 		in.max = tp->n.elem;
--- a/cc1/lex.c
+++ b/cc1/lex.c
@@ -278,7 +278,7 @@
 	repeat:
 		if (u <= max/base && u*base <= max - val)
 			continue;
-		if (tp->sign) {
+		if (tp->prop & TSIGNED) {
 			if (tp == inttype)
 				tp = (base==10) ? longtype : uinttype;
 			else if (tp == longtype)
@@ -299,7 +299,7 @@
 		goto repeat;
 	}
 
-	if (tp->sign)
+	if (tp->prop & TSIGNED)
 		sym->u.i = u;
 	else
 		sym->u.u = u;
--- a/cc1/symbol.c
+++ b/cc1/symbol.c
@@ -86,7 +86,7 @@
 	if (f & SSTRING)
 		free(sym->u.s);
 	if (sym->ns == NS_TAG)
-		sym->type->defined = 0;
+		sym->type->prop &= ~TDEFINED;
 	unlinkhash(sym);
 	if ((name = sym->name) != NULL && sym->ns != NS_CPP) {
 		if ((f & (SUSED|SGLOBAL|SDECLARED)) == SDECLARED)
--- a/cc1/types.c
+++ b/cc1/types.c
@@ -81,7 +81,7 @@
 	switch (tp->op) {
 	case ENUM:
 	case INT:
-		ntable = tp->sign;
+		ntable = ((tp->prop & TSIGNED) != 0);
 		switch (tp->size) {
 		case 1: ntype = 0; break;
 		case 2: ntype = 1; break;
@@ -259,13 +259,7 @@
 
 	type.type = tp;
 	type.op = op;
-	type.defined = 0;
-	type.arith = 0;
-	type.sign = 0;
-	type.integer = 0;
-	type.printed = 0;
-	type.aggreg = 0;
-	type.k_r = k_r;
+	type.prop = k_r ? TK_R : 0;
 	type.letter = c;
 	type.p.pars = pars;
 	type.n.elem = nelem;
@@ -278,17 +272,15 @@
 		/* PASSTROUGH */
 	case FTN:
 	case PTR:
-		type.defined = 1;
+		type.prop |= TDEFINED;
 		break;
 	case ENUM:
-		type.printed = 1;
-		type.integer = 1;
-		type.arith = 1;
+		type.prop |= TPRINTED | TINTEGER | TARITH;
 		type.n.rank = RANK_INT;
 		break;
 	case STRUCT:
 	case UNION:
-		type.aggreg = 1;
+		type.prop |= TAGGREG;
 		break;
 	}