[hackers] [scc] Replace struct type bitfield with enum-bitflags || FRIGN

From: <git_AT_suckless.org>
Date: Wed, 18 May 2016 22:44:32 +0200 (CEST)

commit cdc25f13748ccf9b0de99c6c7da518f76681ea57
Author: FRIGN <dev_AT_frign.de>
AuthorDate: Wed May 18 12:15:52 2016 +0200
Commit: FRIGN <dev_AT_frign.de>
CommitDate: Wed May 18 22:44:14 2016 +0200

    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

diff --git a/cc1/arch/amd64-sysv/arch.c b/cc1/arch/amd64-sysv/arch.c
index 0ccb8be..552824b 100644
--- a/cc1/arch/amd64-sysv/arch.c
+++ b/cc1/arch/amd64-sysv/arch.c
_AT_@ -17,212 +17,155 @@ static Type types[] = {
         { /* 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
         },
 };
 
diff --git a/cc1/arch/i386-sysv/arch.c b/cc1/arch/i386-sysv/arch.c
index 780de06..6501f29 100644
--- a/cc1/arch/i386-sysv/arch.c
+++ b/cc1/arch/i386-sysv/arch.c
_AT_@ -17,212 +17,155 @@ static Type types[] = {
         { /* 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
         },
 };
 
diff --git a/cc1/arch/qbe/arch.c b/cc1/arch/qbe/arch.c
index 0ccb8be..09bbc1c 100644
--- a/cc1/arch/qbe/arch.c
+++ b/cc1/arch/qbe/arch.c
_AT_@ -17,212 +17,155 @@ static Type types[] = {
         { /* 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
         },
 };
 
diff --git a/cc1/arch/z80/arch.c b/cc1/arch/z80/arch.c
index 7412bb0..2473717 100644
--- a/cc1/arch/z80/arch.c
+++ b/cc1/arch/z80/arch.c
_AT_@ -17,212 +17,155 @@ static Type types[] = {
         { /* 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
         },
 };
 
diff --git a/cc1/cc1.h b/cc1/cc1.h
index ac816a1..bff2d4a 100644
--- a/cc1/cc1.h
+++ b/cc1/cc1.h
_AT_@ -30,18 +30,22 @@ struct keyword {
         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 */
diff --git a/cc1/code.c b/cc1/code.c
index 017fb41..5859923 100644
--- a/cc1/code.c
+++ b/cc1/code.c
_AT_@ -194,7 +194,7 @@ emitconst(Node *np)
         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));
_AT_@ -240,9 +240,9 @@ emittype(Type *tp)
         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:
diff --git a/cc1/decl.c b/cc1/decl.c
index 34738a0..ccf1342 100644
--- a/cc1/decl.c
+++ b/cc1/decl.c
_AT_@ -160,7 +160,7 @@ parameter(struct decl *dcl)
 
         switch (tp->op) {
         case VOID:
- if (n != 0 || funtp->k_r) {
+ if (n != 0 || (funtp->prop & TK_R)) {
                         errorp("incorrect void parameter");
                         return NULL;
                 }
_AT_@ -177,11 +177,11 @@ parameter(struct decl *dcl)
         }
         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;
_AT_@ -287,7 +287,7 @@ fundcl(struct declarators *dp)
         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);
_AT_@ -518,9 +518,9 @@ structdcl(void)
                 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");
_AT_@ -551,9 +551,9 @@ enumdcl(void)
 
         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 */
_AT_@ -626,7 +626,7 @@ field(struct decl *dcl)
                 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;
         }
_AT_@ -729,7 +729,7 @@ identifier(struct decl *dcl)
                 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);
_AT_@ -860,7 +860,7 @@ decl(void)
                 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(';');
diff --git a/cc1/expr.c b/cc1/expr.c
index 99aed67..85902b8 100644
--- a/cc1/expr.c
+++ b/cc1/expr.c
_AT_@ -28,7 +28,7 @@ cmpnode(Node *np, TUINT val)
         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;
_AT_@ -100,8 +100,13 @@ arithconv(Node **p1, Node **p2)
         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;
_AT_@ -149,15 +154,15 @@ chkternary(Node *yes, Node *no)
          */
 
         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
_AT_@ -225,7 +230,7 @@ decay(Node *np)
 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);
