From d6bddd4df1b1541cd260b4f6d07006a89ecf5b39 Mon Sep 17 00:00:00 2001 From: NikLeberg Date: Mon, 6 Jan 2025 09:49:44 +0000 Subject: [PATCH] Fix crash with invalid aggregate field name --- src/names.c | 4 ++-- test/parse/aggregate2.vhd | 13 +++++++++++++ test/test_parse.c | 25 +++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 test/parse/aggregate2.vhd diff --git a/src/names.c b/src/names.c index 9efa88995..ce1cdd6bc 100644 --- a/src/names.c +++ b/src/names.c @@ -4433,9 +4433,9 @@ static type_t solve_record_aggregate(nametab_t *tab, tree_t agg, type_t type) { push_scope_for_fields(tab, type); tree_t name = tree_name(a); - solve_types(tab, name, NULL); + type_t ntype = solve_types(tab, name, NULL); pop_scope(tab); - if (tree_has_ref(name)) { + if (!type_is_none(ntype) && tree_has_ref(name)) { tree_t field = tree_ref(name); type_set_add(tab, solve_field_subtype(type, field), field); if (tree_kind(field) == T_FIELD_DECL) { diff --git a/test/parse/aggregate2.vhd b/test/parse/aggregate2.vhd new file mode 100644 index 000000000..7f1489eb5 --- /dev/null +++ b/test/parse/aggregate2.vhd @@ -0,0 +1,13 @@ +package tick is + type t_data_segment is record end record; + constant C_SEGMENT_RECORDS : t_data_segment := ( + data'last => (others => '0') -- Error + ); +end package; + +package brack is + type t_data_segment is record end record; + constant C_SEGMENT_RECORDS : t_data_segment := ( + data[word => (others => '0') -- Error + ); +end package; diff --git a/test/test_parse.c b/test/test_parse.c index 1173833bd..f8c07188b 100644 --- a/test/test_parse.c +++ b/test/test_parse.c @@ -7130,6 +7130,30 @@ START_TEST(test_gensub) } END_TEST +START_TEST(test_aggregate2) +{ + set_standard(STD_19); + + input_from_file(TESTDIR "/parse/aggregate2.vhd"); + + const error_t expect[] = { + { 4, "no visible declaration for DATA" }, + { 4, "association choice must be a field name" }, + { 11, "no visible declaration for WORD" }, + { 11, "unexpected => while parsing signature" }, + { 11, "association choice must be a field name" }, + { -1, NULL } + }; + expect_errors(expect); + + parse_and_check(T_PACKAGE, T_PACKAGE); + + fail_unless(parse() == NULL); + + check_expected_errors(); +} +END_TEST + Suite *get_parse_tests(void) { Suite *s = suite_create("parse"); @@ -7304,6 +7328,7 @@ Suite *get_parse_tests(void) tcase_add_test(tc_core, test_issue1096); tcase_add_test(tc_core, test_alias5); tcase_add_test(tc_core, test_gensub); + tcase_add_test(tc_core, test_aggregate2); suite_add_tcase(s, tc_core); return s;