For gbdk-2.94. Seems to work.
[fw/sdcc] / src / SDCCval.c
index 5818c72607e7a0453eb3817180a833429f8ec314..daf3f930f4c6497b6ea7bbbde5a9056370864bc7 100644 (file)
@@ -578,7 +578,7 @@ double   floatFromVal ( value *val )
     if (!val)
        return 0;
 
-    if (SPEC_SCLS(val->etype) != S_LITERAL) {
+    if (val->etype && SPEC_SCLS(val->etype) != S_LITERAL) {
        werror(E_CONST_EXPECTED,val->name);
        return 0;
     }
@@ -1198,10 +1198,10 @@ value *valForArray (ast *arrExpr)
     sprintf(val->name,"(%s + %d)",buffer,
            (int)AST_LIT_VALUE(arrExpr->right)*size);    
     
-    val->type = newLink();
+    val->type = newLink();    
     if (SPEC_SCLS(arrExpr->left->etype) == S_CODE) {
        DCL_TYPE(val->type) = CPOINTER ;
-       DCL_PTR_CONST(val->type) = 1;
+       DCL_PTR_CONST(val->type) = port->mem.code_ro;
     }
     else
        if (SPEC_SCLS(arrExpr->left->etype) == S_XDATA)
@@ -1213,7 +1213,10 @@ value *valForArray (ast *arrExpr)
                if (SPEC_SCLS(arrExpr->left->etype) == S_IDATA)
                    DCL_TYPE(val->type) = IPOINTER ;
                else
-                   DCL_TYPE(val->type) = POINTER ;
+                   if (SPEC_SCLS(arrExpr->left->etype) == S_EEPROM)
+                       DCL_TYPE(val->type) = EEPPOINTER ;
+                   else
+                       DCL_TYPE(val->type) = POINTER ;
     val->type->next = arrExpr->left->ftype;
     val->etype = getSpec(val->type);
     return val;
@@ -1267,7 +1270,7 @@ value *valForStructElem(ast *structT, ast *elemT)
     val->type = newLink();
     if (SPEC_SCLS(structT->etype) == S_CODE) {
        DCL_TYPE(val->type) = CPOINTER ;
-       DCL_PTR_CONST(val->type) = 1;
+       DCL_PTR_CONST(val->type) = port->mem.code_ro;
     }
     else
        if (SPEC_SCLS(structT->etype) == S_XDATA)
@@ -1279,7 +1282,10 @@ value *valForStructElem(ast *structT, ast *elemT)
                if (SPEC_SCLS(structT->etype) == S_IDATA)
                    DCL_TYPE(val->type) = IPOINTER ;
                else
-                   DCL_TYPE(val->type) = POINTER ;
+                   if (SPEC_SCLS(structT->etype) == S_EEPROM)
+                       DCL_TYPE(val->type) = EEPPOINTER ;
+                   else
+                       DCL_TYPE(val->type) = POINTER ;
     val->type->next = sym->type;
     val->etype = getSpec(val->type);
     return val;