* src/SDCCast.c (removePostIncDecOps, removePreIncDecOps),
authorepetrich <epetrich@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Tue, 11 Nov 2003 07:21:52 +0000 (07:21 +0000)
committerepetrich <epetrich@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Tue, 11 Nov 2003 07:21:52 +0000 (07:21 +0000)
* src/SDCCast.h,
* src/SDCC.y: fixed bug #819403

git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@3010 4a8a32a2-be11-0410-ad9d-d568d2c75423

ChangeLog
src/SDCC.y
src/SDCCast.c
src/SDCCast.h

index 1601103611e1fa2484255105b3a92ca9b67c3108..52acb65e55d5b1a926d17bdfc6ed9501de5bb319 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2003-11-11 Erik Petrich <epetrich@ivorytower.norman.ok.us>
+
+       * src/SDCCast.c (removePostIncDecOps, removePreIncDecOps),
+       * src/SDCCast.h,
+       * src/SDCC.y: fixed bug #819403
+
 2003-11-08 Erik Petrich <epetrich@ivorytower.norman.ok.us>
 
        * support/regression/fwk/lib/testfwk.c: printn is recursive and thus needs
index 91eb6aecdf5b45b0eb80ab64b13c253cce43b1e9..fa781d1db136076e8c841b677f2fd7fbca7922b5 100644 (file)
@@ -402,34 +402,45 @@ assignment_expr
                                     $$ = newNode($2,$1,$3);
                                     break;
                             case MUL_ASSIGN:
-                                    $$ = newNode('=',$1,newNode('*',removeIncDecOps(copyAst($1)),$3));
+                                    $$ = newNode('=',removePostIncDecOps(copyAst($1)),
+                                                      newNode('*',removePreIncDecOps(copyAst($1)),$3));
                                     break;
                             case DIV_ASSIGN:
-                                    $$ = newNode('=',$1,newNode('/',removeIncDecOps(copyAst($1)),$3));
+                                    $$ = newNode('=',removePostIncDecOps(copyAst($1)),
+                                                      newNode('/',removePreIncDecOps(copyAst($1)),$3));
                                     break;
                             case MOD_ASSIGN:
-                                    $$ = newNode('=',$1,newNode('%',removeIncDecOps(copyAst($1)),$3));
+                                    $$ = newNode('=',removePostIncDecOps(copyAst($1)),
+                                                      newNode('%',removePreIncDecOps(copyAst($1)),$3));
                                     break;
                             case ADD_ASSIGN:
-                                    $$ = newNode('=',$1,newNode('+',removeIncDecOps(copyAst($1)),$3));
+                                    $$ = newNode('=',removePostIncDecOps(copyAst($1)),
+                                                      newNode('+',removePreIncDecOps(copyAst($1)),$3));
                                     break;
                             case SUB_ASSIGN:
-                                    $$ = newNode('=',$1,newNode('-',removeIncDecOps(copyAst($1)),$3));
+                                    $$ = newNode('=',removePostIncDecOps(copyAst($1)),
+                                                      newNode('-',removePreIncDecOps(copyAst($1)),$3));
                                     break;
                             case LEFT_ASSIGN:
-                                    $$ = newNode('=',$1,newNode(LEFT_OP,removeIncDecOps(copyAst($1)),$3));
+                                    $$ = newNode('=',removePostIncDecOps(copyAst($1)),
+                                                      newNode(LEFT_OP,removePreIncDecOps(copyAst($1)),$3));
                                     break;
                             case RIGHT_ASSIGN:
-                                    $$ = newNode('=',$1,newNode(RIGHT_OP,removeIncDecOps(copyAst($1)),$3));
+                                    $$ = newNode('=',removePostIncDecOps(copyAst($1)),
+                                                      newNode(RIGHT_OP,removePreIncDecOps(copyAst($1)),$3));
                                     break;
                             case AND_ASSIGN:
-                                    $$ = newNode('=',$1,newNode('&',removeIncDecOps(copyAst($1)),$3));
+                                    $$ = newNode('=',removePostIncDecOps(copyAst($1)),
+                                                      newNode('&',removePreIncDecOps(copyAst($1)),$3));
                                     break;
                             case XOR_ASSIGN:
