From 5fed44311cce087b0f135412984de6aa766e707f Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Mon, 5 Feb 2024 21:56:32 +0000 Subject: [PATCH] Allow use of type alias in slice name. Fixes #845 --- src/parse.c | 2 +- test/parse/issue845.vhd | 15 +++++++++++++++ test/test_parse.c | 18 ++++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 test/parse/issue845.vhd diff --git a/src/parse.c b/src/parse.c index e50a99fb..8e3fa147 100644 --- a/src/parse.c +++ b/src/parse.c @@ -1543,7 +1543,7 @@ static bool is_range_expr(tree_t t) switch (tree_kind(t)) { case T_REF: if (tree_has_ref(t)) - return is_type_decl(tree_ref(t)); + return aliased_type_decl(tree_ref(t)) != NULL; else return !!(query_name(nametab, tree_ident(t), NULL) & N_TYPE); diff --git a/test/parse/issue845.vhd b/test/parse/issue845.vhd new file mode 100644 index 00000000..56050b46 --- /dev/null +++ b/test/parse/issue845.vhd @@ -0,0 +1,15 @@ +entity AliasRangeExample is +end entity AliasRangeExample; + +architecture Bhv of AliasRangeExample is + + signal A: bit_vector(31 downto 0); + signal B,C,D: bit_vector(7 downto 0); + + subtype aRange is natural range 7 downto 0; + alias aRangeAlias is aRange; +begin + B <= A(aRange); -- okay + C <= A(aRangeAlias'range); -- okay + D <= A(aRangeAlias); -- ** Error: invalid use of alias ARANGEALIAS +end architecture; diff --git a/test/test_parse.c b/test/test_parse.c index 4fa54c07..73cf99c1 100644 --- a/test/test_parse.c +++ b/test/test_parse.c @@ -6116,6 +6116,23 @@ START_TEST(test_issue837) } END_TEST +START_TEST(test_issue845) +{ + input_from_file(TESTDIR "/parse/issue845.vhd"); + + tree_t e = parse(); + fail_if(e == NULL); + fail_unless(tree_kind(e) == T_ENTITY); + lib_put(lib_work(), e); + + tree_t a = parse(); + fail_if(a == NULL); + fail_unless(tree_kind(a) == T_ARCH); + + fail_if_errors(); +} +END_TEST + Suite *get_parse_tests(void) { Suite *s = suite_create("parse"); @@ -6251,6 +6268,7 @@ Suite *get_parse_tests(void) tcase_add_test(tc_core, test_issue805); tcase_add_test(tc_core, test_visibility11); tcase_add_test(tc_core, test_issue837); + tcase_add_test(tc_core, test_issue845); suite_add_tcase(s, tc_core); return s; -- 2.39.2