+ /* this is not a unary operation */
+ /* if both pointers then problem */
+ if (IS_PTR (LTYPE (tree)) && IS_PTR (RTYPE (tree)))
+ {
+ werror (E_PTR_PLUS_PTR);
+ goto errorTreeReturn;
+ }
+
+ if (!IS_ARITHMETIC (LTYPE (tree)) && !IS_PTR (LTYPE (tree)))
+ {
+ werror (E_PLUS_INVALID, "+=");
+ goto errorTreeReturn;
+ }
+
+ if (!IS_ARITHMETIC (RTYPE (tree)) && !IS_PTR (RTYPE (tree)))
+ {
+ werror (E_PLUS_INVALID, "+=");
+ goto errorTreeReturn;
+ }
+ RRVAL (tree) = 1;
+ TETYPE (tree) = getSpec (TTYPE (tree) =
+ computeType (LTYPE (tree),
+ RTYPE (tree)));
+
+ if (!tree->initMode && IS_CONSTANT (LETYPE (tree)))
+ werror (E_CODE_WRITE, " ");
+
+ if (LRVAL (tree))
+ {
+ werror (E_LVALUE_REQUIRED, "+=");
+ goto errorTreeReturn;
+ }
+
+ tree->right = decorateType (newNode ('+', copyAst (tree->left), tree->right));
+ tree->opval.op = '=';
+
+ propAsgType (tree);
+
+ return tree;
+
+/*------------------------------------------------------------------*/
+/*----------------------------*/
+ /* straight assignemnt */
+/*----------------------------*/
+ case '=':
+ /* cannot be an aggregate */
+ if (IS_AGGREGATE (LTYPE (tree)))
+ {
+ werror (E_AGGR_ASSIGN);
+ goto errorTreeReturn;
+ }
+
+ /* they should either match or be castable */
+ if (checkType (LTYPE (tree), RTYPE (tree)) == 0)
+ {
+ werror (E_TYPE_MISMATCH, "assignment", " ");
+ fprintf (stderr, "type --> '");
+ printTypeChain (RTYPE (tree), stderr);
+ fprintf (stderr, "' ");
+ fprintf (stderr, "assigned to type --> '");
+ printTypeChain (LTYPE (tree), stderr);
+ fprintf (stderr, "'\n");
+ goto errorTreeReturn;
+ }
+
+ /* if the left side of the tree is of type void
+ then report error */
+ if (IS_VOID (LTYPE (tree)))
+ {
+ werror (E_CAST_ZERO);
+ fprintf (stderr, "type --> '");
+ printTypeChain (RTYPE (tree), stderr);
+ fprintf (stderr, "' ");
+ fprintf (stderr, "assigned to type --> '");
+ printTypeChain (LTYPE (tree), stderr);
+ fprintf (stderr, "'\n");
+ }
+
+ /* extra checks for pointer types */
+ if (IS_PTR (LTYPE (tree)) && IS_PTR (RTYPE (tree)) &&
+ !IS_GENPTR (LTYPE (tree)))
+ {
+ if (DCL_TYPE (LTYPE (tree)) != DCL_TYPE (RTYPE (tree)))
+ werror (W_PTR_ASSIGN);
+ }
+
+ TETYPE (tree) = getSpec (TTYPE (tree) =
+ LTYPE (tree));
+ RRVAL (tree) = 1;
+ LLVAL (tree) = 1;
+ if (!tree->initMode && IS_CONSTANT (LETYPE (tree)))
+ werror (E_CODE_WRITE, " ");
+
+ if (LRVAL (tree))
+ {
+ werror (E_LVALUE_REQUIRED, "=");
+ goto errorTreeReturn;
+ }
+
+ propAsgType (tree);
+
+ return tree;
+
+/*------------------------------------------------------------------*/
+/*----------------------------*/
+ /* comma operator */
+/*----------------------------*/
+ case ',':
+ TETYPE (tree) = getSpec (TTYPE (tree) = RTYPE (tree));
+ return tree;
+
+/*------------------------------------------------------------------*/
+/*----------------------------*/
+ /* function call */
+/*----------------------------*/
+ case CALL:
+ parmNumber = 1;
+
+ if (processParms (tree->left,
+ tree->left->args,
+ tree->right, &parmNumber, TRUE))
+ goto errorTreeReturn;
+
+ if (options.stackAuto || IS_RENT (LETYPE (tree)))
+ {
+ tree->left->args = reverseVal (tree->left->args);
+ reverseParms (tree->right);
+ }
+
+ tree->args = tree->left->args;
+ TETYPE (tree) = getSpec (TTYPE (tree) = LTYPE (tree)->next);
+ return tree;
+
+/*------------------------------------------------------------------*/
+/*----------------------------*/
+ /* return statement */
+/*----------------------------*/
+ case RETURN:
+ if (!tree->right)
+ goto voidcheck;
+
+ if (checkType (currFunc->type->next, RTYPE (tree)) == 0)
+ {
+ werror (E_RETURN_MISMATCH);
+ goto errorTreeReturn;