ref: ea965d122903adb6bf9da6c7100468f9796a2b62
parent: 5986230634beac84ad48ce29b9842cbccbeaa286
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Fri Feb 3 04:44:49 EST 2017
Revert "[cc1] Don't deal abbreviations as other operations" This reverts commit 3b80bbd687997a5db6abff8329e63a21556d97b9.
--- a/cc1/expr.c
+++ b/cc1/expr.c
@@ -209,6 +209,39 @@
}
}
+static Node *
+integerop(int op, Node *lp, Node *rp)
+{
+ if (!(lp->type->prop & TINTEGER) || !(rp->type->prop & TINTEGER))
+ error("operator requires integer operands");
+ arithconv(&lp, &rp);
+ return simplify(op, lp->type, lp, rp);
+}
+
+static Node *
+integeruop(int op, Node *np)
+{
+ if (!(np->type->prop & TINTEGER))
+ error("unary operator requires integer operand");
+ np = promote(np);
+ if (op == OCPL && np->op == OCPL)
+ return np->left;
+ return simplify(op, np->type, np, NULL);
+}
+
+static Node *
+numericaluop(int op, Node *np)
+{
+ if (!(np->type->prop & TARITH))
+ error("unary operator requires numerical operand");
+ np = promote(np);
+ if (op == OSNEG && np->op == OSNEG)
+ return np->left;
+ if (op == OADD)
+ return np;
+ return simplify(op, np->type, np, NULL);
+}
+
Node *
convert(Node *np, Type *newtp, char iscast)
{
@@ -258,68 +291,9 @@
return castcode(np, newtp);
}
-/*
- * op functions: These functions group the different kind of operators
- * integer
- * pointer
- * numerical: (integers + float)
- * arithmetic: (integer + float + pointers)
- *
- * integer_aop: Assignation abbreviation operator with integers
- * integer_op: Operator with integers
- * integer_uop: Unary integer operator
- * numerical_uop: Unary numerical operator (integer and floats)
- * arithmetic_pop: Arithmetic pointer operator
- * arithmetic_aop: Assignation abbreviation operator with arithmetics
- * arithmetic_op: Arithmetic operator
- * compare_pop: Pointer comparision operator
- * compare_op: Comparision operator
- */
-
static Node *
-integer_aop(int op, Node *lp, Node *rp)
+parithmetic(int op, Node *lp, Node *rp)
{
- if (!(lp->type->prop&TINTEGER) || !(rp->type->prop&TINTEGER))
- error("operator requires integer operands");
- return simplify(op, lp->type, lp, convert(rp, lp->type, 0));
-}
-
-static Node *
-integer_op(int op, Node *lp, Node *rp)
-{
- if (!(lp->type->prop & TINTEGER) || !(rp->type->prop & TINTEGER))
- error("operator requires integer operands");
- arithconv(&lp, &rp);
- return simplify(op, lp->type, lp, rp);
-}
-
-static Node *
-integer_uop(int op, Node *np)
-{
- if (!(np->type->prop & TINTEGER))
- error("unary operator requires integer operand");
- np = promote(np);
- if (op == OCPL && np->op == OCPL)
- return np->left;
- return simplify(op, np->type, np, NULL);
-}
-
-static Node *
-numerical_uop(int op, Node *np)
-{
- if (!(np->type->prop & TARITH))
- error("unary operator requires numerical operand");
- np = promote(np);
- if (op == OSNEG && np->op == OSNEG)
- return np->left;
- if (op == OADD)
- return np;
- return simplify(op, np->type, np, NULL);
-}
-
-static Node *
-arithmetic_pop(int op, Node *lp, Node *rp)
-{
Type *tp;
Node *size, *np;
@@ -359,24 +333,11 @@
}
static Node *
-arithmetic_aop(int op, Node *lp, Node *rp)
+arithmetic(int op, Node *lp, Node *rp)
{
Type *ltp = lp->type, *rtp = rp->type;
- if (ltp->prop&TARITH && rtp->prop&TARITH)
- return simplify(op, lp->type, lp, convert(rp, lp->type, 0));
- if (ltp->op == PTR && rtp->prop&TINTEGER)
- return arithmetic_pop(op, lp, rp);
- errorp("incorrect arithmetic operands");
- return constnode(zero);
-}
-
-static Node *
-arithmetic_op(int op, Node *lp, Node *rp)
-{
- Type *ltp = lp->type, *rtp = rp->type;
-
- if (ltp->prop&TARITH && rtp->prop&TARITH) {
+ if ((ltp->prop & TARITH) && (rtp->prop & TARITH)) {
arithconv(&lp, &rp);
return simplify(op, lp->type, lp, rp);
} else if ((ltp->op == PTR || rtp->op == PTR)) {
@@ -383,9 +344,11 @@
switch (op) {
case OADD:
case OSUB:
+ case OA_ADD:
+ case OA_SUB:
case OINC:
case ODEC:
- return arithmetic_pop(op, lp, rp);
+ return parithmetic(op, lp, rp);
}
}
errorp("incorrect arithmetic operands");
@@ -392,7 +355,7 @@
}
static Node *
-compare_pop(int op, Node *lp, Node *rp)
+pcompare(int op, Node *lp, Node *rp)
{
Node *np;
int err = 0;
@@ -416,7 +379,7 @@
}
static Node *
-compare_op(int op, Node *lp, Node *rp)
+compare(int op, Node *lp, Node *rp)
{
Type *ltp, *rtp;
@@ -424,7 +387,7 @@
rtp = rp->type;
if (ltp->op == PTR || rtp->op == PTR) {
- return compare_pop(op, rp, lp);
+ return pcompare(op, rp, lp);
} else if ((ltp->prop & TARITH) && (rtp->prop & TARITH)) {
arithconv(&lp, &rp);
return simplify(op, inttype, lp, rp);
@@ -503,7 +466,7 @@
case OGT:
return (neg) ? negate(np) : np;
default:
- return compare_op((neg) ? OEQ : ONE, np, constnode(zero));
+ return compare((neg) ? OEQ : ONE, np, constnode(zero));
}
}
@@ -574,7 +537,7 @@
if (!(lp->type->prop & TINTEGER) && !(rp->type->prop & TINTEGER))
error("array subscript is not an integer");
- np = arithmetic_op(OADD, lp, rp);
+ np = arithmetic(OADD, lp, rp);
tp = np->type;
if (tp->op != PTR)
errorp("subscripted value is neither array nor pointer");
@@ -582,7 +545,7 @@
}
static Node *
-assign_op(int op, Node *lp, Node *rp)
+assignop(int op, Node *lp, Node *rp)
{
if ((rp = convert(rp, lp->type, 0)) == NULL) {
errorp("incompatible types when assigning");
@@ -614,7 +577,7 @@
errorp("wrong type argument to increment or decrement");
return np;
}
- return arithmetic_op(op, np, inc);
+ return arithmetic(op, np, inc);
}
static Node *
@@ -883,9 +846,9 @@
switch (yytoken) {
case '!': op = 0; fun = negation; break;
- case '+': op = OADD; fun = numerical_uop; break;
- case '-': op = OSNEG; fun = numerical_uop; break;
- case '~': op = OCPL; fun = integer_uop; break;
+ case '+': op = OADD; fun = numericaluop; break;
+ case '-': op = OSNEG; fun = numericaluop; break;
+ case '~': op = OCPL; fun = integeruop; break;
case '&': op = OADDR; fun = address; break;
case '*': op = OPTR; fun = content; break;
case SIZEOF:
@@ -986,9 +949,9 @@
np = cast(1);
for (;;) {
switch (yytoken) {
- case '*': op = OMUL; fun = arithmetic_op; break;
- case '/': op = ODIV; fun = arithmetic_op; break;
- case '%': op = OMOD; fun = integer_op; break;
+ case '*': op = OMUL; fun = arithmetic; break;
+ case '/': op = ODIV; fun = arithmetic; break;
+ case '%': op = OMOD; fun = integerop; break;
default: return np;
}
next();
@@ -1010,7 +973,7 @@
default: return np;
}
next();
- np = arithmetic_op(op, np, mul());
+ np = arithmetic(op, np, mul());
}
}
@@ -1028,7 +991,7 @@
default: return np;
}
next();
- np = integer_op(op, np, add());
+ np = integerop(op, np, add());
}
}
@@ -1048,7 +1011,7 @@
default: return np;
}
next();
- np = compare_op(op, np, shift());
+ np = compare(op, np, shift());
}
}
@@ -1066,7 +1029,7 @@
default: return np;
}
next();
- np = compare_op(op, np, relational());
+ np = compare(op, np, relational());
}
}
@@ -1077,7 +1040,7 @@
np = eq();
while (accept('&'))
- np = integer_op(OBAND, np, eq());
+ np = integerop(OBAND, np, eq());
return np;
}
@@ -1088,7 +1051,7 @@
np = bit_and();
while (accept('^'))
- np = integer_op(OBXOR, np, bit_and());
+ np = integerop(OBXOR, np, bit_and());
return np;
}
@@ -1099,7 +1062,7 @@
np = bit_xor();
while (accept('|'))
- np = integer_op(OBOR, np, bit_xor());
+ np = integerop(OBOR, np, bit_xor());
return np;
}
@@ -1153,17 +1116,17 @@
np = ternary();
for (;;) {
switch (yytoken) {
- case '=': op = OASSIGN; fun = assign_op; break;
- case MUL_EQ: op = OA_MUL; fun = arithmetic_aop; break;
- case DIV_EQ: op = OA_DIV; fun = arithmetic_aop; break;
- case ADD_EQ: op = OA_ADD; fun = arithmetic_aop; break;
- case SUB_EQ: op = OA_SUB; fun = arithmetic_aop; break;
- case MOD_EQ: op = OA_MOD; fun = integer_aop; break;
- case SHL_EQ: op = OA_SHL; fun = integer_aop; break;
- case SHR_EQ: op = OA_SHR; fun = integer_aop; break;
- case AND_EQ: op = OA_AND; fun = integer_aop; break;
- case XOR_EQ: op = OA_XOR; fun = integer_aop; break;
- case OR_EQ: op = OA_OR; fun = integer_aop; break;
+ case '=': op = OASSIGN; fun = assignop; break;
+ case MUL_EQ: op = OA_MUL; fun = arithmetic; break;
+ case DIV_EQ: op = OA_DIV; fun = arithmetic; break;
+ case MOD_EQ: op = OA_MOD; fun = integerop; break;
+ case ADD_EQ: op = OA_ADD; fun = arithmetic; break;
+ case SUB_EQ: op = OA_SUB; fun = arithmetic; break;
+ case SHL_EQ: op = OA_SHL; fun = integerop; break;
+ case SHR_EQ: op = OA_SHR; fun = integerop; break;
+ case AND_EQ: op = OA_AND; fun = integerop; break;
+ case XOR_EQ: op = OA_XOR; fun = integerop; break;
+ case OR_EQ: op = OA_OR; fun = integerop; break;
default: return np;
}
chklvalue(np);