diff --git a/ivtest/gold/br_gh1117.gold b/ivtest/gold/br_gh1117.gold new file mode 100644 index 000000000..47ae20fb1 --- /dev/null +++ b/ivtest/gold/br_gh1117.gold @@ -0,0 +1 @@ +./ivltests/br_gh1117.v:10: error: generate/endgenerate regions cannot nest. diff --git a/ivtest/ivltests/br_gh1117.v b/ivtest/ivltests/br_gh1117.v new file mode 100644 index 000000000..33302d858 --- /dev/null +++ b/ivtest/ivltests/br_gh1117.v @@ -0,0 +1,25 @@ +module top; + wire x, y, z; + reg in; + genvar i; + + generate + for (i=0; i<1; i=i+1) begin + assign x = in; + end + generate // This should be an error + for (i=0; i<1; i=i+1) begin + assign y = in; + end + endgenerate + endgenerate + + generate // This is ok + for (i=0; i<1; i=i+1) begin + assign z = in; + end + endgenerate + + initial $display("Failed: should be a compile error!"); + +endmodule diff --git a/ivtest/regress-vlg.list b/ivtest/regress-vlg.list index 1454e6170..4a6475b9d 100644 --- a/ivtest/regress-vlg.list +++ b/ivtest/regress-vlg.list @@ -353,6 +353,7 @@ br_gh788 normal,-gno-io-range-error,-Wno-anachronisms ivltests gold=br_gh788.go br_gh793 normal ivltests br_gh827 normal ivltests gold=br_gh827.gold br_gh889 normal,-gspecify ivltests gold=br_gh889.gold +br_gh1117 CE ivltests gold=br_gh1117.gold br_gh1175a CE ivltests gold=br_gh1175a.gold br_gh1175b CE ivltests gold=br_gh1175b.gold br_gh1175c CE ivltests gold=br_gh1175c.gold diff --git a/parse.y b/parse.y index 4cddc1ad4..9712f76b1 100644 --- a/parse.y +++ b/parse.y @@ -45,6 +45,7 @@ extern void lex_end_table(); static data_type_t* param_data_type = 0; static bool param_is_local = false; static bool param_is_type = false; +static bool in_gen_region = false; static std::list* specparam_active_range = 0; /* Port declaration lists use this structure for context. */ @@ -74,6 +75,15 @@ static stack current_block_stack; specified. */ static LexicalScope::lifetime_t var_lifetime; +static void check_in_gen_region(const struct vlltype &loc) +{ + if (in_gen_region) { + cerr << loc << ": error: generate/endgenerate regions cannot nest." << endl; + error_count += 1; + } + in_gen_region = true; +} + static pform_name_t* pform_create_this(void) { name_component_t name (perm_string::literal(THIS_TOKEN)); @@ -5208,15 +5218,7 @@ module_item generate/endgenerate regions do not nest. Generate schemes nest, but generate regions do not. */ - | K_generate generate_item_list_opt K_endgenerate - { // Test for bad nesting. I understand it, but it is illegal. - if (pform_parent_generate()) { - cerr << @1 << ": error: Generate/endgenerate regions cannot nest." << endl; - cerr << @1 << ": : Try removing optional generate/endgenerate keywords," << endl; - cerr << @1 << ": : or move them to surround the parent generate scheme." << endl; - error_count += 1; - } - } + | K_generate { check_in_gen_region(@1); } generate_item_list_opt K_endgenerate { in_gen_region = false; } | K_genvar list_of_identifiers ';' { pform_genvars(@1, $2); }