{
args->type = copyLinkChain (argType);
args->etype = getSpec (args->type);
+ SPEC_EXTR(args->etype)=1;
if (!nArgs)
break;
args = args->next = newValue ();
value *defParm,
ast * actParm,
int *parmNumber, // unused, although updated
- bool rightmost) // double checked?
+ bool rightmost)
{
/* if none of them exist */
if (!defParm && !actParm)
return 1;
}
- if (IS_VOID(actParm->etype)) {
+ if (IS_VOID(actParm->ftype)) {
werror (E_VOID_VALUE_USED);
return 1;
}
return 0;
}
- /* The ternary ('?') operator is weird: the ftype of the
- * operator is the type of the condition, but it will return a
- * (possibly) different type.
- */
- if (IS_TERNARY_OP(actParm))
- {
- assert(IS_COLON_OP(actParm->right));
- assert(actParm->right->left);
- ftype = actParm->right->left->ftype;
- }
- else
- {
- ftype = actParm->ftype;
- }
+ ftype = actParm->ftype;
/* If it's a small integer, upcast to int. */
if (IS_INTEGRAL (ftype)
if (newType)
{
/* cast required; change this op to a cast. */
- ast *parmCopy = resolveSymbols (copyAst (actParm));
+ ast *parmCopy = decorateType(resolveSymbols (copyAst (actParm)));
actParm->type = EX_OP;
actParm->opval.op = CAST;
* Therefore, if there are more defined parameters, the caller didn't
* supply enough.
*/
- if (0 && rightmost && defParm->next)
+ if (rightmost && defParm->next)
{
werror (E_TOO_FEW_PARMS);
return 1;
/* if the parameter is castable then add the cast */
if (compareType (defParm->type, actParm->ftype) < 0)
{
- ast *pTree = resolveSymbols (copyAst (actParm));
+ ast *pTree = decorateType(resolveSymbols (copyAst (actParm)));
/* now change the current one to a cast */
actParm->type = EX_OP;
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 */
lAst = decorateType (resolveSymbols (lAst));
rast = decorateType (resolveSymbols (createIval (lAst, sflds->type, iloop, rast)));
}
+
+ if (iloop) {
+ werror (W_EXCESS_INITIALIZERS, "struct",
+ sym->opval.val->sym->name, sym->opval.val->sym->lineDef);
+ }
+
return rast;
}
char *name=sym->opval.val->sym->name;
int lineno=sym->opval.val->sym->lineDef;
- werror (W_EXESS_ARRAY_INITIALIZERS, name, lineno);
+ werror (W_EXCESS_INITIALIZERS, "array", name, lineno);
}
}
else
// there has to be a better way
char *name=sym->opval.val->sym->name;
int lineno=sym->opval.val->sym->lineDef;
- werror (W_EXESS_ARRAY_INITIALIZERS, name, lineno);
+ werror (W_EXCESS_INITIALIZERS, "array", name, lineno);
break;
}
if (!TARGET_IS_MCS51 || !(options.model==MODEL_LARGE)) {
fprintf (stderr, "Can't \"TRY_THE_NEW_INITIALIZER\" unless "
- "with -mmcs51 and --model-large");
+ "with -mmcs51 and --model-large\n");
exit(404);
}
addSym (SymbolTab, newSym, newSym->rname, 0, 0, 1);
/* now lift the code to main */
- if (IS_AGGREGATE (sym->type))
+ if (IS_AGGREGATE (sym->type)) {
work = initAggregates (sym, sym->ival, NULL);
- else
+ } else {
+ if (getNelements(sym->type, sym->ival)>1) {
+ werror (W_EXCESS_INITIALIZERS, "scalar",
+ sym->name, sym->lineDef);
+ }
work = newNode ('=', newAst_VALUE (symbolVal (newSym)),
list2expr (sym->ival));
+ }
setAstLineno (work, sym->lineDef);
/* if there is an initial value */
if (sym->ival && SPEC_SCLS (sym->etype) != S_CODE)
{
- if (IS_AGGREGATE (sym->type))
+ if (IS_AGGREGATE (sym->type)) {
work = initAggregates (sym, sym->ival, NULL);
- else
+ } else {
+ if (getNelements(sym->type, sym->ival)>1) {
+ werror (W_EXCESS_INITIALIZERS, "scalar",
+ sym->name, sym->lineDef);
+ }
work = newNode ('=', newAst_VALUE (symbolVal (sym)),
list2expr (sym->ival));
+ }
setAstLineno (work, sym->lineDef);
sym->ival = NULL;
return decorateType (otree);
}
-#if 0
- // we can't do this because of "(int & 0xff) << 3"
-
- /* if right or left is literal then result of that type */
- if (IS_LITERAL (RTYPE (tree)))
- {
-
- TTYPE (tree) = copyLinkChain (RTYPE (tree));
- TETYPE (tree) = getSpec (TTYPE (tree));
- SPEC_SCLS (TETYPE (tree)) = S_AUTO;
- }
- else
- {
- if (IS_LITERAL (LTYPE (tree)))
- {
- TTYPE (tree) = copyLinkChain (LTYPE (tree));
- TETYPE (tree) = getSpec (TTYPE (tree));
- SPEC_SCLS (TETYPE (tree)) = S_AUTO;
-
- }
- else
- {
- TTYPE (tree) =
- computeType (LTYPE (tree), RTYPE (tree));
- TETYPE (tree) = getSpec (TTYPE (tree));
- }
- }
-#else
TTYPE (tree) =
computeType (LTYPE (tree), RTYPE (tree));
TETYPE (tree) = getSpec (TTYPE (tree));
-#endif
+
LRVAL (tree) = RRVAL (tree) = 1;
return tree;
}
DCL_TYPE (p) = IPOINTER;
else if (SPEC_SCLS (tree->left->etype) == S_EEPROM)
DCL_TYPE (p) = EEPPOINTER;
+ else if (SPEC_OCLS(tree->left->etype))
+ DCL_TYPE (p) = PTR_TYPE(SPEC_OCLS(tree->left->etype));
else
- DCL_TYPE (p) = POINTER;
+ DCL_TYPE (p) = POINTER;
if (IS_AST_SYM_VALUE (tree->left))
{
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;
TTYPE (tree) = LTYPE (tree);
LRVAL (tree) = 1;
}
-#endif
-
+#endif
TETYPE (tree) = getSpec (TTYPE (tree));
return tree;
return tree->right->right ;
}
} else {
- TTYPE (tree) = RTYPE(tree); // #HACK LTYPE(tree).
+ TTYPE (tree) = RTYPE(tree);
TETYPE (tree) = getSpec (TTYPE (tree));
}
return 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);
}
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;
}
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 */
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;
}
if (tree->opval.op == FUNCTION) {
- fprintf(outfile,"FUNCTION (%p) type (",tree);
+ int arg=0;
+ value *args=FUNC_ARGS(tree->left->opval.val->type);
+ fprintf(outfile,"FUNCTION (%s=%p) type (",
+ tree->left->opval.val->name, tree);
printTypeChain (tree->ftype,outfile);
+ fprintf(outfile,") args (");
+ do {
+ if (arg) {
+ fprintf (outfile, ", ");
+ }
+ printTypeChain (args ? args->type : NULL, outfile);
+ arg++;
+ args= args ? args->next : NULL;
+ } while (args);
fprintf(outfile,")\n");
- ast_print(tree->left,outfile,indent+4);
- ast_print(tree->right,outfile,indent+4);
+ ast_print(tree->left,outfile,indent);
+ ast_print(tree->right,outfile,indent);
return ;
}
if (tree->opval.op == BLOCK) {
symbol *decls = tree->values.sym;
- INDENT(indent+4,outfile);
+ INDENT(indent,outfile);
fprintf(outfile,"{\n");
while (decls) {
INDENT(indent+4,outfile);
- fprintf(outfile,"DECLARE SYMBOL %s, type(",decls->name);
+ fprintf(outfile,"DECLARE SYMBOL (%s=%p) type (",
+ decls->name, decls);
printTypeChain(decls->type,outfile);
fprintf(outfile,")\n");
decls = decls->next;
}
ast_print(tree->right,outfile,indent+4);
- INDENT(indent+4,outfile);
+ INDENT(indent,outfile);
fprintf(outfile,"}\n");
return;
}
} else {
fprintf(outfile,"SYMBOL ");
}
- fprintf(outfile,"(%p) name= %s ",tree,tree->opval.val->sym->name);
+ fprintf(outfile,"(%s=%p)",
+ tree->opval.val->sym->name,tree);
}
if (tree->ftype) {
fprintf(outfile," type (");
/* casting */
/*----------------------------*/
case CAST: /* change the type */
- fprintf(outfile,"CAST (%p) type (",tree);
+ fprintf(outfile,"CAST (%p) from type (",tree);
+ printTypeChain(tree->right->ftype,outfile);
+ fprintf(outfile,") to type (");
printTypeChain(tree->ftype,outfile);
fprintf(outfile,")\n");
ast_print(tree->right,outfile,indent+4);
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 ;
void PA(ast *t)
{
- ast_print(t,stdout,1);
+ ast_print(t,stdout,0);
}