Only allow null for-loop initialisation/termination/step for SV 2012+.
As discussed in issue #1143, the for loop initialisation statement, termination condition, and step statement were only made optional in IEEE 1800-2012. So check all three are present when compiling for ealier generations.
This commit is contained in:
parent
cb6544fac3
commit
0695c1fe9a
24
parse.y
24
parse.y
|
|
@ -298,6 +298,23 @@ static void check_end_label(const struct vlltype&loc, const char *type,
|
||||||
delete[] end;
|
delete[] end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void check_for_loop(const struct vlltype&loc, PExpr*init,
|
||||||
|
PExpr*cond, Statement*step)
|
||||||
|
{
|
||||||
|
if (generation_flag >= GN_VER2012)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!init)
|
||||||
|
yyerror(loc, "error: null for-loop initialization requires "
|
||||||
|
"SystemVerilog 2012 or later.");
|
||||||
|
if (!cond)
|
||||||
|
yyerror(loc, "error: null for-loop termination requires "
|
||||||
|
"SystemVerilog 2012 or later.");
|
||||||
|
if (!step)
|
||||||
|
yyerror(loc, "error: null for-loop step requires "
|
||||||
|
"SystemVerilog 2012 or later.");
|
||||||
|
}
|
||||||
|
|
||||||
static void current_task_set_statement(const YYLTYPE&loc, std::vector<Statement*>*s)
|
static void current_task_set_statement(const YYLTYPE&loc, std::vector<Statement*>*s)
|
||||||
{
|
{
|
||||||
if (s == 0) {
|
if (s == 0) {
|
||||||
|
|
@ -1756,7 +1773,8 @@ lifetime_opt /* IEEE1800-2005: A.2.1.3 */
|
||||||
loop_statement /* IEEE1800-2005: A.6.8 */
|
loop_statement /* IEEE1800-2005: A.6.8 */
|
||||||
: K_for '(' lpvalue '=' expression ';' expression_opt ';' for_step_opt ')'
|
: K_for '(' lpvalue '=' expression ';' expression_opt ';' for_step_opt ')'
|
||||||
statement_or_null
|
statement_or_null
|
||||||
{ PForStatement*tmp = new PForStatement($3, $5, $7, $9, $11);
|
{ check_for_loop(@1, $5, $7, $9);
|
||||||
|
PForStatement*tmp = new PForStatement($3, $5, $7, $9, $11);
|
||||||
FILE_NAME(tmp, @1);
|
FILE_NAME(tmp, @1);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
|
|
@ -1764,7 +1782,8 @@ loop_statement /* IEEE1800-2005: A.6.8 */
|
||||||
// The initialization statement is optional.
|
// The initialization statement is optional.
|
||||||
| K_for '(' ';' expression_opt ';' for_step_opt ')'
|
| K_for '(' ';' expression_opt ';' for_step_opt ')'
|
||||||
statement_or_null
|
statement_or_null
|
||||||
{ PForStatement*tmp = new PForStatement(nullptr, nullptr, $4, $6, $8);
|
{ check_for_loop(@1, nullptr, $4, $6);
|
||||||
|
PForStatement*tmp = new PForStatement(nullptr, nullptr, $4, $6, $8);
|
||||||
FILE_NAME(tmp, @1);
|
FILE_NAME(tmp, @1);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
|
|
@ -1794,6 +1813,7 @@ loop_statement /* IEEE1800-2005: A.6.8 */
|
||||||
PEIdent*tmp_ident = pform_new_ident(@5, tmp_hident);
|
PEIdent*tmp_ident = pform_new_ident(@5, tmp_hident);
|
||||||
FILE_NAME(tmp_ident, @5);
|
FILE_NAME(tmp_ident, @5);
|
||||||
|
|
||||||
|
check_for_loop(@1, $7, $9, $11);
|
||||||
PForStatement*tmp_for = new PForStatement(tmp_ident, $7, $9, $11, $14);
|
PForStatement*tmp_for = new PForStatement(tmp_ident, $7, $9, $11, $14);
|
||||||
FILE_NAME(tmp_for, @1);
|
FILE_NAME(tmp_for, @1);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue