Loading libacc/acc.cpp +23 −13 Original line number Diff line number Diff line Loading @@ -3630,7 +3630,7 @@ class Compiler : public ErrorSink { /* check for op=, valid for * / % + - << >> & ^ | */ if (ch == '=' && ((tokl >= 1 && tokl <= 3) || tokl >=6 && tokl <= 8) ) { || (tokl >=6 && tokl <= 8)) ) { inp(); tok = TOK_OP_ASSIGNMENT; } Loading Loading @@ -3879,18 +3879,7 @@ class Compiler : public ErrorSink { /* This is a pointer dereference. */ unary(); pGen->forceR0RVal(); Type* pR0Type = pGen->getR0Type(); if (pR0Type->tag != TY_POINTER) { error("Expected a pointer type."); } else { if (pR0Type->pHead->tag == TY_FUNC) { t = 0; } if (t) { pGen->setR0ExpressionType(ET_LVALUE); } } doPointer(); } else if (t == '&') { VariableInfo* pVI = VI(tok); pGen->leaR0((int) pVI->pAddress, createPtrType(pVI->pType), Loading Loading @@ -3949,6 +3938,15 @@ class Compiler : public ErrorSink { // post inc / post dec doIncDec(tokc == OP_INCREMENT, true); next(); } else if (accept('[')) { // Array reference pGen->forceR0RVal(); pGen->pushR0(); commaExpr(); pGen->forceR0RVal(); pGen->genOp(OP_PLUS); doPointer(); skip(']'); } else if (accept('(')) { /* function call */ Type* pDecl = NULL; Loading Loading @@ -4035,6 +4033,18 @@ class Compiler : public ErrorSink { } } void doPointer() { pGen->forceR0RVal(); Type* pR0Type = pGen->getR0Type(); if (pR0Type->tag != TY_POINTER) { error("Expected a pointer type."); } else { if (pR0Type->pHead->tag != TY_FUNC) { pGen->setR0ExpressionType(ET_LVALUE); } } } /* Recursive descent parser for binary operations. */ void binaryOp(int level) { Loading libacc/tests/data/brackets.c 0 → 100644 +61 −0 Original line number Diff line number Diff line void testBrackets(int* ar, int len) { int i; int errors = 0; for (i = 0; i < len; i++) { ar[i] = i; } for (i = 0; i < len; i++) { if (ar[i] != i) { printf("error: [%d] %d != %d\n", i, ar[i], i); errors++; } } printf("Errors: %d\n", errors); } void testBrackets2D(int** ar2D, int lenX, int lenY) { int x, y; int errors = 0; for (x = 0; x < lenX; x++) { for (y = 0; y < lenY; y++) { ar2D[x][y] = x * lenY + y; } } for (x = 0; x < lenX; x++) { for (y = 0; y < lenY; y++) { int expected = x * lenY + y; int val = ar2D[x][y]; if (val != expected) { printf("error: [%d][%d] %d != %d\n", x, y, val, expected); errors++; } } } printf("2D Errors: %d\n", errors); } void testHeap() { int* ar = (int*) malloc(100); testBrackets(ar, 25); free(ar); } void testHeap2D() { int lenX = 10; int lenY = 5; int* ar = (int*) malloc(lenX * lenY * 4); int** ar2D = (int**) malloc(lenX * 4); int i; for(i = 0; i < lenX; i++) { ar2D[i] = ar + lenY * i; } testBrackets2D(ar2D, lenX, lenY); free(ar); free(ar2D); } int main() { testHeap(); testHeap2D(); return 0; } libacc/tests/test.py +7 −0 Original line number Diff line number Diff line Loading @@ -368,6 +368,13 @@ return: 30 arg: 12 """) def testBrackets(self): self.compileCheck(["-R", "data/brackets.c"], """Executing compiled code: Errors: 0 2D Errors: 0 result: 0 ""","""""") if __name__ == '__main__': if not outputCanRun(): print "Many tests are expected to fail, because acc is not a 32-bit x86 Linux executable." Loading Loading
libacc/acc.cpp +23 −13 Original line number Diff line number Diff line Loading @@ -3630,7 +3630,7 @@ class Compiler : public ErrorSink { /* check for op=, valid for * / % + - << >> & ^ | */ if (ch == '=' && ((tokl >= 1 && tokl <= 3) || tokl >=6 && tokl <= 8) ) { || (tokl >=6 && tokl <= 8)) ) { inp(); tok = TOK_OP_ASSIGNMENT; } Loading Loading @@ -3879,18 +3879,7 @@ class Compiler : public ErrorSink { /* This is a pointer dereference. */ unary(); pGen->forceR0RVal(); Type* pR0Type = pGen->getR0Type(); if (pR0Type->tag != TY_POINTER) { error("Expected a pointer type."); } else { if (pR0Type->pHead->tag == TY_FUNC) { t = 0; } if (t) { pGen->setR0ExpressionType(ET_LVALUE); } } doPointer(); } else if (t == '&') { VariableInfo* pVI = VI(tok); pGen->leaR0((int) pVI->pAddress, createPtrType(pVI->pType), Loading Loading @@ -3949,6 +3938,15 @@ class Compiler : public ErrorSink { // post inc / post dec doIncDec(tokc == OP_INCREMENT, true); next(); } else if (accept('[')) { // Array reference pGen->forceR0RVal(); pGen->pushR0(); commaExpr(); pGen->forceR0RVal(); pGen->genOp(OP_PLUS); doPointer(); skip(']'); } else if (accept('(')) { /* function call */ Type* pDecl = NULL; Loading Loading @@ -4035,6 +4033,18 @@ class Compiler : public ErrorSink { } } void doPointer() { pGen->forceR0RVal(); Type* pR0Type = pGen->getR0Type(); if (pR0Type->tag != TY_POINTER) { error("Expected a pointer type."); } else { if (pR0Type->pHead->tag != TY_FUNC) { pGen->setR0ExpressionType(ET_LVALUE); } } } /* Recursive descent parser for binary operations. */ void binaryOp(int level) { Loading
libacc/tests/data/brackets.c 0 → 100644 +61 −0 Original line number Diff line number Diff line void testBrackets(int* ar, int len) { int i; int errors = 0; for (i = 0; i < len; i++) { ar[i] = i; } for (i = 0; i < len; i++) { if (ar[i] != i) { printf("error: [%d] %d != %d\n", i, ar[i], i); errors++; } } printf("Errors: %d\n", errors); } void testBrackets2D(int** ar2D, int lenX, int lenY) { int x, y; int errors = 0; for (x = 0; x < lenX; x++) { for (y = 0; y < lenY; y++) { ar2D[x][y] = x * lenY + y; } } for (x = 0; x < lenX; x++) { for (y = 0; y < lenY; y++) { int expected = x * lenY + y; int val = ar2D[x][y]; if (val != expected) { printf("error: [%d][%d] %d != %d\n", x, y, val, expected); errors++; } } } printf("2D Errors: %d\n", errors); } void testHeap() { int* ar = (int*) malloc(100); testBrackets(ar, 25); free(ar); } void testHeap2D() { int lenX = 10; int lenY = 5; int* ar = (int*) malloc(lenX * lenY * 4); int** ar2D = (int**) malloc(lenX * 4); int i; for(i = 0; i < lenX; i++) { ar2D[i] = ar + lenY * i; } testBrackets2D(ar2D, lenX, lenY); free(ar); free(ar2D); } int main() { testHeap(); testHeap2D(); return 0; }
libacc/tests/test.py +7 −0 Original line number Diff line number Diff line Loading @@ -368,6 +368,13 @@ return: 30 arg: 12 """) def testBrackets(self): self.compileCheck(["-R", "data/brackets.c"], """Executing compiled code: Errors: 0 2D Errors: 0 result: 0 ""","""""") if __name__ == '__main__': if not outputCanRun(): print "Many tests are expected to fail, because acc is not a 32-bit x86 Linux executable." Loading