shithub: scc

Download patch

ref: 4c4c232a9f307952470065c30c82048decb8c6fd
parent: 4deece51bfadf521d8509a1bb62531f9937719ab
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Tue Apr 22 12:24:32 EDT 2014

Separate char and signed/unsigned char

They are different types, and this small difference can
be important if you make a pointer from them, because
in this case the pointers are not equivalent between them.

--- a/types.c
+++ b/types.c
@@ -23,6 +23,12 @@
 		.defined = 1,
 		.u.rank = RANK_BOOL
 	},
+	*schartype = &(Type) {
+		.op = INT,
+		.letter = 'C',
+		.defined = 1,
+		.u.rank = RANK_SCHAR
+	},
 	*uchartype = &(Type) {
 		.op = INT,
 		.letter = 'M',
@@ -32,9 +38,10 @@
 	},
 	*chartype = &(Type) {
 		.op = INT,
-		.letter = 'C',
+		.letter = 'M',
+		.sign = 1,
 		.defined = 1,
-		.u.rank = RANK_SCHAR
+		.u.rank = RANK_UCHAR
 	},
 	*ushortype = &(Type) {
 		.op = INT,
@@ -109,27 +116,25 @@
 Type *
 ctype(int8_t type, int8_t sign, int8_t size)
 {
-	if (type == CHAR && !sign)
-		sign = options.charsign;
-	if (sign == SIGNED)
-		sign = 0;
 	if (type == DOUBLE)
 		type = FLOAT, size += LONG;
 
 	switch (type) {
-	case VOID:                      return voidtype;
-	case BOOL:                      return booltype;
-	case CHAR:                      return (sign) ? uchartype  : chartype;
+	case CHAR: if (sign == 0)
+					return chartype;
+				return (sign == UNSIGNED) ?  uchartype : schartype;
+	case VOID:            return voidtype;
+	case BOOL:            return booltype;
 	case INT: switch (size) {
-		case 0:                 return (sign) ? uinttype   : inttype;
-		case SHORT:             return (sign) ? ushortype  : shortype;
-		case LONG:              return (sign) ? ulongtype   : longtype;
-		case LONG+LONG:         return (sign) ? ullongtype : llongtype;
+		case 0:          return (sign == UNSIGNED) ? uinttype   : inttype;
+		case SHORT:      return (sign == UNSIGNED) ? ushortype  : shortype;
+		case LONG:       return (sign == UNSIGNED) ? ulongtype  : longtype;
+		case LONG+LONG:  return (sign == UNSIGNED) ? ullongtype : llongtype;
 		}
 	case FLOAT: switch (size) {
-		case 0:                 return floattype;
-		case LONG:              return doubletype;
-		case LONG+LONG:         return ldoubletype;
+		case 0:          return floattype;
+		case LONG:       return doubletype;
+		case LONG+LONG:  return ldoubletype;
 		}
 	}
 }
--