This wasn't true
[fw/sdcc] / src / SDCCast.c
index fe878f9f29cda6b71acf43f0f1b849cdb0bb9496..ddad912515bca9a6a8e6095a918ce5f87100f455 100644 (file)
@@ -2895,10 +2895,17 @@ decorateType (ast * tree)
       /* if they are pointers they must be castable */
       if (IS_PTR (LTYPE (tree)) && IS_PTR (RTYPE (tree)))
        {
+         if (tree->opval.op==EQ_OP && 
+             !IS_GENPTR(LTYPE(tree)) && IS_GENPTR(RTYPE(tree))) {
+           // we cannot cast a gptr to a !gptr: switch the leaves
+           struct ast *s=tree->left;
+           tree->left=tree->right;
+           tree->right=s;
+         }
          if (compareType (LTYPE (tree), RTYPE (tree)) == 0)
            {
              werror (E_COMPARE_OP);
-             fprintf (stderr, "comparing type ");
+             fprintf (stderr, "comparring type ");
              printTypeChain (LTYPE (tree), stderr);
              fprintf (stderr, "to type ");
              printTypeChain (RTYPE (tree), stderr);
@@ -3447,7 +3454,7 @@ backPatchLabels (ast * tree, symbol * trueLabel, symbol * falseLabel)
       static int localLbl = 0;
       symbol *localLabel;
 
-      SNPRINTF(buffer, sizeof(buffer), "_and_%d", localLbl++);
+      SNPRINTF(buffer, sizeof(buffer), "_andif_%d", localLbl++);
       localLabel = newSymbol (buffer, NestLevel);
 
       tree->left = backPatchLabels (tree->left, localLabel, falseLabel);
@@ -3473,7 +3480,7 @@ backPatchLabels (ast * tree, symbol * trueLabel, symbol * falseLabel)
       static int localLbl = 0;
       symbol *localLabel;
 
-      SNPRINTF(buffer, sizeof(buffer), "_or_%d", localLbl++);
+      SNPRINTF(buffer, sizeof(buffer), "_orif_%d", localLbl++);
       localLabel = newSymbol (buffer, NestLevel);
 
       tree->left = backPatchLabels (tree->left, trueLabel, localLabel);
@@ -4487,9 +4494,7 @@ void ast_print (ast * tree, FILE *outfile, int indent)
                return;
        }
        if (tree->opval.op == NULLOP) {
-               fprintf(outfile,"\n");
                ast_print(tree->left,outfile,indent);
-               fprintf(outfile,"\n");
                ast_print(tree->right,outfile,indent);
                return ;
        }
@@ -5049,15 +5054,23 @@ void ast_print (ast * tree, FILE *outfile, int indent)
                fprintf(outfile,"IF (%p) \n",tree);
                ast_print(tree->left,outfile,indent+2);
                if (tree->trueLabel) {
-                       INDENT(indent,outfile);
+                       INDENT(indent+2,outfile);
                        fprintf(outfile,"NE(!=) 0 goto %s\n",tree->trueLabel->name);
                }
                if (tree->falseLabel) {
-                       INDENT(indent,outfile);
+                       INDENT(indent+2,outfile);
                        fprintf(outfile,"EQ(==) 0 goto %s\n",tree->falseLabel->name);
                }
                ast_print(tree->right,outfile,indent+2);
                return ;
+               /*----------------------------*/
+               /* goto Statement              */
+               /*----------------------------*/
+       case GOTO:
+               fprintf(outfile,"GOTO (%p) \n",tree);
+               ast_print(tree->left,outfile,indent+2);
+               fprintf(outfile,"\n");
+               return ;
                /*------------------------------------------------------------------*/
                /*----------------------------*/
                /* for Statement              */