/* */
/* */
/* */
-/* (C) 1998-2001 Ullrich von Bassewitz */
+/* (C) 1998-2003 Ullrich von Bassewitz */
/* Wacholderweg 14 */
/* D-70597 Stuttgart */
/* EMail: uz@cc65.org */
#include "swstmt.h"
#include "symtab.h"
#include "stmt.h"
+#include "typeconv.h"
*/
{
if (CurTok.Tok != Tok) {
- Error (Msg);
+ Error (Msg);
} else if (PendingToken) {
- *PendingToken = 1;
+ *PendingToken = 1;
} else {
- NextToken ();
+ NextToken ();
}
}
static void CheckSemi (int* PendingToken)
-/* Helper function for Statement. Will call CheckTok with the parameters
- * for a semicolon.
+/* Helper function for Statement. Will check for a semicolon and print an
+ * error message if not found (plus some error recovery). If PendingToken is
+ * NULL, it will the skip the token, otherwise it will store one to
+ * PendingToken.
+ * This function is a special version of CheckTok with the addition of the
+ * error recovery.
*/
{
- CheckTok (TOK_SEMI, "`;' expected", PendingToken);
+ int HaveToken = (CurTok.Tok == TOK_SEMI);
+ if (!HaveToken) {
+ Error ("`;' expected");
+ /* Try to be smart about errors */
+ if (CurTok.Tok == TOK_COLON || CurTok.Tok == TOK_COMMA) {
+ HaveToken = 1;
+ }
+ }
+ if (HaveToken) {
+ if (PendingToken) {
+ *PendingToken = 1;
+ } else {
+ NextToken ();
+ }
+ }
}
static void ReturnStatement (void)
/* Handle the 'return' statement */
{
- ExprDesc lval;
+ ExprDesc Expr;
+ int k;
NextToken ();
if (CurTok.Tok != TOK_SEMI) {
Error ("Returning a value in function with return type void");
}
- /* Evaluate the return expression. Result will be in primary */
- expression (&lval);
+ /* Evaluate the return expression */
+ k = hie0 (InitExprDesc (&Expr));
- /* Convert the return value to the type of the function result */
+ /* Ignore the return expression if the function returns void */
if (!F_HasVoidReturn (CurrentFunc)) {
- assignadjust (F_GetReturnType (CurrentFunc), &lval);
+
+ /* Convert the return value to the type of the function result */
+ k = TypeConversion (&Expr, k, F_GetReturnType (CurrentFunc));
+
+ /* Load the value into the primary */
+ ExprLoad (CF_NONE, k, &Expr);
}
} else if (!F_HasVoidReturn (CurrentFunc) && !F_HasOldStyleIntRet (CurrentFunc)) {