diff --git a/src/parse.c b/src/parse.c index a32e76e12..3bb3f3001 100644 --- a/src/parse.c +++ b/src/parse.c @@ -9018,8 +9018,6 @@ static tree_t p_binding_indication(tree_t comp) if (unit != NULL) unit = primary_unit_of(unit); } } - else - bind = tree_new(T_BINDING); if (comp) { insert_generics(nametab, comp); @@ -9061,7 +9059,11 @@ static void p_configuration_specification(tree_t parent) push_scope(nametab); + bool is_open = (peek() == tUSE && peek_nth(2) == tOPEN); tree_t bind = p_binding_indication(comp); + if (!is_open && bind == NULL) + parse_error(CURRENT_LOC, "a binding indication in an explicit " + "configuration specification must contain an entity aspect"); consume(tSEMI); if (ids != NULL) { diff --git a/test/parse/config.vhd b/test/parse/config.vhd index bab1e159f..281dbfe20 100644 --- a/test/parse/config.vhd +++ b/test/parse/config.vhd @@ -74,3 +74,15 @@ configuration use_pack_ent of ent is end for; end for; end configuration; + +entity b is +end entity b; + +architecture rtl of b is + component ent + end component; + + for ent0 : ent; -- Error +begin + ent0: ent; +end architecture rtl; diff --git a/test/test_parse.c b/test/test_parse.c index fd0dd6b91..212be7875 100644 --- a/test/test_parse.c +++ b/test/test_parse.c @@ -2900,6 +2900,8 @@ START_TEST(test_config) { 45, "cannot find architecture BAD of entity WORK.ENT" }, { 52, "P is not a block that can be configured" }, { 55, "instance P not found" }, + { 85, "a binding indication in an explicit configuration " + "specification must contain an entity aspect" }, { -1, NULL } }; expect_errors(expect); @@ -2979,6 +2981,16 @@ START_TEST(test_config) fail_unless(tree_kind(c) == T_CONFIGURATION); lib_put(lib_work(), c); + e = parse(); + fail_if(e == NULL); + fail_unless(tree_kind(e) == T_ENTITY); + lib_put(lib_work(), e); + + e = parse(); + fail_if(e == NULL); + fail_unless(tree_kind(e) == T_ARCH); + lib_put(lib_work(), e); + c = parse(); fail_unless(c == NULL);