-                                    $$ = newNode('=',$1,newNode('^',removeIncDecOps(copyAst($1)),$3));
+                                    $$ = newNode('=',removePostIncDecOps(copyAst($1)),
+                                                      newNode('^',removePreIncDecOps(copyAst($1)),$3));
                                     break;
                             case OR_ASSIGN:
-                                    $$ = newNode('=',$1,newNode('|',removeIncDecOps(copyAst($1)),$3));
+                                    /* $$ = newNode('=',$1,newNode('|',removeIncDecOps(copyAst($1)),$3)); */
+                                    $$ = newNode('=',removePostIncDecOps(copyAst($1)),
+                                                      newNode('|',removePreIncDecOps(copyAst($1)),$3));
                                     break;
                             default :
                                     $$ = NULL;
index 354a70b2e99e0dbed33c6c9ddf7594e1ebe3f3f2..a788e69a85bf4b30c624b902f14c1979b06469e4 100644 (file)
@@ -273,6 +273,52 @@ ast *removeIncDecOps (ast * tree) {
  return tree;
 }
 
+/*-----------------------------------------------------------------*/
+/* removePreIncDecOps: remove for side effects in *_ASSIGN's       */
+/*                  "*++s += 3" -> "*++s = *++s + 3"               */
+/*-----------------------------------------------------------------*/
+ast *removePreIncDecOps (ast * tree) {
+
+  // traverse the tree and remove pre-inc/dec ops
+
+  if (!tree)
+    return NULL;
+
+  if (tree->type == EX_OP &&
+      (tree->opval.op == INC_OP || tree->opval.op == DEC_OP)) {
+    if (tree->right)
+      tree=tree->right;
+  }
+
+  tree->left=removePreIncDecOps(tree->left);
+  tree->right=removePreIncDecOps(tree->right);
+
+ return tree;
+}
+
+/*-----------------------------------------------------------------*/
+/* removePostIncDecOps: remove for side effects in *_ASSIGN's      */
+/*                  "*s++ += 3" -> "*s++ = *s++ + 3"               */
+/*-----------------------------------------------------------------*/
+ast *removePostIncDecOps (ast * tree) {
+
+  // traverse the tree and remove pre-inc/dec ops
+
+  if (!tree)
+    return NULL;
+
+  if (tree->type == EX_OP &&
+      (tree->opval.op == INC_OP || tree->opval.op == DEC_OP)) {
+    if (tree->left)
+      tree=tree->left;
+  }
+
+  tree->left=removePostIncDecOps(tree->left);
+  tree->right=removePostIncDecOps(tree->right);
+
+ return tree;
+}
+
 /*-----------------------------------------------------------------*/
 /* hasSEFcalls - returns TRUE if tree has a function call          */
 /*-----------------------------------------------------------------*/
@@ -3539,11 +3585,11 @@ decorateType (ast * tree)
       TETYPE (tree) = getSpec (TTYPE (tree) = LTYPE (tree));
 
       if (!tree->initMode && IS_CONSTANT (LTYPE (tree)))
-       werror (E_CODE_WRITE, *tree->opval.op==MUL_ASSIGN ? "*=" : "/=");
+       werror (E_CODE_WRITE, tree->opval.op==MUL_ASSIGN ? "*=" : "/=");
 
       if (LRVAL (tree))
        {
-         werror (E_LVALUE_REQUIRED, *tree->opval.op==MUL_ASSIGN ? "*=" : "/=");
+         werror (E_LVALUE_REQUIRED, tree->opval.op==MUL_ASSIGN ? "*=" : "/=");
          goto errorTreeReturn;
        }
       LLVAL (tree) = 1;
index 24cc4f7aebcc29d398935c85631509a14392eaa5..2054e1df6413db89ceda06e36b71bf0a37f30c38 100644 (file)
@@ -183,6 +183,8 @@ void initAst ();
 ast *newNode (long, ast *, ast *);
 ast *copyAst (ast *);
 ast *removeIncDecOps (ast *);
+ast *removePreIncDecOps (ast *);
+ast *removePostIncDecOps (ast *);
 value *sizeofOp (sym_link *);
 value *evalStmnt (ast *);
 ast *createFunction (symbol *, ast *);