[hackers] [scc] Remove TINT field in limits struct || Roberto E. Vargas Caballero

From: <git_AT_suckless.org>
Date: Fri, 8 Jan 2016 13:13:57 +0100 (CET)

commit 6fe9948519b756f46cb42fa132b158541f024222
Author: Roberto E. Vargas Caballero <k0ga_AT_shike2.com>
AuthorDate: Wed Jan 6 20:07:10 2016 +0100
Commit: Roberto E. Vargas Caballero <k0ga_AT_shike2.com>
CommitDate: Wed Jan 6 20:07:10 2016 +0100

    Remove TINT field in limits struct
    
    Having this field was a problem because it made impossible
    to take a value of the union without checking the type
    which generates this limits. This complexity is not needed,
    because TUINT can cover the maximum of any integer type,
    and in the case of the min, we only have to negate the value.

diff --git a/cc1/cc1.h b/cc1/cc1.h
index e4ce5dd..b680121 100644
--- a/cc1/cc1.h
+++ b/cc1/cc1.h
_AT_@ -35,13 +35,11 @@ typedef struct input Input;
 
 struct limits {
         union {
- TINT i;
- TUINT u;
+ TUINT i;
                 TFLOAT f;
         } max;
         union {
- TINT i;
- TUINT u;
+ TUINT i;
                 TFLOAT f;
         } min;
 };
diff --git a/cc1/fold.c b/cc1/fold.c
index 7d14a5c..66824c4 100644
--- a/cc1/fold.c
+++ b/cc1/fold.c
_AT_@ -21,7 +21,7 @@ static bool
 addi(TINT l, TINT r, Type *tp)
 {
         struct limits *lim = getlimits(tp);
- TINT max = lim->max.i, min = lim->min.i;
+ TINT max = lim->max.i, min = -lim->min.i;
 
         if (l < 0 && r < 0 && l >= min - r ||
             l == 0 ||
_AT_@ -69,7 +69,7 @@ static bool
 muli(TINT l, TINT r, Type *tp)
 {
         struct limits *lim = getlimits(tp);
- TINT max = lim->max.i, min = lim->min.i;
+ TINT max = lim->max.i, min = -lim->min.i;
 
         if (l > -1 && l <= 1 ||
             r > -1 && r <= 1 ||
_AT_@ -106,7 +106,7 @@ divi(TINT l, TINT r, Type *tp)
 {
         struct limits *lim = getlimits(tp);
 
- if (r == 0 || l == lim->min.i && r == -1) {
+ if (r == 0 || l == -lim->min.i && r == -1) {
                 warn("overflow in constant expression");
                 return 0;
         }
diff --git a/cc1/lex.c b/cc1/lex.c
index 96a71c8..1155cfd 100644
--- a/cc1/lex.c
+++ b/cc1/lex.c
_AT_@ -266,7 +266,7 @@ readint(char *s, int base, int sign, Symbol *sym)
         int c;
 
         lim = getlimits(tp);
- max = (tp->sign) ? lim->max.u : lim->max.i;
+ max = lim->max.i;
         if (*s == '0')
                 ++s;
         if (toupper(*s) == 'X')
_AT_@ -295,7 +295,7 @@ readint(char *s, int base, int sign, Symbol *sym)
                 }
                 sym->type = tp;
                 lim = getlimits(tp);
- max = (tp->sign) ? lim->max.u : lim->max.i;
+ max = lim->max.i;
                 goto repeat;
         }
 
diff --git a/cc1/types.c b/cc1/types.c
index 5840218..74fb338 100644
--- a/cc1/types.c
+++ b/cc1/types.c
_AT_@ -19,20 +19,20 @@
 static struct limits limits[][4] = {
         {
                 { /* 0 = unsigned 1 byte */
- .min.u = 0,
- .max.u = 255
+ .min.i = 0,
+ .max.i = 255
                 },
                 { /* 1 = unsigned 2 bytes */
- .min.u = 0,
- .max.u = 65535u
+ .min.i = 0,
+ .max.i = 65535u
                 },
                 { /* 2 = unsigned 4 bytes */
- .min.u = 0,
- .max.u = 4294967295u
+ .min.i = 0,
+ .max.i = 4294967295u
                 },
                 { /* 3 = unsigned 8 bytes */
- .min.u = 0,
- .max.u = 18446744073709551615u
+ .min.i = 0,
+ .max.i = 18446744073709551615u
                 }
         },
         {
Received on Fri Jan 08 2016 - 13:13:57 CET

This archive was generated by hypermail 2.3.0 : Fri Jan 08 2016 - 13:24:17 CET