fixed bug #402254
authorjohanknol <johanknol@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Sun, 13 Jan 2002 12:19:07 +0000 (12:19 +0000)
committerjohanknol <johanknol@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Sun, 13 Jan 2002 12:19:07 +0000 (12:19 +0000)
git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@1793 4a8a32a2-be11-0410-ad9d-d568d2c75423

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

index d3767658b4ac2ffa1f28517435bbaf03a6f9ba3c..83409a13eee5b778e5622d262a60f7db466a8d51 100644 (file)
@@ -406,34 +406,34 @@ assignment_expr
                                     $$ = newNode($2,$1,$3);
                                     break;
                             case MUL_ASSIGN:
-                                    $$ = newNode('=',$1,newNode('*',copyAst($1),$3));
+                                    $$ = newNode('=',$1,newNode('*',removeIncDecOps(copyAst($1)),$3));
                                     break;
                             case DIV_ASSIGN:
-                                    $$ = newNode('=',$1,newNode('/',copyAst($1),$3));
+                                    $$ = newNode('=',$1,newNode('/',removeIncDecOps(copyAst($1)),$3));
                                     break;
                             case MOD_ASSIGN:
-                                    $$ = newNode('=',$1,newNode('%',copyAst($1),$3));
+                                    $$ = newNode('=',$1,newNode('%',removeIncDecOps(copyAst($1)),$3));
                                     break;
                             case ADD_ASSIGN:
-                                    $$ = newNode('=',$1,newNode('+',copyAst($1),$3));
+                                    $$ = newNode('=',$1,newNode('+',removeIncDecOps(copyAst($1)),$3));
                                     break;
                             case SUB_ASSIGN:
-                                    $$ = newNode('=',$1,newNode('-',copyAst($1),$3));
+                                    $$ = newNode('=',$1,newNode('-',removeIncDecOps(copyAst($1)),$3));
                                     break;
                             case LEFT_ASSIGN:
-                                    $$ = newNode('=',$1,newNode(LEFT_OP,copyAst($1),$3));
+                                    $$ = newNode('=',$1,newNode(LEFT_OP,removeIncDecOps(copyAst($1)),$3));
                                     break;
                             case RIGHT_ASSIGN:
-                                    $$ = newNode('=',$1,newNode(RIGHT_OP,copyAst($1),$3));
+                                    $$ = newNode('=',$1,newNode(RIGHT_OP,removeIncDecOps(copyAst($1)),$3));
                                     break;
                             case AND_ASSIGN:
-                                    $$ = newNode('=',$1,newNode('&',copyAst($1),$3));
+                                    $$ = newNode('=',$1,newNode('&',removeIncDecOps(copyAst($1)),$3));
                                     break;
                             case XOR_ASSIGN:
-                                    $$ = newNode('=',$1,newNode('^',copyAst($1),$3));
+                                    $$ = newNode('=',$1,newNode('^',removeIncDecOps(copyAst($1)),$3));
                                     break;
                             case OR_ASSIGN:
-                                    $$ = newNode('=',$1,newNode('|',copyAst($1),$3));
+                                    $$ = newNode('=',$1,newNode('|',removeIncDecOps(copyAst($1)),$3));
                                     break;
                             default :
                                     $$ = NULL;
index 85ea2852e1b4b6287e8297b2f2eb58e6fa71c9be..dfb3ad05d9550b67640489dac1eafae661aab514 100644 (file)
@@ -210,7 +210,7 @@ copyAstValues (ast * dest, ast * src)
 /* copyAst - makes a copy of a given astession                     */
 /*-----------------------------------------------------------------*/
 ast *
-copyAst (ast * src)
+copyAst (ast * src) 
 {
   ast *dest;
 
@@ -256,6 +256,31 @@ exit:
 
 }
 
+/*-----------------------------------------------------------------*/
+/* removeIncDecOps: remove for side effects in *_ASSIGN's          */
+/*                  "*s++ += 3" -> "*s++ = *s++ + 3"               */
+/*-----------------------------------------------------------------*/
+ast *removeIncDecOps (ast * tree) {
+
+  // traverse the tree and remove 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;
+    else 
+      tree=tree->right;
+  }
+
+  tree->left=removeIncDecOps(tree->left);
+  tree->right=removeIncDecOps(tree->right);
+ return tree;
+}
+
 /*-----------------------------------------------------------------*/
 /* hasSEFcalls - returns TRUE if tree has a function call          */
 /*-----------------------------------------------------------------*/
@@ -2946,6 +2971,7 @@ decorateType (ast * tree)
       return tree;
 
 
+#if 0 // assignment operators are converted by the parser
       /*------------------------------------------------------------------*/
       /*----------------------------*/
       /*    assignment operators    */
@@ -3078,6 +3104,7 @@ decorateType (ast * tree)
       tree->opval.op = '=';
 
       return tree;
+#endif
 
       /*------------------------------------------------------------------*/
       /*----------------------------*/
index 31a12aceed63d2b62808a7a46a51f0ea9bb21248..d42b7c6c962d21c6fc129408f2710c00965ff580 100644 (file)
@@ -180,6 +180,7 @@ ast *newAst_STMNT (unsigned val);
 void initAst ();
 ast *newNode (long, ast *, ast *);
 ast *copyAst (ast *);
+ast *removeIncDecOps (ast *);
 value *sizeofOp (sym_link *);
 value *evalStmnt (ast *);
 ast *createFunction (symbol *, ast *);
index 9a4c15fada0e44a2015a38a621c1c55ccfb8d647..4033ed53b8b6150f6b055bb955fa15878a9bd47e 100644 (file)
@@ -158,6 +158,9 @@ emitRegularMap (memmap * map, bool addPublics, bool arFlag)
   ast *ival = NULL;
   memmap *segment;
 
+  if (!map)
+    return;
+
   if (addPublics)
     {
       /* PENDING: special case here - should remove */