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:
parent
c5ab989dc7
commit
9a2106a439
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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.
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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" ]
|
||||
}
|
||||
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
|
@ -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" ]
|
||||
}
|
||||
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
|
@ -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" ]
|
||||
}
|
||||
|
|
@ -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" ]
|
||||
}
|
||||
|
|
@ -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" ]
|
||||
}
|
||||
|
|
@ -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" ]
|
||||
}
|
||||
|
|
@ -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" ]
|
||||
}
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"type" : "CE",
|
||||
"source" : "sv_type_identifier_shadow_wildcard_port_fail.v",
|
||||
"iverilog-args" : [ "-g2005-sv" ]
|
||||
}
|
||||
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
|
@ -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" ]
|
||||
}
|
||||
Loading…
Reference in New Issue