From a540a7a163e00ade84f36df17e9faf263d000864 Mon Sep 17 00:00:00 2001 From: Lars-Peter Clausen Date: Fri, 3 Jul 2026 18:54:39 -0700 Subject: [PATCH] Add regression tests for for and foreach type identifier names Check that a for loop variable declaration can use the same name as a visible typedef, including references from the loop condition and step expressions. Also check that procedural foreach can parse an array expression name that is initially seen as a type identifier. Declare the array after the loop so the parser sees the outer typedef while parsing the foreach header, then elaboration resolves the array declaration as a module item. Use unsigned variables and omit the foreach iterator because these tests do not depend on signed values or iteration behavior. This lets both tests run through the vlog95 backend as normal regressions. Signed-off-by: Lars-Peter Clausen --- ivtest/ivltests/sv_type_identifier_for_name.v | 32 +++++++++++++++++++ .../sv_type_identifier_foreach_array_name.v | 25 +++++++++++++++ ivtest/regress-vvp.list | 2 ++ .../sv_type_identifier_for_name.json | 5 +++ ...sv_type_identifier_foreach_array_name.json | 5 +++ 5 files changed, 69 insertions(+) create mode 100644 ivtest/ivltests/sv_type_identifier_for_name.v create mode 100644 ivtest/ivltests/sv_type_identifier_foreach_array_name.v create mode 100644 ivtest/vvp_tests/sv_type_identifier_for_name.json create mode 100644 ivtest/vvp_tests/sv_type_identifier_foreach_array_name.json diff --git a/ivtest/ivltests/sv_type_identifier_for_name.v b/ivtest/ivltests/sv_type_identifier_for_name.v new file mode 100644 index 000000000..2963e6a33 --- /dev/null +++ b/ivtest/ivltests/sv_type_identifier_for_name.v @@ -0,0 +1,32 @@ +// Check that for loop variables can shadow visible type identifiers. + +typedef int T; + +module test; + + reg failed; + int unsigned values [3]; + + initial begin + int unsigned total; + + failed = 1'b0; + total = 0; + + for (int unsigned T = 0; T < 3; T += 1) begin + total += T; + values[T] = 10 + T; + end + + if (total != 3 || values[0] != 10 || + values[1] != 11 || values[2] != 12) begin + $display("FAILED(%0d). for loop variable did not hide typedef", `__LINE__); + failed = 1'b1; + end + + if (!failed) begin + $display("PASSED"); + end + end + +endmodule diff --git a/ivtest/ivltests/sv_type_identifier_foreach_array_name.v b/ivtest/ivltests/sv_type_identifier_foreach_array_name.v new file mode 100644 index 000000000..8a76ebae6 --- /dev/null +++ b/ivtest/ivltests/sv_type_identifier_foreach_array_name.v @@ -0,0 +1,25 @@ +// Check that foreach array expressions can shadow visible type identifiers. + +typedef int A; + +module test; + + reg failed; + + initial begin + failed = 1'b0; + + // The array declaration follows the foreach loop, so the lexer only sees + // the visible typedef when parsing the array expression name. + foreach (A[]) begin + failed = 1'b1; + end + + if (!failed) begin + $display("PASSED"); + end + end + + int unsigned A [3]; + +endmodule diff --git a/ivtest/regress-vvp.list b/ivtest/regress-vvp.list index 04be7ee50..54997d6c5 100644 --- a/ivtest/regress-vvp.list +++ b/ivtest/regress-vvp.list @@ -398,6 +398,8 @@ sv_type_identifier_block_label_name vvp_tests/sv_type_identifier_block_label_nam sv_type_identifier_config_name vvp_tests/sv_type_identifier_config_name.json sv_type_identifier_enum_item_name vvp_tests/sv_type_identifier_enum_item_name.json sv_type_identifier_event_name vvp_tests/sv_type_identifier_event_name.json +sv_type_identifier_for_name vvp_tests/sv_type_identifier_for_name.json +sv_type_identifier_foreach_array_name vvp_tests/sv_type_identifier_foreach_array_name.json sv_type_identifier_foreach_name vvp_tests/sv_type_identifier_foreach_name.json sv_type_identifier_fork_label_name vvp_tests/sv_type_identifier_fork_label_name.json sv_type_identifier_function_name vvp_tests/sv_type_identifier_function_name.json diff --git a/ivtest/vvp_tests/sv_type_identifier_for_name.json b/ivtest/vvp_tests/sv_type_identifier_for_name.json new file mode 100644 index 000000000..0b0e7b9a6 --- /dev/null +++ b/ivtest/vvp_tests/sv_type_identifier_for_name.json @@ -0,0 +1,5 @@ +{ + "type" : "normal", + "source" : "sv_type_identifier_for_name.v", + "iverilog-args" : [ "-g2005-sv" ] +} diff --git a/ivtest/vvp_tests/sv_type_identifier_foreach_array_name.json b/ivtest/vvp_tests/sv_type_identifier_foreach_array_name.json new file mode 100644 index 000000000..b64ff4aea --- /dev/null +++ b/ivtest/vvp_tests/sv_type_identifier_foreach_array_name.json @@ -0,0 +1,5 @@ +{ + "type" : "normal", + "source" : "sv_type_identifier_foreach_array_name.v", + "iverilog-args" : [ "-g2005-sv" ] +}