scc

simple C compiler
git clone git://git.2f30.org/scc
Log | Files | Refs | README | LICENSE

commit d1c3a0d77670defbdac8bc39a5182170934d8063
parent 813b9848feb7c50708fee6fd00f006a85ca4779e
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date:   Sun, 30 Mar 2014 20:25:37 +0200

Fix bool type

It is easier considerer bool as int with size 0.

Diffstat:
Mexpr.c | 6+++---
Mtypes.c | 6+++++-
2 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/expr.c b/expr.c @@ -56,9 +56,9 @@ add(Node *np1, Node *np2) t1 = tp1->op, t2 = tp2->op; switch (t1) { - case BOOL: case INT: + case INT: switch (t2) { - case BOOL: case INT: + case INT: if (tp1 != tp2) intconv(&np1, &np2); break; @@ -79,7 +79,7 @@ add(Node *np1, Node *np2) if (tp1 != tp2) floatconv(&np1, &np2); break; - case BOOL: case INT: + case INT: int_float: np2 = unarycode(OCAST, np1->type, np2); break; default: diff --git a/types.c b/types.c @@ -13,6 +13,9 @@ Type *voidtype = &(Type) { .op = VOID }, + *booltype = &(Type) { + .op = INT, + }, *uchartype = &(Type) { .op = INT, .size = CHARSIZE, @@ -38,7 +41,7 @@ Type }, *shortype = &(Type) { .op = INT, - .size = INTSIZE, + .size = SHORTSIZE, }, *longtype = &(Type) { .op = INT, @@ -113,6 +116,7 @@ ctype(int8_t type, int8_t sign, int8_t size, int8_t cplex) switch (type) { case VOID: return voidtype; + case BOOL: return booltype; case CHAR: return (sign) ? uchartype : chartype; case INT: switch (size) { case 0: return (sign) ? uinttype : inttype;