fixed bug #436360 part 2
[fw/sdcc] / src / SDCCast.c
index 4d5c02a3ae3f5fe75f2caed974e3679db91094ca..9812f66bbf04b34c3e1c2e11cbc5d0955e8d1a07 100644 (file)
@@ -23,7 +23,6 @@
 -------------------------------------------------------------------------*/
 
 #include "common.h"
-#include "newalloc.h"
 
 int currLineno = 0;
 set *astList = NULL;
@@ -46,7 +45,6 @@ int labelKey = 1;
 #define ALLOCATE 1
 #define DEALLOCATE 2
 
-char buffer[1024];
 int noLineno = 0;
 int noAlloc = 0;
 symbol *currFunc;
@@ -76,7 +74,7 @@ newAst (int type, void *op)
   ast *ex;
   static int oldLineno = 0;
 
-  Safe_calloc (1, ex, sizeof (ast));
+  ex = Safe_alloc ( sizeof (ast));
 
   ex->type = type;
   ex->lineno = (noLineno ? oldLineno : yylineno);
@@ -111,7 +109,7 @@ newAst_ (unsigned type)
   ast *ex;
   static int oldLineno = 0;
 
-  ex = Safe_calloc (1, sizeof (ast));
+  ex = Safe_alloc ( sizeof (ast));
 
   ex->type = type;
   ex->lineno = (noLineno ? oldLineno : yylineno);
@@ -222,7 +220,7 @@ copyAstValues (ast * dest, ast * src)
       break;
 
     case INLINEASM:
-      dest->values.inlineasm = Safe_calloc (1, strlen (src->values.inlineasm) + 1);
+      dest->values.inlineasm = Safe_alloc (strlen (src->values.inlineasm) + 1);
       strcpy (dest->values.inlineasm, src->values.inlineasm);
       break;
 
@@ -253,7 +251,7 @@ copyAst (ast * src)
   if (!src)
     return NULL;
 
-  dest = Safe_calloc (1, sizeof (ast));
+  dest = Safe_alloc ( sizeof (ast));
 
   dest->type = src->type;
   dest->lineno = src->lineno;
@@ -607,8 +605,8 @@ int
 processParms (ast * func,
              value * defParm,
              ast * actParm,
-             int *parmNumber,
-             bool rightmost)
+             int *parmNumber, // unused, although updated
+             bool rightmost) // double checked?
 {
   sym_link *fetype = func->etype;
 
@@ -618,7 +616,7 @@ processParms (ast * func,
 
   if (defParm) {
     if (getenv("DEBUG_SANITY")) {
-      fprintf (stderr, "addSym: %s ", defParm->name);
+      fprintf (stderr, "processParms: %s ", defParm->name);
     }
     /* make sure the type is complete and sane */
     checkTypeSanity(defParm->etype, defParm->name);
@@ -635,9 +633,9 @@ processParms (ast * func,
 
   /* if defined parameters ended but actual parameters */
   /* exist and this is not defined as a variable arg   */
-  /* also check if statckAuto option is specified      */
-  if ((!defParm) && actParm && (!func->hasVargs) &&
-      !options.stackAuto && !IS_RENT (fetype))
+  /* also check if statckAuto option is specified      */ // jwk: WHY?
+  if ((!defParm) && actParm && (!func->hasVargs) 
+      /* && !options.stackAuto && !IS_RENT (fetype) */)
     {
       werror (E_TOO_MANY_PARMS);
       return 1;
@@ -743,16 +741,16 @@ processParms (ast * func,
        }
     }
 
-
   /* the parameter type must be at least castable */
   if (compareType (defParm->type, actParm->ftype) == 0) {
-    werror (W_INCOMPAT_CAST);
+    werror (E_INCOMPAT_TYPES);
     fprintf (stderr, "type --> '");
     printTypeChain (actParm->ftype, stderr);
     fprintf (stderr, "' ");
     fprintf (stderr, "assigned to type --> '");
     printTypeChain (defParm->type, stderr);
     fprintf (stderr, "'\n");
+    return 1;
   }
 
   /* if the parameter is castable then add the cast */
@@ -1107,7 +1105,7 @@ gatherAutoInit (symbol * autoChain)
          /* insert the symbol into the symbol table */
          /* with level = 0 & name = rname       */
          newSym = copySymbol (sym);
-         addSym (SymbolTab, newSym, newSym->name, 0, 0, 1);
+         addSym (SymbolTab, newSym, newSym->rname, 0, 0, 1);
 
          /* now lift the code to main */
          if (IS_AGGREGATE (sym->type))
@@ -1221,6 +1219,7 @@ processBlockVars (ast * tree, int *stack, int action)
 
 /*-----------------------------------------------------------------*/
 /* constExprValue - returns the value of a constant expression     */
+/*                  or NULL if it is not a constant expression     */
 /*-----------------------------------------------------------------*/
 value *
 constExprValue (ast * cexpr, int check)
@@ -1258,7 +1257,7 @@ constExprValue (ast * cexpr, int check)
       if (check)
        werror (E_CONST_EXPECTED, "found expression");
 
-      return constVal("0");
+      return NULL;
     }
 
   /* return the value */
@@ -2082,7 +2081,7 @@ decorateType (ast * tree)
       {
        sym_link *ltc = (tree->right ? RTYPE (tree) : LTYPE (tree));
        COPYTYPE (TTYPE (tree), TETYPE (tree), ltc);
-       if (!tree->initMode && IS_CONSTANT (TETYPE (tree)))
+       if (!tree->initMode && IS_CONSTANT(TETYPE(tree)))
          werror (E_CODE_WRITE, "++/--");
 
        if (tree->right)
@@ -2732,7 +2731,7 @@ decorateType (ast * tree)
       /* make sure the type is complete and sane */
       checkTypeSanity(LETYPE(tree), "(cast)");
 
-#if 1
+#if 0
       /* if the right is a literal replace the tree */
       if (IS_LITERAL (RETYPE (tree))) {
              if (!IS_PTR (LTYPE (tree))) {
@@ -3106,22 +3105,13 @@ decorateType (ast * tree)
          fprintf (stderr, "'\n");
        }
 
-      /* extra checks for pointer types */
-      if (IS_PTR (LTYPE (tree)) && IS_PTR (RTYPE (tree)) &&
-         !IS_GENPTR (LTYPE (tree)))
-       {
-         if (DCL_TYPE (LTYPE (tree)) != DCL_TYPE (RTYPE (tree)))
-           werror (W_PTR_ASSIGN);
-       }
-
       TETYPE (tree) = getSpec (TTYPE (tree) =
                               LTYPE (tree));
       RRVAL (tree) = 1;
       LLVAL (tree) = 1;
       if (!tree->initMode ) {
-             if (IS_CONSTANT (LETYPE (tree))) {
-                     werror (E_CODE_WRITE, " ");
-             } 
+       if ((IS_SPEC(LETYPE(tree)) && IS_CONSTANT (LETYPE (tree))))
+         werror (E_CODE_WRITE, " ");
       }
       if (LRVAL (tree))
        {
@@ -3174,6 +3164,11 @@ decorateType (ast * tree)
       if (compareType (currFunc->type->next, RTYPE (tree)) == 0)
        {
          werror (W_RETURN_MISMATCH);
+         fprintf (stderr, "from type '");
+         printTypeChain (RTYPE(tree), stderr);
+         fprintf (stderr, "' to type '");
+         printTypeChain (currFunc->type->next, stderr);
+         fprintf (stderr, "'\n");
          goto errorTreeReturn;
        }