]> git.sur5r.net Git - cc65/commitdiff
Check for const in function parameters (first level only).
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 1 Aug 2000 19:05:24 +0000 (19:05 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 1 Aug 2000 19:05:24 +0000 (19:05 +0000)
Place local static const data into the RODATA segment.

git-svn-id: svn://svn.cc65.org/cc65/trunk@253 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/cc65/error.c
src/cc65/error.h
src/cc65/expr.c
src/cc65/locals.c

index 0821189e1f8256b7c8e0957710920ad508d2808b..4a8a0ecb7e2977fab1eb8f856c5945112d3de064 100644 (file)
@@ -152,7 +152,8 @@ static char* ErrMsg [ERR_COUNT-1] = {
     "Variable has unknown size",
     "Unknown identifier: `%s'",
     "Duplicate qualifier: `%s'",
-    "Assignment to const",
+    "Assignment discards `const' qualifier",
+    "Passing argument %u discards `const' qualifier",
 };
 
 
index 623dae4ff553459a7e3625f473d8f23774360d9c..4220d86a58629a5d4758403414f58c0fe1efea46 100644 (file)
@@ -148,6 +148,7 @@ enum Errors {
     ERR_UNKNOWN_IDENT,
     ERR_DUPLICATE_QUALIFIER,
     ERR_CONST_ASSIGN,
+    ERR_CONST_PARAM,
     ERR_COUNT                          /* Error count */
 };
 
index 7717c780f4d2b136feb9cf8731996924ab9e1fe5..434813220b25965d5120aae1c3919f3127d84f03 100644 (file)
@@ -580,6 +580,16 @@ static void callfunction (struct expent* lval)
         * convert the actual argument to the type needed.
         */
                if (!Ellipsis) {
+           /* If the left side is not const and the right is const, print
+            * an error. Note: This is an incomplete check, since other parts
+            * of the type string may have a const qualifier, but it catches
+            * some errors and is cheap here. We will redo it the right way
+            * as soon as the parser is rewritten. ####
+            */
+           if (!IsConst (Param->Type) && IsConst (lval2.e_tptr)) {
+               Error (ERR_CONST_PARAM, ParamCount);
+           }
+
            /* Promote the argument if needed */
                    assignadjust (Param->Type, &lval2);
            /* If we have a prototype, chars may be pushed as chars */
index 25fb3262f5629650f1fc4f69e242fa6136919c13..3a6e6a5ab3e9e4cc8f8c46142944f201709bcd87 100644 (file)
@@ -191,7 +191,7 @@ static void ParseOneDecl (const DeclSpec* Spec)
                    /* Setup the type flags for the assignment */
                    flags = Size == 1? CF_FORCECHAR : CF_NONE;
 
-                   /* Get the expression into the primary */
+                   /* Get the expression into the primary */
                    if (evalexpr (flags, hie1, &lval) == 0) {
                        /* Constant expression. Adjust the types */
                        assignadjust (Decl.Type, &lval);
@@ -268,20 +268,24 @@ static void ParseOneDecl (const DeclSpec* Spec)
            /* Static data */
            if (curtok == TOK_ASSIGN) {
 
-               /* Initialization ahead, switch to data segment */
-               g_usedata ();
+               /* Initialization ahead, switch to data segment */
+               if (IsConst (Decl.Type)) {
+                   g_userodata ();
+               } else {
+                   g_usedata ();
+               }
 
-               /* Define the variable label */
-               SymData = GetLabel ();
-               g_defloclabel (SymData);
+               /* Define the variable label */
+               SymData = GetLabel ();
+               g_defloclabel (SymData);
 
-               /* Skip the '=' */
-               NextToken ();
+               /* Skip the '=' */
+               NextToken ();
 
-               /* Allow initialization of static vars */
-               ParseInit (Decl.Type);
+               /* Allow initialization of static vars */
+               ParseInit (Decl.Type);
 
-               /* Mark the variable as referenced */
+               /* Mark the variable as referenced */
                SC |= SC_REF;
 
            } else {