Add regression tests for types during symbol lookup

Check that a visible type prevents lookup from continuing to an outer value
for function and task calls and implicit `.name` and wildcard `.*` port
connections. Check that types are rejected as disable targets, named events,
procedural l-values, and expressions elaborated with a required type.

Also check the opposite lexical-order case where a typedef declared after a
reference does not hide an outer named event or variable. Use diagnostic gold
files for each negative case that emits the type-specific error.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
This commit is contained in:
Lars-Peter Clausen 2026-08-10 23:32:00 -07:00
parent c5ab989dc7
commit 9a2106a439
33 changed files with 324 additions and 0 deletions

View File

@ -0,0 +1,3 @@
ivltests/sv_type_identifier_disable_path_fail.v:7: error: Type name `test.value' cannot be used as a disable target.
ivltests/sv_type_identifier_disable_path_fail.v:5: : The type was declared here.
Elaboration failed

View File

@ -0,0 +1,3 @@
ivltests/sv_type_identifier_event_trigger_fail.v:11: error: Type name `i_container.value' cannot be used as a named event.
ivltests/sv_type_identifier_event_trigger_fail.v:4: : The type was declared here.
Elaboration failed

View File

@ -0,0 +1,3 @@
ivltests/sv_type_identifier_procedural_lvalue_fail.v:11: error: Type name `i_container.value' cannot be used as a procedural l-value.
ivltests/sv_type_identifier_procedural_lvalue_fail.v:4: : The type was declared here.
Elaboration failed

View File

@ -0,0 +1,3 @@
ivltests/sv_type_identifier_shadow_function_call_fail.v:11: error: Type name `value' cannot be used in a function call.
ivltests/sv_type_identifier_shadow_function_call_fail.v:13: : The type was declared here.
Elaboration failed

View File

@ -0,0 +1,3 @@
ivltests/sv_type_identifier_shadow_function_statement_fail.v:10: error: Type name `value' cannot be used in a task or function call.
ivltests/sv_type_identifier_shadow_function_statement_fail.v:12: : The type was declared here.
Elaboration failed

View File

@ -0,0 +1,4 @@
ivltests/sv_type_identifier_shadow_implicit_port_fail.v:13: error: Type name `value' cannot be used in an expression.
ivltests/sv_type_identifier_shadow_implicit_port_fail.v:12: : The type was declared here.
ivltests/sv_type_identifier_shadow_implicit_port_fail.v:13: error: Failed to elaborate input port 'value' expression (value) in instance inner.i_m of module: M.
2 error(s) during elaboration.

View File

@ -0,0 +1,3 @@
ivltests/sv_type_identifier_shadow_task_call_fail.v:8: error: Type name `value' cannot be used in a task or function call.
ivltests/sv_type_identifier_shadow_task_call_fail.v:10: : The type was declared here.
Elaboration failed

View File

@ -0,0 +1,3 @@
ivltests/sv_type_identifier_typed_expression_fail.v:13: error: Type name `i_container.value' cannot be used in an expression.
ivltests/sv_type_identifier_typed_expression_fail.v:4: : The type was declared here.
Elaboration failed

View File

@ -0,0 +1,9 @@
// Check that a type in a disable target path is rejected.
module test;
typedef logic value;
initial disable test.value;
endmodule

View File

