From: dick Date: Sat, 15 Mar 1986 18:16:30 +0000 (+0000) Subject: more calls of expr_error() for better error reporting X-Git-Tag: release-5-5~5350 X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=021d8d1fec6e5944070b1c9b26e593a7da9053c9;p=ack.git more calls of expr_error() for better error reporting --- diff --git a/lang/cem/cemcom/arith.c b/lang/cem/cemcom/arith.c index 3b780bcf6..ab63a9c9b 100644 --- a/lang/cem/cemcom/arith.c +++ b/lang/cem/cemcom/arith.c @@ -111,7 +111,7 @@ ch76pointer(expp, oper, tp) ch7cast(expp, CAST, tp); else { if ((*expp)->ex_type != error_type) - error("%s on %s and pointer", + expr_error(*expp, "%s on %s and pointer", symbol2str(oper), symbol2str((*expp)->ex_type->tp_fund) ); @@ -147,7 +147,7 @@ any2arith(expp, oper) ) {} else - warning("%s on enum", symbol2str(oper)); + expr_warning(*expp, "%s on enum", symbol2str(oper)); int2int(expp, int_type); break; case FLOAT: @@ -161,7 +161,7 @@ any2arith(expp, oper) break; #endif NOBITFIELD default: - error("operator %s on non-numerical operand (%s)", + expr_error(*expp, "operator %s on non-numerical operand (%s)", symbol2str(oper), symbol2str(fund)); case ERRONEOUS: erroneous2int(expp); @@ -292,7 +292,7 @@ opnd2integral(expp, oper) if (fund != INT && fund != LONG) { if (fund != ERRONEOUS) - error("%s operand to %s", + expr_error(*expp, "%s operand to %s", symbol2str(fund), symbol2str(oper)); erroneous2int(expp); /* fund = INT; */ @@ -327,7 +327,7 @@ opnd2logical(expp, oper) case DOUBLE: break; default: - error("%s operand to %s", + expr_error(*expp, "%s operand to %s", symbol2str(fund), symbol2str(oper)); case ERRONEOUS: erroneous2int(expp); diff --git a/lang/cem/cemcom/ch7.c b/lang/cem/cemcom/ch7.c index 2a6d564f2..8a10fec8b 100644 --- a/lang/cem/cemcom/ch7.c +++ b/lang/cem/cemcom/ch7.c @@ -49,7 +49,7 @@ ch7sel(expp, oper, idf) tp = sd->sd_stype; break; default: - error("-> applied to %s", + expr_error(*expp, "-> applied to %s", symbol2str(tp->tp_fund)); case ERRONEOUS: (*expp)->ex_type = error_type; @@ -60,7 +60,7 @@ ch7sel(expp, oper, idf) else { /* oper == '.' */ /* filter out illegal expressions "non_lvalue.sel" */ if (!(*expp)->ex_lvalue) { - error("dot requires lvalue"); + expr_error(*expp, "dot requires lvalue"); (*expp)->ex_type = error_type; return; } @@ -79,7 +79,7 @@ ch7sel(expp, oper, idf) break; default: if (!is_anon_idf(idf)) - error("selector %s applied to %s", + expr_error(*expp, "selector %s applied to %s", idf->id_text, symbol2str(tp->tp_fund)); case ERRONEOUS: (*expp)->ex_type = error_type; @@ -133,11 +133,11 @@ ch7incr(expp, oper) register int fund = (*expp)->ex_type->tp_fund; if (!(*expp)->ex_lvalue) { - error("no lvalue with %s", symbol2str(oper)); + expr_error(*expp, "no lvalue with %s", symbol2str(oper)); return; } if (fund == ENUM) { - warning("%s on enum", symbol2str(oper)); + expr_warning(*expp, "%s on enum", symbol2str(oper)); addend = (arith)1; } else @@ -153,7 +153,7 @@ ch7incr(expp, oper) #endif NOBITFIELD else { if ((*expp)->ex_type != error_type) - error("%s on %s", + expr_error(*expp, "%s on %s", symbol2str(oper), symbol2str((*expp)->ex_type->tp_fund) ); @@ -210,15 +210,17 @@ ch7cast(expp, oper, tp) tp->tp_fund == ENUM && oper != CAST ) - warning("%s on enums of different types", - symbol2str(oper)); + expr_warning(*expp, + "%s on enums of different types", + symbol2str(oper)); int2int(expp, tp); } else if (oldi && !i) { if (oldtp->tp_fund == ENUM && oper != CAST) - warning("conversion of enum to %s\n", - symbol2str(tp->tp_fund)); + expr_warning(*expp, + "conversion of enum to %s\n", + symbol2str(tp->tp_fund)); int2float(expp, tp); } else @@ -230,7 +232,7 @@ ch7cast(expp, oper, tp) else if (oldtp->tp_fund == POINTER && tp->tp_fund == POINTER) { if (oper != CAST) - warning("incompatible pointers in %s", + expr_warning(*expp, "incompatible pointers in %s", symbol2str(oper)); (*expp)->ex_type = tp; /* free conversion */ } @@ -238,10 +240,12 @@ ch7cast(expp, oper, tp) if (oldtp->tp_fund == POINTER && is_integral_type(tp)) { /* from pointer to integral */ if (oper != CAST) - warning("illegal conversion of pointer to %s", + expr_warning(*expp, + "illegal conversion of pointer to %s", symbol2str(tp->tp_fund)); if (oldtp->tp_size > tp->tp_size) - warning("conversion of pointer to %s loses accuracy", + expr_warning(*expp, + "conversion of pointer to %s loses accuracy", symbol2str(tp->tp_fund)); if (oldtp->tp_size != tp->tp_size) int2int(expp, tp); @@ -261,12 +265,14 @@ ch7cast(expp, oper, tp) if (is_cp_cst(*expp) && (*expp)->VL_VALUE == (arith)0) break; default: - warning("illegal conversion of %s to pointer", + expr_warning(*expp, + "illegal conversion of %s to pointer", symbol2str(oldtp->tp_fund)); break; } if (oldtp->tp_size > tp->tp_size) - warning("conversion of %s to pointer loses accuracy", + expr_warning(*expp, + "conversion of %s to pointer loses accuracy", symbol2str(oldtp->tp_fund)); if (oldtp->tp_size != tp->tp_size) int2int(expp, tp); @@ -275,7 +281,7 @@ ch7cast(expp, oper, tp) } else if (oldtp->tp_size == tp->tp_size && oper == CAST) { - warning("dubious conversion based on equal size"); + expr_warning(*expp, "dubious conversion based on equal size"); (*expp)->ex_type = tp; /* brute force */ } else @@ -299,7 +305,7 @@ ch7asgn(expp, oper, expr) /* We expect an lvalue */ if (!(*expp)->ex_lvalue) { - error("no lvalue in lhs of %s", symbol2str(oper)); + expr_error(*expp, "no lvalue in lhs of %s", symbol2str(oper)); (*expp)->ex_depth = 99; /* no direct store/load at EVAL() */ /* what is 99 ??? DG */ } @@ -310,8 +316,7 @@ ch7asgn(expp, oper, expr) case TIMESAB: case DIVAB: case MODAB: - if (!is_arith_type((*expp)->ex_type)) - error("%s on %s", symbol2str(oper), symbol2str(fund)); + check_arith_type(expp, oper); any2arith(&expr, oper); ch7cast(&expr, CAST, (*expp)->ex_type); break; @@ -319,9 +324,7 @@ ch7asgn(expp, oper, expr) case MINAB: any2arith(&expr, oper); if (fund == POINTER) { - if (!is_integral_type(expr->ex_type)) - error("%s on non-integral type (%s)", - symbol2str(oper), symbol2str(fund)); + check_integral_type(&expr, oper); ch7bin(&expr, '*', intexpr( size_of_type( @@ -332,23 +335,20 @@ ch7asgn(expp, oper, expr) ) ); } - else - if (!is_arith_type((*expp)->ex_type)) - error("%s on %s", symbol2str(oper), symbol2str(fund)); - else + else { + check_arith_type(expp, oper); ch7cast(&expr, CAST, (*expp)->ex_type); + } break; case LEFTAB: case RIGHTAB: + check_integral_type(expp, oper); ch7cast(&expr, oper, int_type); - if (!is_integral_type((*expp)->ex_type)) - error("%s on %s", symbol2str(oper), symbol2str(fund)); break; case ANDAB: case XORAB: case ORAB: - if (!is_integral_type((*expp)->ex_type)) - error("%s on %s", symbol2str(oper), symbol2str(fund)); + check_integral_type(expp, oper); ch7cast(&expr, oper, (*expp)->ex_type); break; } @@ -382,6 +382,18 @@ is_integral_type(tp) } } +check_integral_type(expp, oper) + struct expr **expp; +{ + register struct expr *expr = *expp; + + if (!is_integral_type(expr->ex_type)) { + expr_error(expr, "%s on non-integral type (%s)", + symbol2str(oper), symbol2str(expr->ex_type->tp_fund)); + } + erroneous2int(expp); +} + int is_arith_type(tp) struct type *tp; @@ -403,3 +415,15 @@ is_arith_type(tp) return 0; } } + +check_arith_type(expp, oper) + struct expr **expp; +{ + register struct expr *expr = *expp; + + if (!is_arith_type(expr->ex_type)) { + expr_error(expr, "%s on non-arithmetical type (%s)", + symbol2str(oper), symbol2str(expr->ex_type->tp_fund)); + } + erroneous2int(expp); +} diff --git a/lang/cem/cemcom/ch7bin.c b/lang/cem/cemcom/ch7bin.c index 469a01e6b..cae35b112 100644 --- a/lang/cem/cemcom/ch7bin.c +++ b/lang/cem/cemcom/ch7bin.c @@ -45,7 +45,8 @@ ch7bin(expp, oper, expr) case ERRONEOUS: return; default: - error("indexing an object of type %s", + expr_error(*expp, + "indexing an object of type %s", symbol2str((*expp)->ex_type->tp_fund)); return; } @@ -64,7 +65,7 @@ ch7bin(expp, oper, expr) } if ((*expp)->ex_type->tp_fund != FUNCTION) { if ((*expp)->ex_type != error_type) - error("call of non-function (%s)", + expr_error(*expp, "call of non-function (%s)", symbol2str((*expp)->ex_type->tp_fund)); /* leave the expression; it may still serve */ free_expression(expr); /* there go the parameters */ @@ -81,7 +82,7 @@ ch7bin(expp, oper, expr) case '%': fund = arithbalance(expp, oper, &expr); if (fund == DOUBLE) { - error("floating operand to %%"); + expr_error(*expp, "floating operand to %%"); erroneous2int(expp); } else @@ -197,7 +198,7 @@ ch7bin(expp, oper, expr) || is_struct_or_union(expr->ex_type->tp_fund) ) { if ((*expp)->ex_type != expr->ex_type) { - error("illegal balance"); + expr_error(*expp, "illegal balance"); (*expp)->ex_type = error_type; } } @@ -233,7 +234,7 @@ pntminuspnt(expp, oper, expr) struct type *up_type = (*expp)->ex_type->tp_up; if (up_type != expr->ex_type->tp_up) { - error("subtracting incompatible pointers"); + expr_error(*expp, "subtracting incompatible pointers"); free_expression(expr); erroneous2int(expp); return; diff --git a/lang/cem/cemcom/ch7mon.c b/lang/cem/cemcom/ch7mon.c index 3c25f3756..3018c116d 100644 --- a/lang/cem/cemcom/ch7mon.c +++ b/lang/cem/cemcom/ch7mon.c @@ -29,7 +29,8 @@ ch7mon(oper, expp) array2pointer(expp); if ((*expp)->ex_type->tp_fund != POINTER) { if ((*expp)->ex_type != error_type) - error("* applied to non-pointer (%s)", + expr_error(*expp, + "* applied to non-pointer (%s)", symbol2str((*expp)->ex_type->tp_fund)); (*expp)->ex_type = error_type; } @@ -57,13 +58,13 @@ ch7mon(oper, expp) else #ifndef NOBITFIELD if ((*expp)->ex_type->tp_fund == FIELD) { - error("& applied to field variable"); + expr_error(*expp, "& applied to field variable"); (*expp)->ex_type = error_type; } else #endif NOBITFIELD if (!(*expp)->ex_lvalue) { - error("& applied to non-lvalue"); + expr_error(*expp, "& applied to non-lvalue"); (*expp)->ex_type = error_type; } else { @@ -76,7 +77,8 @@ ch7mon(oper, expp) be used as register anymore */ if (def->df_sc == REGISTER) { - error("& on register variable not allowed"); + expr_error(*expp, + "& on register variable not allowed"); (*expp)->ex_type = error_type; break; /* break case '&' */ } @@ -91,7 +93,7 @@ ch7mon(oper, expp) int fund = (*expp)->ex_type->tp_fund; if (fund == FLOAT || fund == DOUBLE) { - error("~ not allowed on %s operands", + expr_error(*expp, "~ not allowed on %s operands", symbol2str(fund)); erroneous2int(expp); break; diff --git a/lang/cem/cemcom/expr.c b/lang/cem/cemcom/expr.c index 12760689a..ac646a323 100644 --- a/lang/cem/cemcom/expr.c +++ b/lang/cem/cemcom/expr.c @@ -109,7 +109,7 @@ check_conditional(expr, oper, pos_descr) the operator oper. */ if (options['R'] && rank_of_expression(expr) >= rank_of(oper)) - warning("%s %s is ungrammatical", + expr_warning(expr, "%s %s is ungrammatical", symbol2str(expr->OP_OPER), pos_descr); } diff --git a/lang/cem/cemcom/ival.c b/lang/cem/cemcom/ival.c index 3a5efa363..55cb9ff37 100644 --- a/lang/cem/cemcom/ival.c +++ b/lang/cem/cemcom/ival.c @@ -457,7 +457,7 @@ check_ival(expr, type) case LONG: case ENUM: ch7cast(&expr, '=', type); - if (expr->ex_class != Value || expr->VL_IDF != 0) { + if (!is_cp_cst(expr)) { illegal_init_cst(expr); break; } @@ -466,7 +466,7 @@ check_ival(expr, type) #ifndef NOBITFIELD case FIELD: ch7cast(&expr, '=', type->tp_up); - if (expr->ex_class != Value || expr->VL_IDF != 0) { + if (!is_cp_cst(expr)) { illegal_init_cst(expr); break; } @@ -481,7 +481,7 @@ check_ival(expr, type) else if (expr->ex_class == Oper && expr->OP_OPER == INT2FLOAT) { expr = expr->OP_RIGHT; - if (expr->ex_class != Value || expr->VL_IDF != 0) { + if (!is_cp_cst(expr)) { illegal_init_cst(expr); break; }