Fix for compiler crash when function arguments are unknown.
When a user or system function is called on the RHS of a continuous assignment, and one of the function arguments is an undeclared identifier, the compiler reports the error correctly but then crashes. This patch fixes the crash.
This commit is contained in:
parent
93067149f1
commit
86801bef52
17
elab_expr.cc
17
elab_expr.cc
|
|
@ -1172,14 +1172,19 @@ NetExpr* PECallFunction::elaborate_sfunc_(Design*des, NetScope*scope,
|
||||||
|
|
||||||
bool need_const = NEED_CONST & flags;
|
bool need_const = NEED_CONST & flags;
|
||||||
|
|
||||||
|
unsigned parm_errors = 0;
|
||||||
unsigned missing_parms = 0;
|
unsigned missing_parms = 0;
|
||||||
for (unsigned idx = 0 ; idx < nparms ; idx += 1) {
|
for (unsigned idx = 0 ; idx < nparms ; idx += 1) {
|
||||||
PExpr*expr = parms_[idx];
|
PExpr*expr = parms_[idx];
|
||||||
if (expr) {
|
if (expr) {
|
||||||
NetExpr*tmp = elab_sys_task_arg(des, scope, name, idx,
|
NetExpr*tmp = elab_sys_task_arg(des, scope, name, idx,
|
||||||
expr, need_const);
|
expr, need_const);
|
||||||
|
if (tmp) {
|
||||||
fun->parm(idx, tmp);
|
fun->parm(idx, tmp);
|
||||||
|
} else {
|
||||||
|
parm_errors += 1;
|
||||||
|
fun->parm(idx, 0);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
missing_parms += 1;
|
missing_parms += 1;
|
||||||
fun->parm(idx, 0);
|
fun->parm(idx, 0);
|
||||||
|
|
@ -1194,6 +1199,9 @@ NetExpr* PECallFunction::elaborate_sfunc_(Design*des, NetScope*scope,
|
||||||
des->errors += 1;
|
des->errors += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (missing_parms || parm_errors)
|
||||||
|
return 0;
|
||||||
|
|
||||||
NetExpr*tmp = pad_to_width(fun, expr_wid, *this);
|
NetExpr*tmp = pad_to_width(fun, expr_wid, *this);
|
||||||
tmp->cast_signed(signed_flag_);
|
tmp->cast_signed(signed_flag_);
|
||||||
|
|
||||||
|
|
@ -1312,6 +1320,7 @@ NetExpr* PECallFunction::elaborate_expr(Design*des, NetScope*scope,
|
||||||
|
|
||||||
bool need_const = NEED_CONST & flags;
|
bool need_const = NEED_CONST & flags;
|
||||||
|
|
||||||
|
unsigned parm_errors = 0;
|
||||||
unsigned missing_parms = 0;
|
unsigned missing_parms = 0;
|
||||||
for (unsigned idx = 0 ; idx < parms.count() ; idx += 1) {
|
for (unsigned idx = 0 ; idx < parms.count() ; idx += 1) {
|
||||||
PExpr*tmp = parms_[idx];
|
PExpr*tmp = parms_[idx];
|
||||||
|
|
@ -1320,6 +1329,10 @@ NetExpr* PECallFunction::elaborate_expr(Design*des, NetScope*scope,
|
||||||
def->port(idx)->data_type(),
|
def->port(idx)->data_type(),
|
||||||
(unsigned)def->port(idx)->vector_width(),
|
(unsigned)def->port(idx)->vector_width(),
|
||||||
tmp, need_const);
|
tmp, need_const);
|
||||||
|
if (parms[idx] == 0) {
|
||||||
|
parm_errors += 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (NetEEvent*evt = dynamic_cast<NetEEvent*> (parms[idx])) {
|
if (NetEEvent*evt = dynamic_cast<NetEEvent*> (parms[idx])) {
|
||||||
cerr << evt->get_fileline() << ": error: An event '"
|
cerr << evt->get_fileline() << ": error: An event '"
|
||||||
<< evt->event()->name() << "' can not be a user "
|
<< evt->event()->name() << "' can not be a user "
|
||||||
|
|
@ -1347,6 +1360,8 @@ NetExpr* PECallFunction::elaborate_expr(Design*des, NetScope*scope,
|
||||||
des->errors += 1;
|
des->errors += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (missing_parms || parm_errors)
|
||||||
|
return 0;
|
||||||
|
|
||||||
/* Look for the return value signal for the called
|
/* Look for the return value signal for the called
|
||||||
function. This return value is a magic signal in the scope
|
function. This return value is a magic signal in the scope
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue