X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCast.c;h=441bedc9105bed4feccc0f20c93d5192574fbd07;hb=021a4213483a23736906ffd68d004c58e062d086;hp=73d2d51fd9271505c52e052b99ee421f10e21b92;hpb=bc596a054ba6acf160ae9ff75a6b369241143c50;p=fw%2Fsdcc diff --git a/src/SDCCast.c b/src/SDCCast.c index 73d2d51f..441bedc9 100644 --- a/src/SDCCast.c +++ b/src/SDCCast.c @@ -605,7 +605,7 @@ processParms (ast * func, value *defParm, ast * actParm, int *parmNumber, // unused, although updated - bool rightmost) // double checked? + bool rightmost) { /* if none of them exist */ if (!defParm && !actParm) @@ -760,6 +760,8 @@ processParms (ast * func, actParm->right = pTree; actParm->etype = defParm->etype; actParm->ftype = defParm->type; + actParm->decorated=0; /* force typechecking */ + decorateType (actParm); } /* make a copy and change the regparm type to the defined parm */ @@ -2719,6 +2721,12 @@ decorateType (ast * tree) LRVAL (tree) = 1; } #else + /* if pointer to struct then check names */ + if (IS_PTR(LTYPE(tree)) && IS_STRUCT(LTYPE(tree)->next) && + IS_PTR(RTYPE(tree)) && IS_STRUCT(RTYPE(tree)->next) && + strcmp(SPEC_STRUCT(LETYPE(tree))->tag,SPEC_STRUCT(RETYPE(tree))->tag)) { + werror(W_CAST_STRUCT_PTR,SPEC_STRUCT(RETYPE(tree))->tag,SPEC_STRUCT(LETYPE(tree))->tag); + } /* if the right is a literal replace the tree */ if (IS_LITERAL (RETYPE (tree)) && !IS_PTR (LTYPE (tree))) { tree->type = EX_VALUE; @@ -2733,8 +2741,7 @@ decorateType (ast * tree) TTYPE (tree) = LTYPE (tree); LRVAL (tree) = 1; } -#endif - +#endif TETYPE (tree) = getSpec (TTYPE (tree)); return tree; @@ -3093,13 +3100,14 @@ decorateType (ast * tree) if (processParms (tree->left, FUNC_ARGS(tree->left->ftype), - tree->right, &parmNumber, TRUE)) + tree->right, &parmNumber, TRUE)) { goto errorTreeReturn; + } if (options.stackAuto || IFFUNC_ISREENT (LTYPE (tree))) { - //IFFUNC_ARGS(tree->left->ftype) = - //reverseVal (IFFUNC_ARGS(tree->left->ftype)); + //FUNC_ARGS(tree->left->ftype) = + //reverseVal (FUNC_ARGS(tree->left->ftype)); reverseParms (tree->right); } @@ -4100,6 +4108,9 @@ createFunction (symbol * name, ast * body) sym_link *fetype; iCode *piCode = NULL; + if (getenv("SDCC_DEBUG_FUNCTION_POINTERS")) + fprintf (stderr, "SDCCast.c:createFunction(%s)\n", name->name); + /* if check function return 0 then some problem */ if (checkFunction (name, NULL) == 0) return NULL; @@ -4130,7 +4141,10 @@ createFunction (symbol * name, ast * body) } name->lastLine = yylineno; currFunc = name; - processFuncArgs (currFunc, 0); + +#if 0 // jwk: this is now done in addDecl() + processFuncArgs (currFunc); +#endif /* set the stack pointer */ /* PENDING: check this for the mcs51 */ @@ -4171,7 +4185,7 @@ createFunction (symbol * name, ast * body) body = resolveSymbols (body); /* resolve the symbols */ body = decorateType (body); /* propagateType & do semantic checks */ - ex = newAst_VALUE (symbolVal (name)); /* create name */ + ex = newAst_VALUE (symbolVal (name)); /* create name */ ex = newNode (FUNCTION, ex, body); ex->values.args = FUNC_ARGS(name->type); ex->decorated=1; @@ -4275,9 +4289,9 @@ void ast_print (ast * tree, FILE *outfile, int indent) if (arg) { fprintf (outfile, ", "); } - printTypeChain (args->type, outfile); + printTypeChain (args ? args->type : NULL, outfile); arg++; - args=args->next; + args= args ? args->next : NULL; } while (args); fprintf(outfile,")\n"); ast_print(tree->left,outfile,indent); @@ -4811,10 +4825,9 @@ void ast_print (ast * tree, FILE *outfile, int indent) ast_print(tree->right,outfile,indent+4); return; case PARAM: - fprintf(outfile,"PARM "); + fprintf(outfile,"PARMS\n"); ast_print(tree->left,outfile,indent+4); if (tree->right && !IS_AST_PARAM(tree->right)) { - fprintf(outfile,"PARM "); ast_print(tree->right,outfile,indent+4); } return ;