]> git.sur5r.net Git - cc65/blobdiff - src/cc65/stmt.c
Move default segment names into segnames.h
[cc65] / src / cc65 / stmt.c
index 3863c72e5f3bf4a213aeb31851885e2e20b2050d..ab091be3af230a0782f0dee9d566d6d189366e9c 100644 (file)
 
 
 
-/*****************************************************************************/
-/*                                  Data                                    */
-/*****************************************************************************/
-
-
-
-/* Maximum count of cases */
-#define CASE_MAX       257
-
-
-
 /*****************************************************************************/
 /*                            Helper functions                              */
 /*****************************************************************************/
@@ -132,7 +121,7 @@ static int IfStatement (void)
 
     /* Generate a jump label and parse the condition */
     Label1 = GetLocalLabel ();
-    test (Label1, 0);
+    TestInParens (Label1, 0);
 
     /* Parse the if body */
     GotBreak = Statement (0);
@@ -193,7 +182,7 @@ static void DoStatement (void)
 
     /* Parse the end condition */
     Consume (TOK_WHILE, "`while' expected");
-    test (loop, 1);
+    TestInParens (loop, 1);
     ConsumeSemi ();
 
     /* Define the break label */
@@ -224,7 +213,7 @@ static void WhileStatement (void)
     g_defcodelabel (loop);
 
     /* Test the loop condition */
-    test (lab, 0);
+    TestInParens (lab, 0);
 
     /* Loop body */
     Statement (&PendingToken);
@@ -235,8 +224,8 @@ static void WhileStatement (void)
     /* Exit label */
     g_defcodelabel (lab);
 
-    /* Eat remaining tokens that were delayed because of line info 
-     * correctness 
+    /* Eat remaining tokens that were delayed because of line info
+     * correctness
      */
     SkipPending (PendingToken);
 
@@ -253,7 +242,9 @@ static void ReturnStatement (void)
 
     NextToken ();
     if (CurTok.Tok != TOK_SEMI) {
-               if (HasVoidReturn (CurrentFunc)) {
+
+        /* Check if the function has a return value declared */
+               if (F_HasVoidReturn (CurrentFunc)) {
                    Error ("Returning a value in function with return type void");
                }
 
@@ -261,18 +252,19 @@ static void ReturnStatement (void)
        expression (&lval);
 
        /* Convert the return value to the type of the function result */
-       if (!HasVoidReturn (CurrentFunc)) {
-                   assignadjust (GetReturnType (CurrentFunc), &lval);
+       if (!F_HasVoidReturn (CurrentFunc)) {
+                   assignadjust (F_GetReturnType (CurrentFunc), &lval);
        }
-    } else if (!HasVoidReturn (CurrentFunc)) {
-       Error ("Function `%s' must return a value", GetFuncName (CurrentFunc));
+
+    } else if (!F_HasVoidReturn (CurrentFunc) && !F_HasOldStyleIntRet (CurrentFunc)) {
+       Error ("Function `%s' must return a value", F_GetFuncName (CurrentFunc));
     }
 
     /* Cleanup the stack in case we're inside a block with locals */
-    g_space (oursp - GetTopLevelSP (CurrentFunc));
+    g_space (oursp - F_GetTopLevelSP (CurrentFunc));
 
     /* Output a jump to the function exit code */
-    g_jump (GetRetLab (CurrentFunc));
+    g_jump (F_GetRetLab (CurrentFunc));
 }
 
 
@@ -347,7 +339,6 @@ static void ForStatement (void)
 /* Handle a 'for' statement */
 {
     ExprDesc lval1;
-    ExprDesc lval2;
     ExprDesc lval3;
     int HaveIncExpr;
     CodeMark IncExprStart;
@@ -380,8 +371,7 @@ static void ForStatement (void)
 
     /* Parse the test expression */
     if (CurTok.Tok != TOK_SEMI) {
-       boolexpr (&lval2);
-       g_truejump (CF_NONE, lstat);
+        Test (lstat, 1);
        g_jump (lab);
     } else {
        g_jump (lstat);
@@ -554,7 +544,7 @@ int Statement (int* PendingToken)
 
            case TOK_SEMI:
                /* Ignore it */
-               NextToken ();
+               CheckSemi (PendingToken);
                break;
 
            case TOK_PRAGMA:
@@ -572,4 +562,4 @@ int Statement (int* PendingToken)
 
 
 
-     
+