shithub: scc

Download patch

ref: 97f8f317d80776d196430997bea038e80709a206
parent: 4e16556fa4948d8dd822f7ed31d4e367514f7182
author: Roberto E. Vargas Caballero <[email protected]>
date: Thu Jan 7 14:39:29 EST 2016

Convert arithmetic() to use new type fields

--- a/cc1/expr.c
+++ b/cc1/expr.c
@@ -320,28 +320,16 @@
 static Node *
 arithmetic(char op, Node *lp, Node *rp)
 {
-	switch (BTYPE(lp)) {
-	case INT:
-	case FLOAT:
-		switch (BTYPE(rp)) {
-		case INT:
-		case FLOAT:
-			arithconv(&lp, &rp);
-			break;
-		case PTR:
-			if (op == OADD || op == OSUB)
-				return parithmetic(op, rp, lp);
-		default:
-			goto incorrect;
-		}
-		break;
-	case PTR:
-		return parithmetic(op, lp, rp);
-	default:
-	incorrect:
+	Type *ltp = lp->type, *rtp = rp->type;
+
+	if (ltp->arith && rtp->arith) {
+		arithconv(&lp, &rp);
+	} else if ((ltp->op == PTR || rtp->op == PTR) &&
+	           op == OADD || op == OSUB) {
+		return parithmetic(op, rp, lp);
+	} else {
 		errorp("incorrect arithmetic operands");
 	}
-
 	return simplify(op, lp->type, lp, rp);
 }