]> git.nickg.me.uk Git - nvc.git/commitdiff
Check for driver for external signal outside process. Fixes #884 master github/master sr.ht/master
authorNick Gasson <nick@nickg.me.uk>
Sun, 28 Apr 2024 16:57:25 +0000 (17:57 +0100)
committerNick Gasson <nick@nickg.me.uk>
Sun, 28 Apr 2024 21:49:04 +0000 (22:49 +0100)
src/sem.c
test/regress/issue884.vhd [new file with mode: 0644]
test/regress/testlist.txt
test/sem/issue884.vhd [new file with mode: 0644]
test/test_sem.c

index 51161a18c72bf8fb47f2c0f814408958b55ccdb6..1dfaba3a7cb1a606245bc49d63bea74bc5caba4a 100644 (file)
--- 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:
          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;
 
          }
          break;
 
diff --git a/test/regress/issue884.vhd b/test/regress/issue884.vhd
new file mode 100644 (file)
index 0000000..b71c567
--- /dev/null
@@ -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;
index 8a1cf4df6a5800ce487d7256ef9ac47dcf40641c..ec34f04bb68fd10958687325b6f2e1effe33a2f2 100644 (file)
@@ -969,3 +969,4 @@ ivtest2         verilog,gold
 ivtest3         verilog
 vlog9           verilog
 issue881        normal,2008
 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 (file)
index 0000000..4a93ed5
--- /dev/null
@@ -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;
index 929f70e83223419258284112db1e7138e7434fe6..2ea449775964194adcb77fb962bc5a3253223db7 100644 (file)
@@ -3540,6 +3540,25 @@ START_TEST(test_incomplete)
 }
 END_TEST
 
 }
 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");
 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_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;
    suite_add_tcase(s, tc_core);
 
    return s;