From cd8c307d930da2983292197f190c615b560efe4a Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Fri, 8 Mar 2024 14:29:59 +0000 Subject: [PATCH] Fix crash after error in external name. Fixes #860 --- src/lower.c | 9 ++++++-- test/elab/issue860.vhd | 49 ++++++++++++++++++++++++++++++++++++++++++ test/test_elab.c | 21 ++++++++++++++++++ 3 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 test/elab/issue860.vhd diff --git a/src/lower.c b/src/lower.c index a6d6c28c..6bcc2b65 100644 --- a/src/lower.c +++ b/src/lower.c @@ -3027,8 +3027,13 @@ static vcode_reg_t lower_external_name(lower_unit_t *lu, tree_t ref) if (decl == NULL) { type_t type = tree_type(ref); vcode_type_t vbounds = lower_bounds(type); - if (tree_class(ref) == C_SIGNAL) - return emit_undefined(lower_signal_type(type), vbounds); + if (tree_class(ref) == C_SIGNAL) { + vcode_type_t vstype = lower_signal_type(type); + if (type_is_homogeneous(type)) + return emit_undefined(vstype, vbounds); + else + return emit_undefined(vtype_pointer(vstype), vbounds); + } else return emit_undefined(vtype_pointer(lower_type(type)), vbounds); } diff --git a/test/elab/issue860.vhd b/test/elab/issue860.vhd new file mode 100644 index 00000000..9e3a3ad4 --- /dev/null +++ b/test/elab/issue860.vhd @@ -0,0 +1,49 @@ +package pack is + type t_sbi_if is record + addr : bit_vector; + wdata : bit_vector; + rdata : bit_vector; + end record; +end package; + +use work.pack.all; + +entity ethernet_th is + generic( + GC_SBI_ADDR_WIDTH : positive := 8; + GC_SBI_DATA_WIDTH : positive := 8 + ); +end entity ethernet_th; + +architecture struct_sbi of ethernet_th is + signal clk : bit; + signal i1_sbi_if : t_sbi_if(addr(GC_SBI_ADDR_WIDTH - 1 downto 0), wdata(GC_SBI_DATA_WIDTH - 1 downto 0), rdata(GC_SBI_DATA_WIDTH - 1 downto 0)); +begin +end architecture struct_sbi; + +use work.pack.all; + +entity test is + generic( + GC_DATA_WIDTH : positive := 8); +end entity; + +architecture tb of test is + constant C_ADDR_WIDTH : positive := 8; + + alias clk is << signal .test.i_test_harness.clk : bit >>; -- Error + alias i1_sbi_if is << signal .test.i_test_harness.i1_sbi_if : + t_sbi_if(addr(C_ADDR_WIDTH - 1 downto 0), wdata(GC_DATA_WIDTH - 1 downto 0), rdata(GC_DATA_WIDTH - 1 downto 0)) >>; -- Error +begin + + i_test_harness : entity work.ethernet_th(struct_sbi) + generic map( + GC_SBI_ADDR_WIDTH => C_ADDR_WIDTH, + GC_SBI_DATA_WIDTH => GC_DATA_WIDTH + ); + + p_main: process + begin + wait; + end process p_main; +end architecture; diff --git a/test/test_elab.c b/test/test_elab.c index 5b9fedd0..ccd6a2d4 100644 --- a/test/test_elab.c +++ b/test/test_elab.c @@ -1878,6 +1878,26 @@ START_TEST(test_issue864) } END_TEST +START_TEST(test_issue860) +{ + set_standard(STD_08); + + input_from_file(TESTDIR "/elab/issue860.vhd"); + + const error_t expect[] = { + { 34, "external name CLK not found" }, + { 35, "external name I1_SBI_IF not found" }, + { -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"); @@ -1978,6 +1998,7 @@ Suite *get_elab_tests(void) tcase_add_test(tc, test_ename3); tcase_add_test(tc, test_issue855); tcase_add_test(tc, test_issue864); + tcase_add_test(tc, test_issue860); suite_add_tcase(s, tc); return s; -- 2.39.2