From 1d2aa1b6fa0add7723c99d624a9df01d3dec9282 Mon Sep 17 00:00:00 2001 From: Lars-Peter Clausen Date: Sat, 8 Aug 2026 08:59:15 -0700 Subject: [PATCH] Add regression tests for duplicate class property names Check that a class property cannot share a name with another property, a function, a task, a parameter, a type, or an enum named constant. Check duplicate properties in both separate and comma-separated declarations. The latter guards the shared declaration type ownership that previously caused a crash. Exercise properties in both declaration orders so both member registration paths are covered. Signed-off-by: Lars-Peter Clausen --- ivtest/ivltests/sv_class_prop_dup_fail.v | 10 ++++++++++ ivtest/ivltests/sv_class_prop_enum_dup_fail.v | 10 ++++++++++ ivtest/ivltests/sv_class_prop_func_dup_fail.v | 13 +++++++++++++ ivtest/ivltests/sv_class_prop_list_dup_fail.v | 9 +++++++++ ivtest/ivltests/sv_class_prop_param_dup_fail.v | 10 ++++++++++ ivtest/ivltests/sv_class_prop_task_dup_fail.v | 12 ++++++++++++ ivtest/ivltests/sv_class_prop_type_dup_fail.v | 10 ++++++++++ ivtest/regress-vvp.list | 7 +++++++ ivtest/vvp_tests/sv_class_prop_dup_fail.json | 5 +++++ ivtest/vvp_tests/sv_class_prop_enum_dup_fail.json | 5 +++++ ivtest/vvp_tests/sv_class_prop_func_dup_fail.json | 5 +++++ ivtest/vvp_tests/sv_class_prop_list_dup_fail.json | 5 +++++ ivtest/vvp_tests/sv_class_prop_param_dup_fail.json | 5 +++++ ivtest/vvp_tests/sv_class_prop_task_dup_fail.json | 5 +++++ ivtest/vvp_tests/sv_class_prop_type_dup_fail.json | 5 +++++ 15 files changed, 116 insertions(+) create mode 100644 ivtest/ivltests/sv_class_prop_dup_fail.v create mode 100644 ivtest/ivltests/sv_class_prop_enum_dup_fail.v create mode 100644 ivtest/ivltests/sv_class_prop_func_dup_fail.v create mode 100644 ivtest/ivltests/sv_class_prop_list_dup_fail.v create mode 100644 ivtest/ivltests/sv_class_prop_param_dup_fail.v create mode 100644 ivtest/ivltests/sv_class_prop_task_dup_fail.v create mode 100644 ivtest/ivltests/sv_class_prop_type_dup_fail.v create mode 100644 ivtest/vvp_tests/sv_class_prop_dup_fail.json create mode 100644 ivtest/vvp_tests/sv_class_prop_enum_dup_fail.json create mode 100644 ivtest/vvp_tests/sv_class_prop_func_dup_fail.json create mode 100644 ivtest/vvp_tests/sv_class_prop_list_dup_fail.json create mode 100644 ivtest/vvp_tests/sv_class_prop_param_dup_fail.json create mode 100644 ivtest/vvp_tests/sv_class_prop_task_dup_fail.json create mode 100644 ivtest/vvp_tests/sv_class_prop_type_dup_fail.json diff --git a/ivtest/ivltests/sv_class_prop_dup_fail.v b/ivtest/ivltests/sv_class_prop_dup_fail.v new file mode 100644 index 000000000..aa1ff4db4 --- /dev/null +++ b/ivtest/ivltests/sv_class_prop_dup_fail.v @@ -0,0 +1,10 @@ +// Check that duplicate class property names are rejected. + +module test; + + class C; + int value; + static int value; + endclass + +endmodule diff --git a/ivtest/ivltests/sv_class_prop_enum_dup_fail.v b/ivtest/ivltests/sv_class_prop_enum_dup_fail.v new file mode 100644 index 000000000..a38dc288c --- /dev/null +++ b/ivtest/ivltests/sv_class_prop_enum_dup_fail.v @@ -0,0 +1,10 @@ +// Check that a class property and enum named constant cannot share a name. + +module test; + + class C; + int value; + typedef enum { value } value_t; + endclass + +endmodule diff --git a/ivtest/ivltests/sv_class_prop_func_dup_fail.v b/ivtest/ivltests/sv_class_prop_func_dup_fail.v new file mode 100644 index 000000000..501f7b0d1 --- /dev/null +++ b/ivtest/ivltests/sv_class_prop_func_dup_fail.v @@ -0,0 +1,13 @@ +// Check that a class property and function cannot have the same name. + +module test; + + class C; + int value; + + function int value; + return 0; + endfunction + endclass + +endmodule diff --git a/ivtest/ivltests/sv_class_prop_list_dup_fail.v b/ivtest/ivltests/sv_class_prop_list_dup_fail.v new file mode 100644 index 000000000..cae5f988d --- /dev/null +++ b/ivtest/ivltests/sv_class_prop_list_dup_fail.v @@ -0,0 +1,9 @@ +// Check that duplicate names in a class property declaration are rejected. + +module test; + + class C; + int value, value; + endclass + +endmodule diff --git a/ivtest/ivltests/sv_class_prop_param_dup_fail.v b/ivtest/ivltests/sv_class_prop_param_dup_fail.v new file mode 100644 index 000000000..98c179ff9 --- /dev/null +++ b/ivtest/ivltests/sv_class_prop_param_dup_fail.v @@ -0,0 +1,10 @@ +// Check that a class property and parameter cannot have the same name. + +module test; + + class C; + int value; + localparam int value = 1; + endclass + +endmodule diff --git a/ivtest/ivltests/sv_class_prop_task_dup_fail.v b/ivtest/ivltests/sv_class_prop_task_dup_fail.v new file mode 100644 index 000000000..8cf531fcd --- /dev/null +++ b/ivtest/ivltests/sv_class_prop_task_dup_fail.v @@ -0,0 +1,12 @@ +// Check that a class property and task cannot have the same name. + +module test; + + class C; + task value; + endtask + + int value; + endclass + +endmodule diff --git a/ivtest/ivltests/sv_class_prop_type_dup_fail.v b/ivtest/ivltests/sv_class_prop_type_dup_fail.v new file mode 100644 index 000000000..f799a715c --- /dev/null +++ b/ivtest/ivltests/sv_class_prop_type_dup_fail.v @@ -0,0 +1,10 @@ +// Check that a class property and type cannot have the same name. + +module test; + + class C; + int value; + typedef int value; + endclass + +endmodule diff --git a/ivtest/regress-vvp.list b/ivtest/regress-vvp.list index faaecce00..ffa554ffe 100644 --- a/ivtest/regress-vvp.list +++ b/ivtest/regress-vvp.list @@ -299,9 +299,16 @@ sv_class_nested_method_call vvp_tests/sv_class_nested_method_call.json sv_class_prop_assign_op1 vvp_tests/sv_class_prop_assign_op1.json sv_class_prop_assign_op2 vvp_tests/sv_class_prop_assign_op2.json sv_class_prop_class_name vvp_tests/sv_class_prop_class_name.json +sv_class_prop_dup_fail vvp_tests/sv_class_prop_dup_fail.json +sv_class_prop_enum_dup_fail vvp_tests/sv_class_prop_enum_dup_fail.json +sv_class_prop_func_dup_fail vvp_tests/sv_class_prop_func_dup_fail.json +sv_class_prop_list_dup_fail vvp_tests/sv_class_prop_list_dup_fail.json sv_class_prop_logic vvp_tests/sv_class_prop_logic.json sv_class_darray_prop_locators vvp_tests/sv_class_darray_prop_locators.json sv_class_prop_packed_dims vvp_tests/sv_class_prop_packed_dims.json +sv_class_prop_param_dup_fail vvp_tests/sv_class_prop_param_dup_fail.json +sv_class_prop_task_dup_fail vvp_tests/sv_class_prop_task_dup_fail.json +sv_class_prop_type_dup_fail vvp_tests/sv_class_prop_type_dup_fail.json sv_class_prop_type_name vvp_tests/sv_class_prop_type_name.json sv_class_prop_wildcard_type_name vvp_tests/sv_class_prop_wildcard_type_name.json sv_class_queue_prop_locators vvp_tests/sv_class_queue_prop_locators.json diff --git a/ivtest/vvp_tests/sv_class_prop_dup_fail.json b/ivtest/vvp_tests/sv_class_prop_dup_fail.json new file mode 100644 index 000000000..d8526b649 --- /dev/null +++ b/ivtest/vvp_tests/sv_class_prop_dup_fail.json @@ -0,0 +1,5 @@ +{ + "type" : "CE", + "source" : "sv_class_prop_dup_fail.v", + "iverilog-args" : [ "-g2005-sv" ] +} diff --git a/ivtest/vvp_tests/sv_class_prop_enum_dup_fail.json b/ivtest/vvp_tests/sv_class_prop_enum_dup_fail.json new file mode 100644 index 000000000..5bc7d3116 --- /dev/null +++ b/ivtest/vvp_tests/sv_class_prop_enum_dup_fail.json @@ -0,0 +1,5 @@ +{ + "type" : "CE", + "source" : "sv_class_prop_enum_dup_fail.v", + "iverilog-args" : [ "-g2005-sv" ] +} diff --git a/ivtest/vvp_tests/sv_class_prop_func_dup_fail.json b/ivtest/vvp_tests/sv_class_prop_func_dup_fail.json new file mode 100644 index 000000000..618fdc4df --- /dev/null +++ b/ivtest/vvp_tests/sv_class_prop_func_dup_fail.json @@ -0,0 +1,5 @@ +{ + "type" : "CE", + "source" : "sv_class_prop_func_dup_fail.v", + "iverilog-args" : [ "-g2005-sv" ] +} diff --git a/ivtest/vvp_tests/sv_class_prop_list_dup_fail.json b/ivtest/vvp_tests/sv_class_prop_list_dup_fail.json new file mode 100644 index 000000000..bd2df9c93 --- /dev/null +++ b/ivtest/vvp_tests/sv_class_prop_list_dup_fail.json @@ -0,0 +1,5 @@ +{ + "type" : "CE", + "source" : "sv_class_prop_list_dup_fail.v", + "iverilog-args" : [ "-g2005-sv" ] +} diff --git a/ivtest/vvp_tests/sv_class_prop_param_dup_fail.json b/ivtest/vvp_tests/sv_class_prop_param_dup_fail.json new file mode 100644 index 000000000..98a1f1684 --- /dev/null +++ b/ivtest/vvp_tests/sv_class_prop_param_dup_fail.json @@ -0,0 +1,5 @@ +{ + "type" : "CE", + "source" : "sv_class_prop_param_dup_fail.v", + "iverilog-args" : [ "-g2005-sv" ] +} diff --git a/ivtest/vvp_tests/sv_class_prop_task_dup_fail.json b/ivtest/vvp_tests/sv_class_prop_task_dup_fail.json new file mode 100644 index 000000000..9605a222d --- /dev/null +++ b/ivtest/vvp_tests/sv_class_prop_task_dup_fail.json @@ -0,0 +1,5 @@ +{ + "type" : "CE", + "source" : "sv_class_prop_task_dup_fail.v", + "iverilog-args" : [ "-g2005-sv" ] +} diff --git a/ivtest/vvp_tests/sv_class_prop_type_dup_fail.json b/ivtest/vvp_tests/sv_class_prop_type_dup_fail.json new file mode 100644 index 000000000..76874e473 --- /dev/null +++ b/ivtest/vvp_tests/sv_class_prop_type_dup_fail.json @@ -0,0 +1,5 @@ +{ + "type" : "CE", + "source" : "sv_class_prop_type_dup_fail.v", + "iverilog-args" : [ "-g2005-sv" ] +}