Merge change 9366
* changes:
Implement op=.
diff --git a/libacc/acc.cpp b/libacc/acc.cpp
index a74f51d..823849c 100644
--- a/libacc/acc.cpp
+++ b/libacc/acc.cpp
@@ -3188,6 +3188,7 @@
static const int TOK_NUM = 2;
static const int TOK_NUM_FLOAT = 3;
static const int TOK_NUM_DOUBLE = 4;
+ static const int TOK_OP_ASSIGNMENT = 5;
// 3..255 are character and/or operators
@@ -3626,6 +3627,13 @@
inp();
tok = TOK_DUMMY; /* dummy token for double tokens */
}
+ /* check for op=, valid for * / % + - << >> & ^ | */
+ if (ch == '=' &&
+ ((tokl >= 1 && tokl <= 3)
+ || tokl >=6 && tokl <= 8) ) {
+ inp();
+ tok = TOK_OP_ASSIGNMENT;
+ }
break;
}
opIndex++;
@@ -3797,6 +3805,17 @@
expr();
pGen->forceR0RVal();
pGen->storeR0ToTOS();
+ } else if (tok == TOK_OP_ASSIGNMENT) {
+ int t = tokc;
+ next();
+ checkLVal();
+ pGen->pushR0();
+ pGen->forceR0RVal();
+ pGen->pushR0();
+ expr();
+ pGen->forceR0RVal();
+ pGen->genOp(t);
+ pGen->storeR0ToTOS();
}
}
diff --git a/libacc/tests/data/assignmentop.c b/libacc/tests/data/assignmentop.c
new file mode 100644
index 0000000..10b4637
--- /dev/null
+++ b/libacc/tests/data/assignmentop.c
@@ -0,0 +1,66 @@
+// Test assignment operations
+
+void testAssignment() {
+ int a = 2;
+ a *= 5;
+ printf("2 *= 5 %d\n", a);
+ a = 20;
+ a /= 5;
+ printf("20 /= 5 %d\n", a);
+ a = 17;
+ a %= 5;
+ printf("17 %%= 5 %d\n", a);
+ a = 17;
+ a += 5;
+ printf("17 += 5 %d\n", a);
+ a = 17;
+ a-=5;
+ printf("17 -= 5 %d\n", a);
+ a = 17;
+ a<<=1;
+ printf("17<<= 1 %d\n", a);
+ a = 17;
+ a>>=1;
+ printf("17>>= 1 %d\n", a);
+ a = 17;
+ a&=1;
+ printf("17&= 1 %d\n", a);
+ a = 17;
+ a^=1;
+ printf("17^= 1 %d\n", a);
+ a = 16;
+ a^=1;
+ printf("16|= 1 %d\n", a);
+}
+
+/* Can't use because int* f() is not parsed as a function decl.
+int a;
+
+int* f() {
+ printf("f()\n");
+ return &a;
+}
+
+void testEval() {
+ a = 0;
+ printf("*f() = *f() + 10;");
+ *f() = *f() + 10;
+ printf("a = %d\n", a);
+}
+
+void testOpEval() {
+ a = 0;
+ printf("*f() += 10;");
+ *f() += 10;
+ printf("a = %d\n", a);
+}
+
+*/
+int main() {
+ testAssignment();
+ /*
+ testEval();
+ testOpEval();
+ */
+ return 0;
+}
diff --git a/libacc/tests/test.py b/libacc/tests/test.py
index f9089be..239bb9b 100644
--- a/libacc/tests/test.py
+++ b/libacc/tests/test.py
@@ -340,6 +340,20 @@
a = 2, *pa = 2 **ppa = 2
""")
+ def testassignmentop(self):
+ self.compileCheck(["-R", "data/assignmentop.c"], """Executing compiled code:
+result: 0""", """2 *= 5 10
+20 /= 5 4
+17 %= 5 2
+17 += 5 22
+17 -= 5 12
+17<<= 1 34
+17>>= 1 8
+17&= 1 1
+17^= 1 16
+16|= 1 17
+""")
+
if __name__ == '__main__':
if not outputCanRun():
print "Many tests are expected to fail, because acc is not a 32-bit x86 Linux executable."