diff options
author | Maria Matejka <mq@ucw.cz> | 2019-08-13 16:45:27 +0200 |
---|---|---|
committer | Maria Matejka <mq@ucw.cz> | 2019-08-13 16:45:27 +0200 |
commit | dfe63ed84d42178a53b01071c64f23250e74d6d9 (patch) | |
tree | fc4ae31e3f0bb2b5fd5b13316e269bcd768e0f4e | |
parent | 70a4320bdd44122d7a93bc71c77a9d684b3c9adc (diff) |
Filter: Fixing empty block and never-executed-statement bug
-rw-r--r-- | filter/config.Y | 28 | ||||
-rw-r--r-- | filter/test.conf | 8 |
2 files changed, 26 insertions, 10 deletions
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 <xp> cmds_int +%type <xp> cmds_int cmd_prep %type <x> term block cmd cmds constant constructor print_list var_list function_call symbol_value bgp_path_expr bgp_path bgp_path_tail %type <fda> dynamic_attr %type <fsa> 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"); |