_AT_@ -234,7 +239,7 @@ integerop(char op, Node *lp, Node *rp)
 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)
_AT_@ -245,7 +250,7 @@ integeruop(char op, Node *np)
 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)
_AT_@ -321,7 +326,7 @@ parithmetic(char op, Node *lp, Node *rp)
                 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);
_AT_@ -340,7 +345,7 @@ arithmetic(char op, Node *lp, Node *rp)
 {
         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)) {
_AT_@ -357,10 +362,10 @@ pcompare(char op, Node *lp, Node *rp)
         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);
_AT_@ -388,7 +393,7 @@ compare(char op, Node *lp, Node *rp)
 
         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 {
_AT_@ -426,7 +431,7 @@ static Node *
 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);
         }
_AT_@ -457,7 +462,7 @@ field(Node *np)
                 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;
_AT_@ -504,7 +509,7 @@ array(Node *lp, Node *rp)
         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;
_AT_@ -533,10 +538,10 @@ incdec(Node *np, char op)
         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);
_AT_@ -573,7 +578,7 @@ static Node *
 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);
_AT_@ -795,7 +800,7 @@ unary(void)
         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:
diff --git a/cc1/fold.c b/cc1/fold.c
index 4fb68c3..637e5ba 100644
--- a/cc1/fold.c
+++ b/cc1/fold.c
_AT_@ -335,7 +335,7 @@ fold(int op, Type *tp, Node *lp, Node *rp)
         switch (type = optype->op) {
         case ENUM:
         case INT:
- if (!optype->sign)
+ if (!(optype->prop & TSIGNED))
                         type = UNSIGNED;
         case PTR:
         case FLOAT:
_AT_@ -549,7 +549,7 @@ castcode(Node *np, Type *newtp)
                 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;
_AT_@ -559,7 +559,7 @@ castcode(Node *np, Type *newtp)
                         goto noconstant;
                 }
                 mask = ones(newtp->size);
- if (newtp->sign) {
+ if (newtp->prop & TSIGNED) {
                         negmask = ~mask;
                         if (u & (negmask >> 1) & mask)
                                 u |= negmask;
_AT_@ -570,7 +570,7 @@ castcode(Node *np, Type *newtp)
                 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;
diff --git a/cc1/init.c b/cc1/init.c
index 533b980..fbdfc3e 100644
--- a/cc1/init.c
+++ b/cc1/init.c
_AT_@ -39,7 +39,7 @@ arydesig(Init *ip)
         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;
         }
_AT_@ -55,7 +55,7 @@ fielddesig(Init *ip)
         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;
_AT_@ -119,8 +119,8 @@ initialize(Type *tp)
                         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");
_AT_@ -221,7 +221,7 @@ initlist(Type *tp)
                 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");
_AT_@ -271,9 +271,9 @@ initlist(Type *tp)
         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;
diff --git a/cc1/lex.c b/cc1/lex.c
index 4fa3664..a2f5d18 100644
--- a/cc1/lex.c
+++ b/cc1/lex.c
_AT_@ -278,7 +278,7 @@ readint(char *s, int base, int sign, Symbol *sym)
         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)
_AT_@ -299,7 +299,7 @@ readint(char *s, int base, int sign, Symbol *sym)
                 goto repeat;
         }
 
- if (tp->sign)
+ if (tp->prop & TSIGNED)
                 sym->u.i = u;
         else
                 sym->u.u = u;
diff --git a/cc1/symbol.c b/cc1/symbol.c
index 252b526..7d25b33 100644
--- a/cc1/symbol.c
+++ b/cc1/symbol.c
_AT_@ -86,7 +86,7 @@ killsym(Symbol *sym)
         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)
diff --git a/cc1/types.c b/cc1/types.c
index 68f4bbe..52e16f2 100644
--- a/cc1/types.c
+++ b/cc1/types.c
_AT_@ -81,7 +81,7 @@ getlimits(Type *tp)
         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;
_AT_@ -259,13 +259,7 @@ mktype(Type *tp, int op, TINT nelem, Type *pars[])
 
         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;
_AT_@ -278,17 +272,15 @@ mktype(Type *tp, int op, TINT nelem, Type *pars[])
                 /* 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;
         }
 
Received on Wed May 18 2016 - 22:44:32 CEST

This archive was generated by hypermail 2.3.0 : Wed May 18 2016 - 22:48:19 CEST