------------------------------------------------------------------------

r4255 | acceptthis | 2013-03-10 23:55:57 +0000 (Sun, 10 Mar 2013) | 2 lines

more verbose type-error messages.
fix an issue with chars going missing on the last line (reported by Hectate).
------------------------------------------------------------------------


git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@4251 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2013-03-12 23:22:05 +00:00
parent 066dc81d8b
commit dd68115e58
4 changed files with 39 additions and 26 deletions

View file

@ -944,7 +944,7 @@ static void inline QCC_PR_Expect (char *string)
#endif #endif
void editbadfile(char *fname, int line); void editbadfile(char *fname, int line);
char *TypeName(QCC_type_t *type); char *TypeName(QCC_type_t *type, char *buffer, int buffersize);
void QCC_PR_IncludeChunk (char *data, pbool duplicate, char *filename); void QCC_PR_IncludeChunk (char *data, pbool duplicate, char *filename);
void QCC_PR_IncludeChunkEx(char *data, pbool duplicate, char *filename, CompilerConstant_t *cnst); void QCC_PR_IncludeChunkEx(char *data, pbool duplicate, char *filename, CompilerConstant_t *cnst);
void QCC_PR_CloseProcessor(void); void QCC_PR_CloseProcessor(void);

View file

@ -1464,15 +1464,16 @@ static void QCC_fprintfLocals(FILE *f, gofs_t paramstart, gofs_t paramend)
QCC_def_t *var; QCC_def_t *var;
temp_t *t; temp_t *t;
int i; int i;
char typebuf[1024];
for (var = pr.localvars; var; var = var->nextlocal) for (var = pr.localvars; var; var = var->nextlocal)
{ {
if (var->ofs >= paramstart && var->ofs < paramend) if (var->ofs >= paramstart && var->ofs < paramend)
continue; continue;
if (var->arraysize) if (var->arraysize)
fprintf(f, "local %s %s[%i];\n", TypeName(var->type), var->name, var->arraysize); fprintf(f, "local %s %s[%i];\n", TypeName(var->type, typebuf, sizeof(typebuf)), var->name, var->arraysize);
else else
fprintf(f, "local %s %s;\n", TypeName(var->type), var->name); fprintf(f, "local %s %s;\n", TypeName(var->type, typebuf, sizeof(typebuf)), var->name);
} }
for (t = functemps, i = 0; t; t = t->next, i++) for (t = functemps, i = 0; t; t = t->next, i++)
@ -3864,13 +3865,16 @@ QCC_def_t *QCC_PR_ParseFunctionCall (QCC_def_t *func) //warning, the func could
} }
if (!inh) if (!inh)
{ {
char typebuf1[1024];
char typebuf2[1024];
if (flag_laxcasts || (p->type == ev_function && e->type->type == ev_function)) if (flag_laxcasts || (p->type == ev_function && e->type->type == ev_function))
{ {
QCC_PR_ParseWarning(WARN_LAXCAST, "type mismatch on parm %i - (%s should be %s)", arg+1, TypeName(e->type), TypeName(p));
QCC_PR_ParseWarning(WARN_LAXCAST, "type mismatch on parm %i - (%s should be %s)", arg+1, TypeName(e->type, typebuf1, sizeof(typebuf1)), TypeName(p, typebuf2, sizeof(typebuf2)));
QCC_PR_ParsePrintDef(WARN_LAXCAST, func); QCC_PR_ParsePrintDef(WARN_LAXCAST, func);
} }
else else
QCC_PR_ParseErrorPrintDef (ERR_TYPEMISMATCHPARM, func, "type mismatch on parm %i - (%s should be %s)", arg+1, TypeName(e->type), TypeName(p)); QCC_PR_ParseErrorPrintDef (ERR_TYPEMISMATCHPARM, func, "type mismatch on parm %i - (%s should be %s)", arg+1, TypeName(e->type, typebuf1, sizeof(typebuf1)), TypeName(p, typebuf2, sizeof(typebuf2)));
} }
} }
} }
@ -7688,12 +7692,13 @@ void QCC_WriteAsmFunction(QCC_def_t *sc, unsigned int firststatement, gofs_t fir
gofs_t o; gofs_t o;
QCC_type_t *type; QCC_type_t *type;
QCC_def_t *param; QCC_def_t *param;
char typebuf[512];
if (!asmfile) if (!asmfile)
return; return;
type = sc->type; type = sc->type;
fprintf(asmfile, "%s(", TypeName(type->aux_type)); fprintf(asmfile, "%s(", TypeName(type->aux_type, typebuf, sizeof(typebuf)));
p = type->num_parms; p = type->num_parms;
for (o = firstparm, i = 0, type = type->param; i < p; i++, type = type->next) for (o = firstparm, i = 0, type = type->param; i < p; i++, type = type->next)
{ {
@ -7706,9 +7711,9 @@ void QCC_WriteAsmFunction(QCC_def_t *sc, unsigned int firststatement, gofs_t fir
break; break;
} }
if (param) if (param)
fprintf(asmfile, "%s %s", TypeName(type), param->name); fprintf(asmfile, "%s %s", TypeName(type, typebuf, sizeof(typebuf)), param->name);
else else
fprintf(asmfile, "%s", TypeName(type)); fprintf(asmfile, "%s", TypeName(type, typebuf, sizeof(typebuf)));
o += type->size; o += type->size;
} }
@ -8407,6 +8412,7 @@ QCC_def_t *QCC_PR_DummyDef(QCC_type_t *type, char *name, QCC_def_t *scope, int a
char newname[256]; char newname[256];
int a; int a;
QCC_def_t *def, *first=NULL; QCC_def_t *def, *first=NULL;
char typebuf[1024];
#define KEYWORD(x) if (!STRCMP(name, #x) && keyword_##x) {if (keyword_##x)QCC_PR_ParseWarning(WARN_KEYWORDDISABLED, "\""#x"\" keyword used as variable name%s", keywords_coexist?" - coexisting":" - disabling");keyword_##x=keywords_coexist;} #define KEYWORD(x) if (!STRCMP(name, #x) && keyword_##x) {if (keyword_##x)QCC_PR_ParseWarning(WARN_KEYWORDDISABLED, "\""#x"\" keyword used as variable name%s", keywords_coexist?" - coexisting":" - disabling");keyword_##x=keywords_coexist;}
if (name) if (name)
@ -8558,7 +8564,7 @@ QCC_def_t *QCC_PR_DummyDef(QCC_type_t *type, char *name, QCC_def_t *scope, int a
pHash_Add(&globalstable, first->name, first, qccHunkAlloc(sizeof(bucket_t))); pHash_Add(&globalstable, first->name, first, qccHunkAlloc(sizeof(bucket_t)));
if (!scope && asmfile) if (!scope && asmfile)
fprintf(asmfile, "%s %s;\n", TypeName(first->type), first->name); fprintf(asmfile, "%s %s;\n", TypeName(first->type, typebuf, sizeof(typebuf)), first->name);
} }
return first; return first;
@ -8582,6 +8588,7 @@ QCC_def_t *QCC_PR_GetDef (QCC_type_t *type, char *name, QCC_def_t *scope, pbool
QCC_def_t *def; QCC_def_t *def;
// char element[MAX_NAME]; // char element[MAX_NAME];
QCC_def_t *foundstatic = NULL; QCC_def_t *foundstatic = NULL;
char typebuf1[1024], typebuf2[1024];
if (!allocate) if (!allocate)
arraysize = -1; arraysize = -1;
@ -8599,7 +8606,7 @@ QCC_def_t *QCC_PR_GetDef (QCC_type_t *type, char *name, QCC_def_t *scope, pbool
} }
if (type && typecmp(def->type, type)) if (type && typecmp(def->type, type))
QCC_PR_ParseErrorPrintDef (ERR_TYPEMISMATCHREDEC, def, "Type mismatch on redeclaration of %s. %s, should be %s",name, TypeName(type), TypeName(def->type)); QCC_PR_ParseErrorPrintDef (ERR_TYPEMISMATCHREDEC, def, "Type mismatch on redeclaration of %s. %s, should be %s",name, TypeName(type, typebuf1, sizeof(typebuf1)), TypeName(def->type, typebuf2, sizeof(typebuf2)));
if (def->arraysize != arraysize && arraysize>=0) if (def->arraysize != arraysize && arraysize>=0)
QCC_PR_ParseErrorPrintDef (ERR_TYPEMISMATCHARRAYSIZE, def, "Array sizes for redecleration of %s do not match",name); QCC_PR_ParseErrorPrintDef (ERR_TYPEMISMATCHARRAYSIZE, def, "Array sizes for redecleration of %s do not match",name);
if (allocate && scope) if (allocate && scope)
@ -8638,10 +8645,10 @@ QCC_def_t *QCC_PR_GetDef (QCC_type_t *type, char *name, QCC_def_t *scope, pbool
if (typecmp_lax(def->type, type)) if (typecmp_lax(def->type, type))
{ {
//unequal even when we're lax //unequal even when we're lax
QCC_PR_ParseError (ERR_TYPEMISMATCHREDEC, "Type mismatch on redeclaration of %s. %s, should be %s",name, TypeName(type), TypeName(def->type)); QCC_PR_ParseError (ERR_TYPEMISMATCHREDEC, "Type mismatch on redeclaration of %s. %s, should be %s",name, TypeName(type, typebuf1, sizeof(typebuf1)), TypeName(def->type, typebuf2, sizeof(typebuf2)));
} }
else else
QCC_PR_ParseWarning (WARN_LAXCAST, "Optional arguments differ on redeclaration of %s. %s, should be %s",name, TypeName(type), TypeName(def->type)); QCC_PR_ParseWarning (WARN_LAXCAST, "Optional arguments differ on redeclaration of %s. %s, should be %s",name, TypeName(type, typebuf1, sizeof(typebuf1)), TypeName(def->type, typebuf2, sizeof(typebuf2)));
} }
} }
if (def->arraysize != arraysize && arraysize>=0) if (def->arraysize != arraysize && arraysize>=0)
@ -8677,7 +8684,7 @@ QCC_def_t *QCC_PR_GetDef (QCC_type_t *type, char *name, QCC_def_t *scope, pbool
} }
if (type && typecmp(def->type, type)) if (type && typecmp(def->type, type))
QCC_PR_ParseError (ERR_TYPEMISMATCHREDEC, "Type mismatch on redeclaration of %s. %s, should be %s",name, TypeName(type), TypeName(def->type)); QCC_PR_ParseError (ERR_TYPEMISMATCHREDEC, "Type mismatch on redeclaration of %s. %s, should be %s",name, TypeName(type, typebuf1, sizeof(typebuf1)), TypeName(def->type, typebuf2, sizeof(typebuf2)));
if (def->arraysize != arraysize && arraysize>=0) if (def->arraysize != arraysize && arraysize>=0)
QCC_PR_ParseError (ERR_TYPEMISMATCHARRAYSIZE, "Array sizes for redecleration of %s do not match",name); QCC_PR_ParseError (ERR_TYPEMISMATCHARRAYSIZE, "Array sizes for redecleration of %s do not match",name);
if (allocate && scope) if (allocate && scope)
@ -8713,13 +8720,14 @@ QCC_def_t *QCC_PR_GetDef (QCC_type_t *type, char *name, QCC_def_t *scope, pbool
{ {
if (!pr_scope) if (!pr_scope)
{ {
char typebuf1[1024], typebuf2[1024];
if (typecmp_lax(def->type, type)) if (typecmp_lax(def->type, type))
{ {
//unequal even when we're lax //unequal even when we're lax
QCC_PR_ParseError (ERR_TYPEMISMATCHREDEC, "Type mismatch on redeclaration of %s. %s, should be %s",name, TypeName(type), TypeName(def->type)); QCC_PR_ParseError (ERR_TYPEMISMATCHREDEC, "Type mismatch on redeclaration of %s. %s, should be %s",name, TypeName(type, typebuf1, sizeof(typebuf1)), TypeName(def->type, typebuf2, sizeof(typebuf2)));
} }
else else
QCC_PR_ParseWarning (WARN_LAXCAST, "Optional arguments differ on redeclaration of %s. %s, should be %s",name, TypeName(type), TypeName(def->type)); QCC_PR_ParseWarning (WARN_LAXCAST, "Optional arguments differ on redeclaration of %s. %s, should be %s",name, TypeName(type, typebuf1, sizeof(typebuf1)), TypeName(def->type, typebuf2, sizeof(typebuf2)));
} }
} }
if (def->arraysize != arraysize && arraysize>=0) if (def->arraysize != arraysize && arraysize>=0)
@ -9759,11 +9767,12 @@ void QCC_PR_ParseDefs (char *classname)
if (classname) if (classname)
{ {
char typebuf[1024];
char *membername = name; char *membername = name;
name = qccHunkAlloc(strlen(classname) + strlen(name) + 3); name = qccHunkAlloc(strlen(classname) + strlen(name) + 3);
sprintf(name, "%s::"MEMBERFIELDNAME, classname, membername); sprintf(name, "%s::"MEMBERFIELDNAME, classname, membername);
if (!QCC_PR_GetDef(NULL, name, NULL, false, 0, false)) if (!QCC_PR_GetDef(NULL, name, NULL, false, 0, false))
QCC_PR_ParseError(ERR_NOTANAME, "%s %s is not a member of class %s\n", TypeName(type), membername, classname); QCC_PR_ParseError(ERR_NOTANAME, "%s %s is not a member of class %s\n", TypeName(type, typebuf, sizeof(typebuf)), membername, classname);
sprintf(name, "%s::%s", classname, membername); sprintf(name, "%s::%s", classname, membername);
pr_classtype = QCC_TypeForName(classname); pr_classtype = QCC_TypeForName(classname);

View file

@ -3360,15 +3360,18 @@ QCC_type_t *QCC_PR_DuplicateType(QCC_type_t *in)
return out; return out;
} }
char *TypeName(QCC_type_t *type) char *TypeName(QCC_type_t *type, char *buffer, int buffersize)
{ {
static char buffer[2][512];
static int op;
char *ret; char *ret;
if (type->type == ev_pointer)
{
TypeName(type->aux_type, buffer, buffersize-2);
strcat(buffer, " *");
return buffer;
}
op++; ret = buffer;
ret = buffer[op&1];
if (type->type == ev_field) if (type->type == ev_field)
{ {
type = type->aux_type; type = type->aux_type;
@ -3410,7 +3413,7 @@ char *TypeName(QCC_type_t *type)
} }
else if (type->type == ev_entity && type->parentclass) else if (type->type == ev_entity && type->parentclass)
{ {
ret = buffer[op&1]; ret = buffer;
*ret = 0; *ret = 0;
strcat(ret, "class "); strcat(ret, "class ");
strcat(ret, type->name); strcat(ret, type->name);
@ -3430,7 +3433,7 @@ char *TypeName(QCC_type_t *type)
else else
strcpy(ret, type->name); strcpy(ret, type->name);
return buffer[op&1]; return buffer;
} }
//#define typecmp(a, b) (a && ((a)->type==(b)->type) && !STRCMP((a)->name, (b)->name)) //#define typecmp(a, b) (a && ((a)->type==(b)->type) && !STRCMP((a)->name, (b)->name))

View file

@ -477,11 +477,12 @@ char *GetTooltipText(editor_t *editor)
if (def) if (def)
{ {
static char buffer[1024]; static char buffer[1024];
char typebuf[1024];
//note function argument names do not persist beyond the function def. we might be able to read the function's localdefs for them, but that's unreliable/broken with builtins where they're most needed. //note function argument names do not persist beyond the function def. we might be able to read the function's localdefs for them, but that's unreliable/broken with builtins where they're most needed.
if (def->comment) if (def->comment)
_snprintf(buffer, sizeof(buffer)-1, "%s %s\r\n%s", TypeName(def->type), def->name, def->comment); _snprintf(buffer, sizeof(buffer)-1, "%s %s\r\n%s", TypeName(def->type, typebuf, sizeof(typebuf)), def->name, def->comment);
else else
_snprintf(buffer, sizeof(buffer)-1, "%s %s", TypeName(def->type), def->name); _snprintf(buffer, sizeof(buffer)-1, "%s %s", TypeName(def->type, typebuf, sizeof(typebuf)), def->name);
return buffer; return buffer;
} }
return NULL; return NULL;
@ -1190,7 +1191,7 @@ int EditorSave(editor_t *edit)
MessageBox(NULL, "Save failed - not enough mem", "Error", 0); MessageBox(NULL, "Save failed - not enough mem", "Error", 0);
return false; return false;
} }
Edit_GetText(edit->editpane, file, len); Edit_GetText(edit->editpane, file, len+1);
if (!QCC_WriteFile(edit->filename, file, len)) if (!QCC_WriteFile(edit->filename, file, len))
{ {
MessageBox(NULL, "Save failed\nCheck path and ReadOnly flags", "Failure", 0); MessageBox(NULL, "Save failed\nCheck path and ReadOnly flags", "Failure", 0);