forked from fte/fteqw
1
0
Fork 0

fix .unions.

added some extra warning names (so '#pragma warning disable F305' etc can work)

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@4438 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2013-07-29 17:34:19 +00:00
parent 4e480ab24e
commit e4565ee476
4 changed files with 43 additions and 31 deletions

View File

@ -601,7 +601,8 @@ pbool LocateDebugTerm(progfuncs_t *progfuncs, char *key, eval_t **result, etype_
{ {
ddef32_t *def; ddef32_t *def;
fdef_t *fdef; fdef_t *fdef;
eval_t *val = NULL; int fofs;
eval_t *val = NULL, *fval=NULL;
char *c, *c2; char *c, *c2;
etype_t type = ev_void; etype_t type = ev_void;
struct edictrun_s *ed; struct edictrun_s *ed;
@ -653,14 +654,28 @@ pbool LocateDebugTerm(progfuncs_t *progfuncs, char *key, eval_t **result, etype_
if (type != ev_entity) if (type != ev_entity)
return false; return false;
if (c)*c = '\0'; if (c)*c = '\0';
fdef = ED_FindField(progfuncs, COM_TrimString(c2));
if (c)*c = '.'; c2 = COM_TrimString(c2);
if (!fdef) def = ED_FindLocalOrGlobal(progfuncs, c2, &fval);
return false; if (def)
{
fofs = fval->_int + progfuncs->funcs.fieldadjust;
}
else
{
fdef = ED_FindField(progfuncs, c2);
if (c)*c = '.';
if (!fdef)
return false;
fofs = fdef->ofs;
}
ed = PROG_TO_EDICT(progfuncs, val->_int); ed = PROG_TO_EDICT(progfuncs, val->_int);
if (!ed) if (!ed)
return false; return false;
val = (eval_t *) (((char *)ed->fields) + fdef->ofs*4); if (fofs < 0 || fofs >= max_fields_size)
return false;
val = (eval_t *) (((char *)ed->fields) + fofs*4);
type = fdef->type; type = fdef->type;
} }
*rettype = type; *rettype = type;

View File

@ -647,8 +647,10 @@ enum {
WARN_MISSINGOPTIONAL, WARN_MISSINGOPTIONAL,
WARN_SYSTEMCRC, WARN_SYSTEMCRC,
WARN_CONDITIONALTYPEMISMATCH, WARN_CONDITIONALTYPEMISMATCH,
WARN_SELFNOTTHIS, //warned for because 'self' does not have the right type. we convert such references to 'this' instead, which is more usable. WARN_SELFNOTTHIS, //warned for because 'self' does not have the right type. we convert such references to 'this' instead, which is more usable.
WARN_EVILPREPROCESSOR, //exploited by nexuiz, and generally unsafe. WARN_EVILPREPROCESSOR, //exploited by nexuiz, and generally unsafe.
WARN_UNARYNOTSCOPE, //!foo & bar the ! applies to the result of &. This is unlike C.
WARN_STRICTTYPEMISMATCH, //self.think = T_Damage; both are functions, but the arguments/return types/etc differ.
ERR_PARSEERRORS, //caused by qcc_pr_parseerror being called. ERR_PARSEERRORS, //caused by qcc_pr_parseerror being called.

View File

@ -509,8 +509,8 @@ QCC_opcode_t pr_opcodes[] =
{7, "<SWITCH_I>", "SWITCH_I", -1, ASSOC_LEFT, &type_void, NULL, &type_void}, {7, "<SWITCH_I>", "SWITCH_I", -1, ASSOC_LEFT, &type_void, NULL, &type_void},
{7, "<>", "GLOAD_S", -1, ASSOC_LEFT, &type_float, &type_float, &type_float}, {7, "<>", "GLOAD_S", -1, ASSOC_LEFT, &type_float, &type_float, &type_float},
{6, "<IF_F>", "IF_F", -1, ASSOC_RIGHT, &type_float, NULL, &type_void}, {7, "<IF_F>", "IF_F", -1, ASSOC_RIGHT, &type_float, NULL, &type_void},
{6, "<IFNOT_F>","IFNOT_F", -1, ASSOC_RIGHT, &type_float, NULL, &type_void}, {7, "<IFNOT_F>","IFNOT_F", -1, ASSOC_RIGHT, &type_float, NULL, &type_void},
/* emulated ops begin here */ /* emulated ops begin here */
{7, "<>", "OP_EMULATED", -1, ASSOC_LEFT, &type_float, &type_float, &type_float}, {7, "<>", "OP_EMULATED", -1, ASSOC_LEFT, &type_float, &type_float, &type_float},
@ -587,7 +587,7 @@ pbool OpAssignsToC(unsigned int op)
if(op == OP_STOREP_C || op == OP_LOADP_C) if(op == OP_STOREP_C || op == OP_LOADP_C)
return false; return false;
if(op >= OP_MULSTORE_F && op <= OP_SUBSTOREP_V) if(op >= OP_MULSTORE_F && op <= OP_SUBSTOREP_V)
return false; return false; //actually they do.
return true; return true;
} }
pbool OpAssignsToB(unsigned int op) pbool OpAssignsToB(unsigned int op)
@ -1949,7 +1949,7 @@ QCC_def_t *QCC_PR_Statement (QCC_opcode_t *op, QCC_def_t *var_a, QCC_def_t *var_
{ {
TypeName(var_a->type, typea, sizeof(typea)); TypeName(var_a->type, typea, sizeof(typea));
TypeName(var_b->type, typeb, sizeof(typeb)); TypeName(var_b->type, typeb, sizeof(typeb));
QCC_PR_ParseWarning(WARN_CONSTANTCOMPARISON, "Implicit assignment from %s to %s %s", typea, typeb, var_b->name); QCC_PR_ParseWarning(WARN_STRICTTYPEMISMATCH, "Implicit assignment from %s to %s %s", typea, typeb, var_b->name);
} }
} }
break; break;
@ -1974,7 +1974,7 @@ QCC_def_t *QCC_PR_Statement (QCC_opcode_t *op, QCC_def_t *var_a, QCC_def_t *var_
{ {
TypeName(var_a->type, typea, sizeof(typea)); TypeName(var_a->type, typea, sizeof(typea));
TypeName(var_b->type->aux_type, typeb, sizeof(typeb)); TypeName(var_b->type->aux_type, typeb, sizeof(typeb));
QCC_PR_ParseWarning(WARN_CONSTANTCOMPARISON, "Implicit field assignment from %s to %s", typea, typeb); QCC_PR_ParseWarning(WARN_STRICTTYPEMISMATCH, "Implicit field assignment from %s to %s", typea, typeb);
} }
} }
break; break;
@ -2022,7 +2022,7 @@ QCC_def_t *QCC_PR_Statement (QCC_opcode_t *op, QCC_def_t *var_a, QCC_def_t *var_
{ {
TypeName(var_a->type, typea, sizeof(typea)); TypeName(var_a->type, typea, sizeof(typea));
TypeName(var_b->type, typeb, sizeof(typeb)); TypeName(var_b->type, typeb, sizeof(typeb));
QCC_PR_ParseWarning(WARN_CONSTANTCOMPARISON, "'%s' type mismatch: %s with %s", op->name, typea, typeb); QCC_PR_ParseWarning(WARN_STRICTTYPEMISMATCH, "'%s' type mismatch: %s with %s", op->name, typea, typeb);
} }
if ((var_a->constant && var_b->constant && !var_a->temp && !var_b->temp) || var_a->ofs == var_b->ofs) if ((var_a->constant && var_b->constant && !var_a->temp && !var_b->temp) || var_a->ofs == var_b->ofs)
QCC_PR_ParseWarning(WARN_CONSTANTCOMPARISON, "Result of comparison is constant"); QCC_PR_ParseWarning(WARN_CONSTANTCOMPARISON, "Result of comparison is constant");
@ -5937,7 +5937,7 @@ QCC_def_t *QCC_PR_Expression (int priority, int exprflags)
e->type = e2->type->aux_type; e->type = e2->type->aux_type;
if (priority > 1 && exprflags & EXPR_WARN_ABOVE_1) if (priority > 1 && exprflags & EXPR_WARN_ABOVE_1)
QCC_PR_ParseWarning(0, "You may wish to add brackets after that ! operator"); QCC_PR_ParseWarning(WARN_UNARYNOTSCOPE, "You may wish to add brackets after that ! operator");
break; break;
} }
@ -8062,7 +8062,7 @@ void QCC_WriteAsmFunction(QCC_def_t *sc, unsigned int firststatement, gofs_t fir
} }
else else
fprintf(asmfile, ",\t%i", statements[i].b); fprintf(asmfile, ",\t%i", statements[i].b);
if (pr_opcodes[statements[i].op].type_c != &type_void && pr_opcodes[statements[i].op].associative==ASSOC_LEFT) if (pr_opcodes[statements[i].op].type_c != &type_void) && (pr_opcodes[statements[i].op].associative==ASSOC_LEFT || statements[i].c))
{ {
if (pr_opcodes[statements[i].op].type_c) if (pr_opcodes[statements[i].op].type_c)
{ {
@ -9090,7 +9090,7 @@ QCC_def_t *QCC_PR_GetDef (QCC_type_t *type, char *name, QCC_def_t *scope, pbool
def = QCC_PR_GetDef(NULL, name, NULL, false, arraysize, false); def = QCC_PR_GetDef(NULL, name, NULL, false, arraysize, false);
if (def) if (def)
{ {
QCC_PR_ParseWarning(WARN_SAMENAMEASGLOBAL, "Local \"%s\" defined with name of a global", name); QCC_PR_ParseWarning(WARN_SAMENAMEASGLOBAL, "Local \"%s\" hides global with same name", name);
QCC_PR_ParsePrintDef(WARN_SAMENAMEASGLOBAL, def); QCC_PR_ParsePrintDef(WARN_SAMENAMEASGLOBAL, def);
} }
} }
@ -9209,6 +9209,7 @@ QCC_def_t *QCC_PR_DummyFieldDef(QCC_type_t *type, char *name, QCC_def_t *scope,
case ev_pointer: case ev_pointer:
case ev_integer: case ev_integer:
case ev_variant: case ev_variant:
case ev_function:
if (*name && *name != '<') if (*name && *name != '<')
sprintf(newname, "%s%s.%s", name, array, type->params[partnum].paramname); sprintf(newname, "%s%s.%s", name, array, type->params[partnum].paramname);
else else
@ -9221,6 +9222,10 @@ QCC_def_t *QCC_PR_DummyFieldDef(QCC_type_t *type, char *name, QCC_def_t *scope,
if (!def) if (!def)
{ {
def = QCC_PR_GetDef(ftype, newname, scope, true, 0, saved); def = QCC_PR_GetDef(ftype, newname, scope, true, 0, saved);
if (parttype->type == ev_function)
def->initialized = true;
((int *)qcc_pr_globals)[def->ofs] = *fieldofs;
*fieldofs += parttype->size;
} }
else else
{ {
@ -9228,19 +9233,6 @@ QCC_def_t *QCC_PR_DummyFieldDef(QCC_type_t *type, char *name, QCC_def_t *scope,
QCC_PR_ParsePrintDef(WARN_CONFLICTINGUNIONMEMBER, def); QCC_PR_ParsePrintDef(WARN_CONFLICTINGUNIONMEMBER, def);
} }
break; break;
case ev_function:
if (*name && *name != '<')
sprintf(newname, "%s%s.%s", name, array, parttype->name);
else
sprintf(newname, "%s%s", parttype->name, array);
ftype = QCC_PR_NewType("FIELD_TYPE", ev_field, false);
ftype->aux_type = parttype;
def = QCC_PR_GetDef(ftype, newname, scope, true, 0, saved);
def->initialized = true;
((int *)qcc_pr_globals)[def->ofs] = *fieldofs;
*fieldofs += parttype->size;
break;
case ev_void: case ev_void:
break; break;
} }

View File

@ -168,13 +168,16 @@ struct {
// {"", WARN_KEYWORDDISABLED}, // {"", WARN_KEYWORDDISABLED},
// {"", WARN_ENUMFLAGS_NOTINTEGER}, // {"", WARN_ENUMFLAGS_NOTINTEGER},
// {"", WARN_ENUMFLAGS_NOTBINARY}, // {"", WARN_ENUMFLAGS_NOTBINARY},
// {"", WARN_CASEINSENSATIVEFRAMEMACRO},
{" Q111", WARN_DUPLICATELABEL}, {" Q111", WARN_DUPLICATELABEL},
{" Q201", WARN_ASSIGNMENTINCONDITIONAL}, {" Q201", WARN_ASSIGNMENTINCONDITIONAL},
{" F300", WARN_DEADCODE}, {" F300", WARN_DEADCODE},
{" F301", WARN_NOTUTF8}, {" F301", WARN_NOTUTF8},
{" F302", WARN_UNINITIALIZED}, {" F302", WARN_UNINITIALIZED},
{" F303", WARN_EVILPREPROCESSOR}, {" F303", WARN_EVILPREPROCESSOR},
{" F304", WARN_UNARYNOTSCOPE},
{" F305", WARN_CASEINSENSATIVEFRAMEMACRO},
{" F306", WARN_SAMENAMEASGLOBAL},
{" F307", WARN_STRICTTYPEMISMATCH},
//frikqcc errors //frikqcc errors
//Q608: PrecacheSound: numsounds //Q608: PrecacheSound: numsounds