diff options
| -rw-r--r-- | decl.c | 1 | ||||
| -rw-r--r-- | tests/common-real-int-sign.c | 4 | ||||
| -rw-r--r-- | tests/common-real-int-sign.qbe | 14 | ||||
| -rw-r--r-- | type.c | 6 | ||||
| -rw-r--r-- | type.h | 1 | 
5 files changed, 25 insertions, 1 deletions
| @@ -185,6 +185,7 @@ tagspec(struct scope *s)  		t = mktype(kind, NULL);  		if (kind == TYPEBASIC) {  			*t = typeint; +			t->basic.kind = BASICENUM;  		} else {  			t->repr = &i64; // XXX  			t->size = 0; diff --git a/tests/common-real-int-sign.c b/tests/common-real-int-sign.c new file mode 100644 index 0000000..d67c301 --- /dev/null +++ b/tests/common-real-int-sign.c @@ -0,0 +1,4 @@ +int main(void) { +	unsigned x = -1; +	return 0 > x; +} diff --git a/tests/common-real-int-sign.qbe b/tests/common-real-int-sign.qbe new file mode 100644 index 0000000..589c72e --- /dev/null +++ b/tests/common-real-int-sign.qbe @@ -0,0 +1,14 @@ +export +function w $main() { +@start.1 +	%.1 =l alloc4 4 +@body.2 +	%.2 =l add %.1, 0 +	%.3 =w sub 0, 1 +	%.4 =w copy %.3 +	storew %.4, %.2 +	%.5 =w copy 0 +	%.6 =w loaduw %.1 +	%.7 =w cugtw %.5, %.6 +	ret %.7 +} @@ -142,6 +142,7 @@ typerank(struct type *t)  	case BASICBOOL:     return 1;  	case BASICCHAR:     return 2;  	case BASICSHORT:    return 3; +	case BASICENUM:  	case BASICINT:      return 4;  	case BASICLONG:     return 5;  	case BASICLONGLONG: return 6; @@ -162,9 +163,12 @@ typecompatible(struct type *t1, struct type *t2)  		return false;  	switch (t1->kind) {  	case TYPEBASIC: +		if (t1->basic.issigned != t2->basic.issigned) +			return false;  		/* enum types are compatible with 'int', but not with  		   each other (unless they are the same type) */ -		return t1->basic.kind == t2->basic.kind && (t1 == &typeint || t2 == &typeint); +		return t1->basic.kind == BASICENUM && t2->basic.kind == BASICINT || +		       t1->basic.kind == BASICINT && t2->basic.kind == BASICENUM;  	case TYPEQUALIFIED:  		if (t1->qualified.kind != t2->qualified.kind)  			return false; @@ -68,6 +68,7 @@ struct type {  				BASICCHAR,  				BASICSHORT,  				BASICINT, +				BASICENUM,  				BASICLONG,  				BASICLONGLONG,  				BASICFLOAT, | 
