* src/SDCCast.c (removePostIncDecOps, removePreIncDecOps),
[fw/sdcc] / src / SDCC.y
index 96fbfb1030bdd2a274005a90f2e63a2c86ab3cc6..fa781d1db136076e8c841b677f2fd7fbca7922b5 100644 (file)
@@ -94,7 +94,7 @@ bool uselessDecl = TRUE;
 %token BITWISEAND UNARYMINUS IPUSH IPOP PCALL  ENDFUNCTION JUMPTABLE
 %token RRC RLC 
 %token CAST CALL PARAM NULLOP BLOCK LABEL RECEIVE SEND ARRAYINIT
-%token DUMMY_READ_VOLATILE ENDCRITICAL
+%token DUMMY_READ_VOLATILE ENDCRITICAL SWAP
 
 %type <yyint>  Interrupt_storage
 %type <sym> identifier  declarator  declarator2 enumerator_list enumerator
@@ -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;
@@ -976,16 +987,20 @@ declarator2
             sym_link   *p ;
                        value *tval;
                        
-            p = (tval = constExprValue($3,TRUE))->etype;
+            tval = constExprValue($3,TRUE);
             /* if it is not a constant then Error  */
-            if ( SPEC_SCLS(p) != S_LITERAL)
+            p = newLink (DECLARATOR);
+            DCL_TYPE(p) = ARRAY ;
+            if ( !tval || (SPEC_SCLS(tval->etype) != S_LITERAL)) {
                werror(E_CONST_EXPECTED) ;
+               /* Assume a single item array to limit the cascade */
+               /* of additional errors. */
+               DCL_ELEM(p) = 1;
+            }
             else {
-               p = newLink (DECLARATOR);
-               DCL_TYPE(p) = ARRAY ;
                DCL_ELEM(p) = (int) floatFromVal(tval) ;
-               addDecl($1,0,p);
             }                          
+            addDecl($1,0,p);
          }
    | declarator2 '('  ')'      {  addDecl ($1,FUNCTION,NULL) ;   }
    | declarator2 '(' { NestLevel++ ; currBlockno++; } parameter_type_list ')'