From: Nick Gasson Date: Sun, 28 Apr 2024 16:57:25 +0000 (+0100) Subject: Check for driver for external signal outside process. Fixes #884 X-Git-Url: https://git.nickg.me.uk/nvc.git/commitdiff_plain Check for driver for external signal outside process. Fixes #884 --- 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;