@ -0,0 +1,32 @@
// Check that a later typedef does not hide an outer named event.
module test;
reg failed;
reg seen;
event value;
always @value seen = 1'b1;
if (1) begin : inner
initial begin
failed = 1'b0;
seen = 1'b0;
#1 -> value;
#1;
if (seen !== 1'b1) begin
$display("FAILED(%0d). Named event was not triggered", `__LINE__);
failed = 1'b1;
end
if (!failed) begin
$display("PASSED");
end
end
typedef logic value;
end
endmodule

View File

@ -0,0 +1,13 @@
// Check that a type cannot be used as a named event.
module container;
typedef logic value;
endmodule
module test;
container i_container();
initial -> i_container.value;
endmodule

View File

@ -0,0 +1,27 @@
// Check that a later typedef does not hide an outer procedural l-value.
module test;
reg failed;
integer value;
if (1) begin : inner
initial begin
failed = 1'b0;
value = 42;
if (value !== 42) begin
$display("FAILED(%0d). Procedural l-value assignment failed",
`__LINE__);
failed = 1'b1;
end
if (!failed) begin
$display("PASSED");
end
end
typedef logic value;
end
endmodule

View File

@ -0,0 +1,13 @@
// Check that a type cannot be used as a procedural l-value.
module container;
typedef logic value;
endmodule
module test;
container i_container();
initial i_container.value = 1;
endmodule

View File

@ -0,0 +1,15 @@
// Check that a later typedef hides an outer function during call lookup.
function integer value;
value = 1;
endfunction
module test;
integer result;
initial result = value();
typedef logic value;
endmodule

View File

@ -0,0 +1,14 @@
// Check that a later typedef hides a compilation-unit function used as a
// statement.
function integer value;
value = 0;
endfunction
module test;
initial value();
typedef logic value;
endmodule

View File

@ -0,0 +1,16 @@
// Check that a typedef prevents an implicit named port connection from
// binding an outer variable.
module M(input integer value);
endmodule
module test;
integer value;
if (1) begin : inner
typedef logic value;
M i_m(.value);
end
endmodule

View File

@ -0,0 +1,12 @@
// Check that a later typedef hides a compilation-unit task.
task value;
endtask
module test;
initial value();
typedef logic value;
endmodule

View File

@ -0,0 +1,15 @@
// Check that a type parameter prevents a wildcard port connection from
// binding an outer variable.
module M(input [31:0] value);
endmodule
reg [31:0] value;
module test;
parameter type value = logic;
M i_m(.*);
endmodule

View File

@ -0,0 +1,26 @@
// Check that a later typedef does not hide an outer typed expression.
module test;
integer value[$];
initial value.push_back(42);
if (1) begin : inner
integer values[$];
initial begin
#1;
values = value;
if (values.size() != 1 || values[0] !== 42) begin
$display("FAILED(%0d). Typed expression lookup failed", `__LINE__);
end else begin
$display("PASSED");
end
end
typedef logic value;
end
endmodule

View File

@ -0,0 +1,15 @@
// Check that a type cannot be used as an expression with a required type.
module container;
typedef logic value;
endmodule
module test;
container i_container();
integer values[$];
initial values = i_container.value;
endmodule

View File

@ -496,8 +496,11 @@ sv_type_identifier_block_prefix_label_name vvp_tests/sv_type_identifier_block_pr
sv_type_identifier_config_name vvp_tests/sv_type_identifier_config_name.json
sv_type_identifier_discipline_name vvp_tests/sv_type_identifier_discipline_name.json
sv_type_identifier_discipline_nature_ref vvp_tests/sv_type_identifier_discipline_nature_ref.json
sv_type_identifier_disable_path_fail vvp_tests/sv_type_identifier_disable_path_fail.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_event_trigger vvp_tests/sv_type_identifier_event_trigger.json
sv_type_identifier_event_trigger_fail vvp_tests/sv_type_identifier_event_trigger_fail.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
@ -523,9 +526,18 @@ sv_type_identifier_parameter_port_name vvp_tests/sv_type_identifier_parameter_po
sv_type_identifier_parameter_type_decl_name vvp_tests/sv_type_identifier_parameter_type_decl_name.json
sv_type_identifier_parameter_type_param_name vvp_tests/sv_type_identifier_parameter_type_param_name.json
sv_type_identifier_port_name vvp_tests/sv_type_identifier_port_name.json
sv_type_identifier_procedural_lvalue vvp_tests/sv_type_identifier_procedural_lvalue.json
sv_type_identifier_procedural_lvalue_fail vvp_tests/sv_type_identifier_procedural_lvalue_fail.json
sv_type_identifier_shadow_function_call_fail vvp_tests/sv_type_identifier_shadow_function_call_fail.json
sv_type_identifier_shadow_function_statement_fail vvp_tests/sv_type_identifier_shadow_function_statement_fail.json
sv_type_identifier_shadow_implicit_port_fail vvp_tests/sv_type_identifier_shadow_implicit_port_fail.json
sv_type_identifier_shadow_task_call_fail vvp_tests/sv_type_identifier_shadow_task_call_fail.json
sv_type_identifier_shadow_wildcard_port_fail vvp_tests/sv_type_identifier_shadow_wildcard_port_fail.json
sv_type_identifier_specparam_name vvp_tests/sv_type_identifier_specparam_name.json
sv_type_identifier_task_function_argument_name vvp_tests/sv_type_identifier_task_function_argument_name.json
sv_type_identifier_task_name vvp_tests/sv_type_identifier_task_name.json
sv_type_identifier_typed_expression vvp_tests/sv_type_identifier_typed_expression.json
sv_type_identifier_typed_expression_fail vvp_tests/sv_type_identifier_typed_expression_fail.json
sv_type_identifier_udp_ansi_name vvp_tests/sv_type_identifier_udp_ansi_name.json
sv_type_identifier_udp_name vvp_tests/sv_type_identifier_udp_name.json
sv_type_identifier_variable_name vvp_tests/sv_type_identifier_variable_name.json

View File

@ -0,0 +1,6 @@
{
"type" : "CE",
"source" : "sv_type_identifier_disable_path_fail.v",
"gold" : "sv_type_identifier_disable_path_fail",
"iverilog-args" : [ "-g2005-sv" ]
}

View File

@ -0,0 +1,9 @@
{
"type" : "normal",
"source" : "sv_type_identifier_event_trigger.v",
"iverilog-args" : [ "-g2005-sv" ],
"vlog95" : {
"__comment" : "Generate scopes are not translated by vlog95",
"type" : "CE"
}
}

View File

@ -0,0 +1,6 @@
{
"type" : "CE",
"source" : "sv_type_identifier_event_trigger_fail.v",
"gold" : "sv_type_identifier_event_trigger_fail",
"iverilog-args" : [ "-g2005-sv" ]
}

View File

@ -0,0 +1,9 @@
{
"type" : "normal",
"source" : "sv_type_identifier_procedural_lvalue.v",
"iverilog-args" : [ "-g2005-sv" ],
"vlog95" : {
"__comment" : "Generate scopes are not translated by vlog95",
"type" : "CE"
}
}

View File

@ -0,0 +1,6 @@
{
"type" : "CE",
"source" : "sv_type_identifier_procedural_lvalue_fail.v",
"gold" : "sv_type_identifier_procedural_lvalue_fail",
"iverilog-args" : [ "-g2005-sv" ]
}

View File

@ -0,0 +1,6 @@
{
"type" : "CE",
"source" : "sv_type_identifier_shadow_function_call_fail.v",
"gold" : "sv_type_identifier_shadow_function_call_fail",
"iverilog-args" : [ "-g2005-sv" ]
}

View File

@ -0,0 +1,6 @@
{
"type" : "CE",
"source" : "sv_type_identifier_shadow_function_statement_fail.v",
"gold" : "sv_type_identifier_shadow_function_statement_fail",
"iverilog-args" : [ "-g2005-sv" ]
}

View File

@ -0,0 +1,6 @@
{
"type" : "CE",
"source" : "sv_type_identifier_shadow_implicit_port_fail.v",
"gold" : "sv_type_identifier_shadow_implicit_port_fail",
"iverilog-args" : [ "-g2005-sv" ]
}

View File

@ -0,0 +1,6 @@
{
"type" : "CE",
"source" : "sv_type_identifier_shadow_task_call_fail.v",
"gold" : "sv_type_identifier_shadow_task_call_fail",
"iverilog-args" : [ "-g2005-sv" ]
}

View File

@ -0,0 +1,5 @@
{
"type" : "CE",
"source" : "sv_type_identifier_shadow_wildcard_port_fail.v",
"iverilog-args" : [ "-g2005-sv" ]
}

View File

@ -0,0 +1,9 @@
{
"type" : "normal",
"source" : "sv_type_identifier_typed_expression.v",
"iverilog-args" : [ "-g2005-sv" ],
"vlog95" : {
"__comment" : "Queues are not supported",
"type" : "CE"
}
}

View File

@ -0,0 +1,6 @@
{
"type" : "CE",
"source" : "sv_type_identifier_typed_expression_fail.v",
"gold" : "sv_type_identifier_typed_expression_fail",
"iverilog-args" : [ "-g2005-sv" ]
}