summaryrefslogtreecommitdiff
path: root/filter
diff options
context:
space:
mode:
authorMaria Matejka <mq@ucw.cz>2019-08-13 16:45:27 +0200
committerMaria Matejka <mq@ucw.cz>2019-08-13 16:45:27 +0200
commitdfe63ed84d42178a53b01071c64f23250e74d6d9 (patch)
treefc4ae31e3f0bb2b5fd5b13316e269bcd768e0f4e /filter
parent70a4320bdd44122d7a93bc71c77a9d684b3c9adc (diff)
Filter: Fixing empty block and never-executed-statement bug
Diffstat (limited to 'filter')
-rw-r--r--filter/config.Y28
-rw-r--r--filter/test.conf8
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");