mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-13 00:24:12 +00:00
don't generate useless expression warnings when that expression was caused
by an error
This commit is contained in:
parent
a9f3814c86
commit
05788e55e5
3 changed files with 74 additions and 5 deletions
|
@ -33,6 +33,7 @@
|
||||||
#define __expr_h
|
#define __expr_h
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
ex_error,
|
||||||
ex_label,
|
ex_label,
|
||||||
ex_block,
|
ex_block,
|
||||||
ex_expr, // binary expression
|
ex_expr, // binary expression
|
||||||
|
|
|
@ -265,6 +265,7 @@ emit_sub_expr (expr_t *e, def_t *dest)
|
||||||
case ex_name:
|
case ex_name:
|
||||||
case ex_nil:
|
case ex_nil:
|
||||||
case ex_label:
|
case ex_label:
|
||||||
|
case ex_error:
|
||||||
error (e, "internal error");
|
error (e, "internal error");
|
||||||
abort ();
|
abort ();
|
||||||
case ex_expr:
|
case ex_expr:
|
||||||
|
@ -425,6 +426,8 @@ emit_expr (expr_t *e)
|
||||||
//print_expr (e);
|
//print_expr (e);
|
||||||
//puts ("");
|
//puts ("");
|
||||||
switch (e->type) {
|
switch (e->type) {
|
||||||
|
case ex_error:
|
||||||
|
break;
|
||||||
case ex_label:
|
case ex_label:
|
||||||
label = &e->e.label;
|
label = &e->e.label;
|
||||||
label->statement = &statements[numstatements];
|
label->statement = &statements[numstatements];
|
||||||
|
|
|
@ -45,6 +45,7 @@ static const char rcsid[] =
|
||||||
int lineno_base;
|
int lineno_base;
|
||||||
|
|
||||||
etype_t qc_types[] = {
|
etype_t qc_types[] = {
|
||||||
|
ev_void, // ex_error
|
||||||
ev_void, // ex_label
|
ev_void, // ex_label
|
||||||
ev_void, // ex_block
|
ev_void, // ex_block
|
||||||
ev_void, // ex_expr
|
ev_void, // ex_expr
|
||||||
|
@ -128,6 +129,7 @@ get_type (expr_t *e)
|
||||||
switch (e->type) {
|
switch (e->type) {
|
||||||
case ex_label:
|
case ex_label:
|
||||||
case ex_name:
|
case ex_name:
|
||||||
|
case ex_error:
|
||||||
return 0; // something went very wrong
|
return 0; // something went very wrong
|
||||||
case ex_nil:
|
case ex_nil:
|
||||||
return &type_void;
|
return &type_void;
|
||||||
|
@ -201,7 +203,7 @@ error (expr_t *e, const char *fmt, ...)
|
||||||
|
|
||||||
if (e) {
|
if (e) {
|
||||||
e = new_expr ();
|
e = new_expr ();
|
||||||
e->type = ex_integer;
|
e->type = ex_error;
|
||||||
}
|
}
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
@ -463,6 +465,9 @@ print_expr (expr_t *e)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
switch (e->type) {
|
switch (e->type) {
|
||||||
|
case ex_error:
|
||||||
|
printf ("(error)");
|
||||||
|
break;
|
||||||
case ex_label:
|
case ex_label:
|
||||||
printf ("%s", e->e.label.name);
|
printf ("%s", e->e.label.name);
|
||||||
break;
|
break;
|
||||||
|
@ -931,6 +936,11 @@ field_expr (expr_t *e1, expr_t *e2)
|
||||||
expr_t *e;
|
expr_t *e;
|
||||||
struct_field_t *field;
|
struct_field_t *field;
|
||||||
|
|
||||||
|
if (e1->type == ex_error)
|
||||||
|
return e1;
|
||||||
|
if (e2->type == ex_error)
|
||||||
|
return e2;
|
||||||
|
|
||||||
t1 = get_type (e1);
|
t1 = get_type (e1);
|
||||||
switch (t1->type) {
|
switch (t1->type) {
|
||||||
case ev_struct:
|
case ev_struct:
|
||||||
|
@ -993,6 +1003,9 @@ test_expr (expr_t *e, int test)
|
||||||
{
|
{
|
||||||
expr_t *new = 0;
|
expr_t *new = 0;
|
||||||
|
|
||||||
|
if (e->type == ex_error)
|
||||||
|
return e;
|
||||||
|
|
||||||
check_initialized (e);
|
check_initialized (e);
|
||||||
|
|
||||||
if (!test)
|
if (!test)
|
||||||
|
@ -1075,6 +1088,11 @@ binary_expr (int op, expr_t *e1, expr_t *e2)
|
||||||
type_t *type = 0;
|
type_t *type = 0;
|
||||||
expr_t *e;
|
expr_t *e;
|
||||||
|
|
||||||
|
if (e1->type == ex_error)
|
||||||
|
return e1;
|
||||||
|
if (e2->type == ex_error)
|
||||||
|
return e2;
|
||||||
|
|
||||||
convert_name (e1);
|
convert_name (e1);
|
||||||
check_initialized (e1);
|
check_initialized (e1);
|
||||||
|
|
||||||
|
@ -1193,20 +1211,29 @@ binary_expr (int op, expr_t *e1, expr_t *e2)
|
||||||
expr_t *
|
expr_t *
|
||||||
asx_expr (int op, expr_t *e1, expr_t *e2)
|
asx_expr (int op, expr_t *e1, expr_t *e2)
|
||||||
{
|
{
|
||||||
expr_t *e = new_expr ();
|
if (e1->type == ex_error)
|
||||||
|
return e1;
|
||||||
|
else if (e2->type == ex_error)
|
||||||
|
return e2;
|
||||||
|
else {
|
||||||
|
expr_t *e = new_expr ();
|
||||||
|
|
||||||
*e = *e1;
|
*e = *e1;
|
||||||
return assign_expr (e, binary_expr (op, e1, e2));
|
return assign_expr (e, binary_expr (op, e1, e2));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
expr_t *
|
expr_t *
|
||||||
unary_expr (int op, expr_t *e)
|
unary_expr (int op, expr_t *e)
|
||||||
{
|
{
|
||||||
|
if (e->type == ex_error)
|
||||||
|
return e;
|
||||||
convert_name (e);
|
convert_name (e);
|
||||||
check_initialized (e);
|
check_initialized (e);
|
||||||
switch (op) {
|
switch (op) {
|
||||||
case '-':
|
case '-':
|
||||||
switch (e->type) {
|
switch (e->type) {
|
||||||
|
case ex_error:
|
||||||
case ex_label:
|
case ex_label:
|
||||||
case ex_name:
|
case ex_name:
|
||||||
error (e, "internal error");
|
error (e, "internal error");
|
||||||
|
@ -1259,6 +1286,7 @@ unary_expr (int op, expr_t *e)
|
||||||
break;
|
break;
|
||||||
case '!':
|
case '!':
|
||||||
switch (e->type) {
|
switch (e->type) {
|
||||||
|
case ex_error:
|
||||||
case ex_label:
|
case ex_label:
|
||||||
case ex_name:
|
case ex_name:
|
||||||
error (e, "internal error");
|
error (e, "internal error");
|
||||||
|
@ -1319,6 +1347,7 @@ unary_expr (int op, expr_t *e)
|
||||||
break;
|
break;
|
||||||
case '~':
|
case '~':
|
||||||
switch (e->type) {
|
switch (e->type) {
|
||||||
|
case ex_error:
|
||||||
case ex_label:
|
case ex_label:
|
||||||
case ex_name:
|
case ex_name:
|
||||||
error (e, "internal error");
|
error (e, "internal error");
|
||||||
|
@ -1413,6 +1442,11 @@ function_expr (expr_t *e1, expr_t *e2)
|
||||||
expr_t *call;
|
expr_t *call;
|
||||||
expr_t *err = 0;
|
expr_t *err = 0;
|
||||||
|
|
||||||
|
if (e1->type == ex_error)
|
||||||
|
return e1;
|
||||||
|
if (e2->type == ex_error)
|
||||||
|
return e2;
|
||||||
|
|
||||||
t1 = extract_type (e1);
|
t1 = extract_type (e1);
|
||||||
|
|
||||||
if (t1 != ev_func) {
|
if (t1 != ev_func) {
|
||||||
|
@ -1524,6 +1558,8 @@ function_expr (expr_t *e1, expr_t *e2)
|
||||||
expr_t *
|
expr_t *
|
||||||
return_expr (function_t *f, expr_t *e)
|
return_expr (function_t *f, expr_t *e)
|
||||||
{
|
{
|
||||||
|
if (e->type == ex_error)
|
||||||
|
return e;
|
||||||
if (!e) {
|
if (!e) {
|
||||||
if (f->def->type->aux_type != &type_void) {
|
if (f->def->type->aux_type != &type_void) {
|
||||||
if (options.traditional) {
|
if (options.traditional) {
|
||||||
|
@ -1566,6 +1602,13 @@ conditional_expr (expr_t *cond, expr_t *e1, expr_t *e2)
|
||||||
expr_t *tlabel = new_label_expr ();
|
expr_t *tlabel = new_label_expr ();
|
||||||
expr_t *elabel = new_label_expr ();
|
expr_t *elabel = new_label_expr ();
|
||||||
|
|
||||||
|
if (cond->type == ex_error)
|
||||||
|
return cond;
|
||||||
|
if (e1->type == ex_error)
|
||||||
|
return e1;
|
||||||
|
if (e2->type == ex_error)
|
||||||
|
return e2;
|
||||||
|
|
||||||
block->e.block.result = (type1 == type2) ? new_temp_def_expr (type1) : 0;
|
block->e.block.result = (type1 == type2) ? new_temp_def_expr (type1) : 0;
|
||||||
append_expr (block, new_binary_expr ('i', test_expr (cond, 1), tlabel));
|
append_expr (block, new_binary_expr ('i', test_expr (cond, 1), tlabel));
|
||||||
if (block->e.block.result)
|
if (block->e.block.result)
|
||||||
|
@ -1588,6 +1631,9 @@ incop_expr (int op, expr_t *e, int postop)
|
||||||
expr_t *one = new_expr ();
|
expr_t *one = new_expr ();
|
||||||
expr_t *incop;
|
expr_t *incop;
|
||||||
|
|
||||||
|
if (e->type == ex_error)
|
||||||
|
return e;
|
||||||
|
|
||||||
one->type = ex_integer; // integer constants get auto-cast to float
|
one->type = ex_integer; // integer constants get auto-cast to float
|
||||||
one->e.integer_val = 1;
|
one->e.integer_val = 1;
|
||||||
incop = asx_expr (op, e, one);
|
incop = asx_expr (op, e, one);
|
||||||
|
@ -1614,6 +1660,11 @@ array_expr (expr_t *array, expr_t *index)
|
||||||
expr_t *e;
|
expr_t *e;
|
||||||
int size;
|
int size;
|
||||||
|
|
||||||
|
if (array->type == ex_error)
|
||||||
|
return array;
|
||||||
|
if (index->type == ex_error)
|
||||||
|
return index;
|
||||||
|
|
||||||
if (array_type->type != ev_pointer || array_type->num_parms < 1)
|
if (array_type->type != ev_pointer || array_type->num_parms < 1)
|
||||||
return error (array, "not an array");
|
return error (array, "not an array");
|
||||||
if (index_type != &type_integer && index_type != &type_uinteger)
|
if (index_type != &type_integer && index_type != &type_uinteger)
|
||||||
|
@ -1646,6 +1697,11 @@ address_expr (expr_t *e1, expr_t *e2, type_t *t)
|
||||||
expr_t *e;
|
expr_t *e;
|
||||||
type_t *type = 0;
|
type_t *type = 0;
|
||||||
|
|
||||||
|
if (e1->type == ex_error)
|
||||||
|
return e1;
|
||||||
|
if (e2->type == ex_error)
|
||||||
|
return e2;
|
||||||
|
|
||||||
if (!t)
|
if (!t)
|
||||||
t = get_type (e1);
|
t = get_type (e1);
|
||||||
|
|
||||||
|
@ -1723,6 +1779,11 @@ assign_expr (expr_t *e1, expr_t *e2)
|
||||||
type_t *t1, *t2, *type;
|
type_t *t1, *t2, *type;
|
||||||
expr_t *e;
|
expr_t *e;
|
||||||
|
|
||||||
|
if (e1->type == ex_error)
|
||||||
|
return e1;
|
||||||
|
if (e2->type == ex_error)
|
||||||
|
return e2;
|
||||||
|
|
||||||
convert_name (e1);
|
convert_name (e1);
|
||||||
if (e1->type == ex_def)
|
if (e1->type == ex_def)
|
||||||
PR_DefInitialized (e1->e.def);
|
PR_DefInitialized (e1->e.def);
|
||||||
|
@ -1807,6 +1868,9 @@ cast_expr (type_t *t, expr_t *e)
|
||||||
{
|
{
|
||||||
expr_t *c;
|
expr_t *c;
|
||||||
|
|
||||||
|
if (e->type == ex_error)
|
||||||
|
return e;
|
||||||
|
|
||||||
if ((t != &type_integer && t != &type_uinteger
|
if ((t != &type_integer && t != &type_uinteger
|
||||||
&& get_type (e) != &type_float)
|
&& get_type (e) != &type_float)
|
||||||
&& (t != &type_float && get_type (e) != &type_integer)) {
|
&& (t != &type_float && get_type (e) != &type_integer)) {
|
||||||
|
@ -1826,7 +1890,8 @@ init_elements (def_t *def, expr_t *eles)
|
||||||
float *g = &G_FLOAT (G_INT (def->ofs));
|
float *g = &G_FLOAT (G_INT (def->ofs));
|
||||||
|
|
||||||
for (count = 0, e = eles->e.block.head; e; count++, e = e->next)
|
for (count = 0, e = eles->e.block.head; e; count++, e = e->next)
|
||||||
;
|
if (e->type == ex_error)
|
||||||
|
return;
|
||||||
if (count > def->type->num_parms) {
|
if (count > def->type->num_parms) {
|
||||||
warning (eles, "excessive elements in initializer");
|
warning (eles, "excessive elements in initializer");
|
||||||
count = def->type->num_parms;
|
count = def->type->num_parms;
|
||||||
|
|
Loading…
Reference in a new issue