From dedacffd78c0b4b04b51053f1eb7e901aa1ac6dc Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Tue, 2 Jan 2024 19:47:24 +0000 Subject: [PATCH] Fix crash simplifying if-statement. Issue #821 --- src/simp.c | 16 +++++++++------- test/simp/issue821.vhd | 21 +++++++++++++++++++++ test/test_simp.c | 20 ++++++++++++++++++++ 3 files changed, 50 insertions(+), 7 deletions(-) create mode 100644 test/simp/issue821.vhd diff --git a/src/simp.c b/src/simp.c index 590bce94..3eed61d7 100644 --- a/src/simp.c +++ b/src/simp.c @@ -942,20 +942,22 @@ static tree_t simp_if(tree_t t) simp_find_drivers(c, &drivers); } - if (drivers.count > 0 && tree_conds(new) > 0) - simp_make_dummy_drivers(tree_cond(new, 0), &drivers); - else if (drivers.count > 0) { + if (drivers.count > 0) { tree_t b = tree_new(T_SEQUENCE); tree_set_loc(b, tree_loc(t)); - if (tree_has_ident(t)) - tree_set_ident(b, tree_ident(t)); + if (tree_conds(new) > 0) + tree_add_stmt(b, new); + else if (tree_has_ident(new)) + tree_set_ident(b, tree_ident(new)); simp_make_dummy_drivers(b, &drivers); return b; } - - return tree_conds(new) > 0 ? new : NULL; + else if (tree_conds(new) > 0) + return new; + else + return NULL; } static tree_t simp_while(tree_t t) diff --git a/test/simp/issue821.vhd b/test/simp/issue821.vhd new file mode 100644 index 00000000..93e9ca8c --- /dev/null +++ b/test/simp/issue821.vhd @@ -0,0 +1,21 @@ +entity issue821 is +end entity; + +architecture test of issue821 is + signal x : integer; +begin + + g: for i in 1 to 2 generate + begin + p: process is + begin + if i > 1 then + x <= 1; + elsif x < 100 then + x <= 2; + end if; + wait; + end process; + end generate; + +end architecture; diff --git a/test/test_simp.c b/test/test_simp.c index 9df89eb9..1a2e48c0 100644 --- a/test/test_simp.c +++ b/test/test_simp.c @@ -1655,6 +1655,25 @@ START_TEST(test_issue812) } END_TEST +START_TEST(test_issue821) +{ + input_from_file(TESTDIR "/simp/issue821.vhd"); + + tree_t top = run_elab(); + + tree_t g1 = tree_stmt(tree_stmt(top, 0), 0); + fail_unless(tree_kind(g1) == T_BLOCK); + + tree_t seq = tree_stmt(tree_stmt(g1, 0), 0); + fail_unless(tree_kind(seq) == T_SEQUENCE); + fail_unless(tree_stmts(seq) == 2); + fail_unless(tree_kind(tree_stmt(seq, 0)) == T_IF); + fail_unless(tree_kind(tree_stmt(seq, 1)) == T_DUMMY_DRIVER); + + fail_if_errors(); +} +END_TEST + Suite *get_simp_tests(void) { Suite *s = suite_create("simplify"); @@ -1720,6 +1739,7 @@ Suite *get_simp_tests(void) tcase_add_test(tc_core, test_issue782); tcase_add_test(tc_core, test_order2); tcase_add_test(tc_core, test_issue812); + tcase_add_test(tc_core, test_issue821); suite_add_tcase(s, tc_core); return s; -- 2.39.2