From e2285d8656dad3eba7444bc8574fc4a5d18a4d4d Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Sun, 28 Apr 2024 17:57:25 +0100 Subject: [PATCH] Check for driver for external signal outside process. Fixes #884 --- src/sem.c | 28 ++++++++++++++++++---------- test/regress/issue884.vhd | 33 +++++++++++++++++++++++++++++++++ test/regress/testlist.txt | 1 + test/sem/issue884.vhd | 10 ++++++++++ test/test_sem.c | 20 ++++++++++++++++++++ 5 files changed, 82 insertions(+), 10 deletions(-) create mode 100644 test/regress/issue884.vhd create mode 100644 test/sem/issue884.vhd diff --git a/src/sem.c b/src/sem.c index 51161a18..1dfaba3a 100644 --- a/src/sem.c +++ b/src/sem.c @@ -2615,16 +2615,24 @@ static bool sem_check_signal_target(tree_t target, nametab_t *tab) break; case T_EXTERNAL_NAME: - if (tree_class(decl) != C_SIGNAL) { - tree_t tail = tree_part(decl, tree_parts(decl) - 1); - diag_t *d = diag_new(DIAG_ERROR, tree_loc(target)); - diag_printf(d, "external name %s is not a valid target of " - "signal assignment", istr(tree_ident(tail))); - diag_hint(d, tree_loc(target), "target of signal assignment"); - diag_hint(d, tree_loc(decl), "declared with class %s", - class_str(tree_class(decl))); - diag_emit(d); - return false; + { + if (tree_class(decl) != C_SIGNAL) { + tree_t tail = tree_part(decl, tree_parts(decl) - 1); + diag_t *d = diag_new(DIAG_ERROR, tree_loc(target)); + diag_printf(d, "external name %s is not a valid target of " + "signal assignment", istr(tree_ident(tail))); + diag_hint(d, tree_loc(target), "target of signal assignment"); + diag_hint(d, tree_loc(decl), "declared with class %s", + class_str(tree_class(decl))); + diag_emit(d); + return false; + } + + tree_t sub = find_enclosing(tab, S_SUBPROGRAM); + if (sub != NULL && find_enclosing(tab, S_PROCESS) == NULL) + sem_error(target, "cannot create driver for external name as " + "subprogram %s is not contained within a process " + "statement", type_pp(tree_type(sub))); } break; diff --git a/test/regress/issue884.vhd b/test/regress/issue884.vhd new file mode 100644 index 00000000..b71c5671 --- /dev/null +++ b/test/regress/issue884.vhd @@ -0,0 +1,33 @@ +entity sub is +end entity; + +architecture test of sub is + signal x : integer; +begin + check: process is + begin + wait for 1 ns; + assert x = 42; + wait; + end process; +end architecture; + +entity issue884 is +end entity; + +architecture test of issue884 is +begin + + uut: entity work.sub; + + stim: process is + procedure proc is + begin + << signal .issue884.uut.x : integer >> <= 42; + end procedure; + begin + proc; + wait; + end process; + +end architecture; diff --git a/test/regress/testlist.txt b/test/regress/testlist.txt index 8a1cf4df..ec34f04b 100644 --- a/test/regress/testlist.txt +++ b/test/regress/testlist.txt @@ -969,3 +969,4 @@ ivtest2 verilog,gold ivtest3 verilog vlog9 verilog issue881 normal,2008 +issue884 normal,2008 diff --git a/test/sem/issue884.vhd b/test/sem/issue884.vhd new file mode 100644 index 00000000..4a93ed55 --- /dev/null +++ b/test/sem/issue884.vhd @@ -0,0 +1,10 @@ +entity issue884 is +end entity; + +architecture test of issue884 is + procedure proc is + begin + << signal .issue884.uut.x : integer >> <= 42; -- Error + end procedure; +begin +end architecture; diff --git a/test/test_sem.c b/test/test_sem.c index 929f70e8..2ea44977 100644 --- a/test/test_sem.c +++ b/test/test_sem.c @@ -3540,6 +3540,25 @@ START_TEST(test_incomplete) } END_TEST +START_TEST(test_issue884) +{ + set_standard(STD_08); + + input_from_file(TESTDIR "/sem/issue884.vhd"); + + const error_t expect[] = { + { 7, "cannot create driver for external name as subprogram PROC [] " + "is not contained within a process statement" }, + { -1, NULL } + }; + expect_errors(expect); + + parse_and_check(T_ENTITY, T_ARCH); + + check_expected_errors(); +} +END_TEST + Suite *get_sem_tests(void) { Suite *s = suite_create("sem"); @@ -3706,6 +3725,7 @@ Suite *get_sem_tests(void) tcase_add_test(tc_core, test_lcs2016_16); tcase_add_test(tc_core, test_spec2); tcase_add_test(tc_core, test_incomplete); + tcase_add_test(tc_core, test_issue884); suite_add_tcase(s, tc_core); return s; -- 2.39.2