From bef59e0b6c8deed0b6864a30bce434e1764061c0 Mon Sep 17 00:00:00 2001 From: Martin Whitaker Date: Sat, 16 Jun 2012 23:00:19 +0100 Subject: [PATCH] Fix for pr3534333. The parser had been changed to support null statements in sequential and parallel blocks (a feature introduced in SystemVerilog), but was not supported in elaboration, leading to a compiler crash. This patch fixes this by discarding the null statements during parsing. --- parse.y | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/parse.y b/parse.y index 27c8d7e5a..0a0a1b744 100644 --- a/parse.y +++ b/parse.y @@ -249,9 +249,12 @@ static void current_task_set_statement(const YYLTYPE&loc, vector*s) current_task->set_statement(tmp); return; } + assert(s); - /* The parser assures that there is a non-empty vector. */ - assert(s && !s->empty()); + /* An empty vector represents one or more null statements. Handle + this as a simple null statement. */ + if (s->empty()) + return; /* A vector of 1 is handled as a simple statement. */ if (s->size() == 1) { @@ -284,9 +287,12 @@ static void current_function_set_statement(const YYLTYPE&loc, vector current_function->set_statement(tmp); return; } + assert(s); - /* The parser assures that there is a non-empty vector. */ - assert(s && !s->empty()); + /* An empty vector represents one or more null statements. Handle + this as a simple null statement. */ + if (s->empty()) + return; /* A vector of 1 is handled as a simple statement. */ if (s->size() == 1) { @@ -5699,12 +5705,12 @@ statement_or_null_list_opt statement_or_null_list : statement_or_null_list statement_or_null { vector*tmp = $1; - tmp->push_back($2); + if ($2) tmp->push_back($2); $$ = tmp; } | statement_or_null - { vector*tmp = new vector(1); - tmp->at(0) = $1; + { vector*tmp = new vector(0); + if ($1) tmp->push_back($1); $$ = tmp; } ;