* src/SDCCsymt.c (compareType): fixed bugs 1738367 and 1745717 with patch
[fw/sdcc] / src / SDCCsymt.c
index a2fd33ce83a39869d6a5b78f2e029aa4e801a324..e686c296d9a332c69cbf6136c8e76c75f0bab2ed 100644 (file)
@@ -293,11 +293,11 @@ newSymbol (char *name, int scope)
 
   sym = Safe_alloc ( sizeof (symbol));
 
-  strncpyz (sym->name, name, sizeof(sym->name));        /* copy the name */
-  sym->level = scope;           /* set the level    */
+  strncpyz (sym->name, name, sizeof(sym->name)); /* copy the name */
+  sym->level = scope;           /* set the level */
   sym->block = currBlockno;
-  sym->lineDef = lineno;        /* set the line number */
-  sym->fileDef = filename;
+  sym->lineDef = lexLineno;    /* set the line number */
+  sym->fileDef = lexFilename;
   return sym;
 }
 
@@ -655,6 +655,7 @@ mergeSpec (sym_link * dest, sym_link * src, char *name)
   dest->select.s.b_signed|=src->select.s.b_signed;
   SPEC_STAT (dest) |= SPEC_STAT (src);
   SPEC_EXTR (dest) |= SPEC_EXTR (src);
+  SPEC_INLINE (dest) |= SPEC_INLINE (src);
   SPEC_CONST(dest) |= SPEC_CONST (src);
   SPEC_ABSA (dest) |= SPEC_ABSA (src);
   SPEC_VOLATILE (dest) |= SPEC_VOLATILE (src);
@@ -684,6 +685,7 @@ mergeSpec (sym_link * dest, sym_link * src, char *name)
   FUNC_ISOVERLAY(dest) |= FUNC_ISOVERLAY(src);
   FUNC_INTNO(dest) |= FUNC_INTNO(src);
   FUNC_REGBANK(dest) |= FUNC_REGBANK(src);
+  FUNC_ISINLINE (dest) |= FUNC_ISINLINE (src);
 
   return dest;
 }
@@ -1072,17 +1074,26 @@ addSymChain (symbol ** symHead)
 
       if (!sym->level && !(IS_SPEC(sym->etype) && IS_TYPEDEF(sym->etype)))
         checkDecl (sym, 0);
