mirror of
https://github.com/steveicarus/iverilog.git
synced 2026-08-22 05:47:31 +02:00
Handle missing string substr() arguments
The string substr() method reports an error if it is called with the wrong number of arguments, but the error was not counted and elaboration continued with missing function arguments. A call such as `s.substr(0)` could therefore crash after printing the diagnostic. Count the arity error and fill missing internal arguments with dummy constants so elaboration can recover without building an incomplete system function call. Signed-off-by: Lars-Peter Clausen <[email protected]>
This commit is contained in:
+8
-2
@@ -3474,10 +3474,12 @@ NetExpr* PECallFunction::elaborate_expr_method_(Design*des, NetScope*scope,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (method_name == "substr") {
|
if (method_name == "substr") {
|
||||||
if (parms_.size() != 2)
|
if (parms_.size() != 2) {
|
||||||
cerr << get_fileline() << ": error: Method `substr()`"
|
cerr << get_fileline() << ": error: Method `substr()`"
|
||||||
<< " requires 2 arguments, got " << parms_.size()
|
<< " requires 2 arguments, got " << parms_.size()
|
||||||
<< "." << endl;
|
<< "." << endl;
|
||||||
|
des->errors += 1;
|
||||||
|
}
|
||||||
|
|
||||||
static const std::vector<perm_string> parm_names = {
|
static const std::vector<perm_string> parm_names = {
|
||||||
perm_string::literal("i"),
|
perm_string::literal("i"),
|
||||||
@@ -3493,8 +3495,12 @@ NetExpr* PECallFunction::elaborate_expr_method_(Design*des, NetScope*scope,
|
|||||||
sys_expr->parm(0, sub_expr);
|
sys_expr->parm(0, sub_expr);
|
||||||
|
|
||||||
for (int i = 0; i < 2; i++) {
|
for (int i = 0; i < 2; i++) {
|
||||||
if (!args[i])
|
if (!args[i]) {
|
||||||
|
NetEConst*expr = make_const_0(32);
|
||||||
|
expr->set_line(*this);
|
||||||
|
sys_expr->parm(i + 1, expr);
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
auto expr = elaborate_rval_expr(des, scope,
|
auto expr = elaborate_rval_expr(des, scope,
|
||||||
&netvector_t::atom2u32,
|
&netvector_t::atom2u32,
|
||||||
|
|||||||
Reference in New Issue
Block a user