diff --git a/filter/config.Y b/filter/config.Y index a67a72a8..340053ba 100644 --- a/filter/config.Y +++ b/filter/config.Y @@ -446,7 +446,7 @@ CF_KEYWORDS(FUNCTION, PRINT, PRINTN, UNSET, RETURN, %nonassoc THEN %nonassoc ELSE -%type cmds_int +%type cmds_int cmd_prep %type term block cmd cmds constant constructor print_list var_list function_call symbol_value bgp_path_expr bgp_path bgp_path_tail %type dynamic_attr %type static_attr @@ -624,17 +624,25 @@ cmds: /* EMPTY */ { $$ = NULL; } | cmds_int { $$ = $1.begin; } ; -cmds_int: cmd { +cmd_prep: cmd { $$.begin = $$.end = $1; - while ($$.end->next) - $$.end = $$.end->next; + if ($1) + while ($$.end->next) + $$.end = $$.end->next; +} + ; + +cmds_int: cmd_prep + | cmds_int cmd_prep { + if (!$1.begin) + $$ = $2; + else if (!$2.begin) + $$ = $1; + else { + $$.begin = $1.begin; + $$.end = $2.end; + $1.end->next = $2.begin; } - | cmds_int cmd { - $$.begin = $1.begin; - $1.end->next = $2; - $$.end = $2; - while ($$.end->next) - $$.end = $$.end->next; } ; diff --git a/filter/test.conf b/filter/test.conf index 09a4a88a..b1342819 100644 --- a/filter/test.conf +++ b/filter/test.conf @@ -1178,6 +1178,10 @@ bt_test_suite(t_include, "Testing including another config file"); function t_if_else() int i; { + /* Empty blocks regression test */ + if true then {} + else {} + if true then bt_assert(true); @@ -1187,6 +1191,10 @@ int i; bt_assert(true); else bt_assert(false); + + /* Empty blocks regression test */ + if true then {} + else {} } bt_test_suite(t_if_else, "Testing if-else statement");