+      else
+        {
+          /* if this is an array without any dimension
+             then update the dimension from the initial value */
+          if (IS_ARRAY (sym->type) && !DCL_ELEM (sym->type))
+            DCL_ELEM (sym->type) = getNelements (sym->type, sym->ival);
+        }
 
       /* if already exists in the symbol table then check if
-         one of them is an extern definition if yes then
-         then check if the type match, if the types match then
-         delete the current entry and add the new entry      */
+           one of them is an extern definition;
+         if yes then then check if the type match;
+         if the types match then delete the current entry and
+           add the new entry */
       if ((csym = findSymWithLevel (SymbolTab, sym)) &&
           csym->level == sym->level)
         {
-          /* if not in file scope then show symbol redefined error
+          /* if not formal parameter and not in file scope
+             then show symbol redefined error
              else check if symbols have conpatible types */
-          if (sym->level > 0)
+          if (!sym->_isparm && sym->level > 0)
             error = 1;
           else
             {
@@ -1583,7 +1594,7 @@ checkSClass (symbol * sym, int isProto)
 
   /* automatic symbols cannot be given   */
   /* an absolute address ignore it      */
-  if (sym->level &&
+  if (sym->level && !IS_STATIC(sym->etype) &&
       SPEC_ABSA (sym->etype) &&
       (options.stackAuto || reentrant))
     {
@@ -1893,6 +1904,17 @@ computeType (sym_link * type1, sym_link * type2,
 
   switch (resultType)
     {
+      case RESULT_TYPE_IFX:
+        if (TARGET_IS_HC08)
+          break;
+        //fallthrough
+      case RESULT_TYPE_BIT:
+        if (op == ':')
+          {
+            SPEC_NOUN (reType) = V_BIT;
+            return rType;
+          }
+        break;
       case RESULT_TYPE_CHAR:
         if (IS_BITVAR (reType))
           {
@@ -2048,27 +2070,31 @@ compareType (sym_link * dest, sym_link * src)
               return compareType (dest->next, src->next);
             }
 
-          if (DCL_TYPE (src) == DCL_TYPE (dest)) {
-            if (IS_FUNC(src)) {
-              //checkFunction(src,dest);
+          if (DCL_TYPE (src) == DCL_TYPE (dest))
+            {
+              if (IS_FUNC(src))
+                {
+                  //checkFunction(src,dest);
+                }
+              return compareType (dest->next, src->next);
+            }
+          if (IS_PTR (dest) && IS_GENPTR (src) && IS_VOID(src->next))
+            {
+              return -1;
             }
-            return compareType (dest->next, src->next);
-          }
-          if (IS_PTR (dest) && IS_GENPTR (src) && IS_VOID(src->next)) {
-            return -1;
-          }
           if (IS_PTR (src) && 
               (IS_GENPTR (dest) ||
                ((DCL_TYPE(src) == POINTER) && (DCL_TYPE(dest) == IPOINTER))
              ))
             return -1;
-          if (IS_PTR (dest) && IS_ARRAY (src)) {
-            value *val=aggregateToPointer (valFromType(src));
-            int res=compareType (dest, val->type);
-            Safe_free(val->type);
-            Safe_free(val);
-            return res;
-          }
+          if (IS_PTR (dest) && IS_ARRAY (src))
+            {
+              value *val=aggregateToPointer (valFromType(src));
+              int res=compareType (dest, val->type);
+              Safe_free(val->type);
+              Safe_free(val);
+              return res;
+            }
           if (IS_PTR (dest) && IS_FUNC (dest->next) && IS_FUNC (src))
             return compareType (dest->next, src);
           return 0;
@@ -2110,7 +2136,7 @@ compareType (sym_link * dest, sym_link * src)
              instead of the next two lines, but the regression tests fail with
              them; I guess it's a problem with replaceCheaperOp  */
           getSize (dest) == getSize (src) &&
-          !(!IS_BIT (dest) && IS_BIT (src)))
+          (IS_BIT (dest) == IS_BIT (src)))
         return 1;
       else if (IS_ARITHMETIC (dest) && IS_ARITHMETIC (src))
         return -1;
@@ -2415,7 +2441,14 @@ checkFunction (symbol * sym, symbol *csym)
       werror(E_SYNTAX_ERROR, sym->name);
       return 0;
     }
-    
+  
+  /* move inline specifier from return type to function attributes */
+  if (IS_INLINE (sym->etype))
+    {
+      SPEC_INLINE (sym->etype) = 0;
+      FUNC_ISINLINE (sym->type) = 1;
+    }
+
   /* make sure the type is complete and sane */
   checkTypeSanity(((symbol *)sym)->etype, ((symbol *)sym)->name);
 
@@ -2873,6 +2906,9 @@ dbuf_printTypeChain (sym_link * start, struct dbuf_s *dbuf)
             if (DCL_PTR_CONST (type)) {
               dbuf_append_str (dbuf, "const-");
             }
+            if (DCL_PTR_RESTRICT (type)) {
+              dbuf_append_str (dbuf, "restrict-");
+            }
           }
           switch (DCL_TYPE (type))
             {
@@ -3024,10 +3060,16 @@ printTypeChainRaw (sym_link * start, FILE * of)
             if (DCL_PTR_CONST (type)) {
               fprintf (of, "const-");
             }
+            if (DCL_PTR_RESTRICT (type)) {
+              fprintf (of, "restrict-");
+            }
           }
           switch (DCL_TYPE (type))
             {
             case FUNCTION:
+              if (IFFUNC_ISINLINE(type)) {
+                fprintf (of, "inline-");
+              }
               fprintf (of, "function %s %s", 
                        (IFFUNC_ISBUILTIN(type) ? "__builtin__" : " "),
                        (IFFUNC_ISJAVANATIVE(type) ? "_JavaNative" : " "));