From c6391bddaf22c32008f067829758e2e2f4798fb2 Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Thu, 7 Mar 2024 21:28:41 +0000 Subject: [PATCH] Lost update to FILE_OPEN STATUS output. Fixes #864 --- src/vcode.c | 1 + test/elab/issue864.vhd | 25 +++++++++++++++++++++++++ test/test_elab.c | 21 +++++++++++++++++++++ 3 files changed, 47 insertions(+) create mode 100644 test/elab/issue864.vhd diff --git a/src/vcode.c b/src/vcode.c index 5df2ed25..07d4e730 100644 --- a/src/vcode.c +++ b/src/vcode.c @@ -3665,6 +3665,7 @@ vcode_reg_t emit_load(vcode_var_t var) else if (other->kind == VCODE_OP_FCALL || other->kind == VCODE_OP_PCALL || other->kind == VCODE_OP_FILE_READ + || other->kind == VCODE_OP_FILE_OPEN || other->kind == VCODE_OP_STORE_INDIRECT || other->kind == VCODE_OP_DEALLOCATE) state = CONSERVATIVE; // May write to variable diff --git a/test/elab/issue864.vhd b/test/elab/issue864.vhd new file mode 100644 index 00000000..ffd9e683 --- /dev/null +++ b/test/elab/issue864.vhd @@ -0,0 +1,25 @@ +entity issue864 is +end entity ; + +architecture arch of issue864 is + + impure function from_file(fname : in string) return real is + use std.textio.all ; + file f : text ; + variable s : file_open_status ; + variable l : line ; + variable r : real ; + begin + file_open(s, f, fname, READ_MODE) ; + if s /= OPEN_OK then + report "Could not open: " & fname severity failure ; + end if ; + readline(f, l) ; + read(l, r) ; + return r ; + end function ; + + constant r : real := from_file("./nonexistent.txt") ; + +begin +end architecture ; diff --git a/test/test_elab.c b/test/test_elab.c index e0a87780..5b9fedd0 100644 --- a/test/test_elab.c +++ b/test/test_elab.c @@ -1829,6 +1829,7 @@ END_TEST START_TEST(test_ename3) { set_standard(STD_08); + input_from_file(TESTDIR "/elab/ename3.vhd"); const error_t expect[] = { @@ -1858,6 +1859,25 @@ START_TEST(test_issue855) } END_TEST +START_TEST(test_issue864) +{ + set_standard(STD_08); + + input_from_file(TESTDIR "/elab/issue864.vhd"); + + const error_t expect[] = { + { 15, "Could not open: ./nonexistent.txt" }, + { -1, NULL } + }; + expect_errors(expect); + + tree_t e = run_elab(); + fail_unless(e == NULL); + + check_expected_errors(); +} +END_TEST + Suite *get_elab_tests(void) { Suite *s = suite_create("elab"); @@ -1957,6 +1977,7 @@ Suite *get_elab_tests(void) tcase_add_test(tc, test_vlog1); tcase_add_test(tc, test_ename3); tcase_add_test(tc, test_issue855); + tcase_add_test(tc, test_issue864); suite_add_tcase(s, tc); return s; -- 2.39.2