From 5364f11d1640fad6d5de9723db31050d13e8d965 Mon Sep 17 00:00:00 2001 From: Lars-Peter Clausen Date: Sat, 27 Jun 2026 10:01:57 -0700 Subject: [PATCH] Add regression tests for class properties shadowing type names Check that a class property can have the same name as a type declared in an outer scope, or a type imported through a wildcard import. Also check that a class property can have the same name as the class itself. Signed-off-by: Lars-Peter Clausen --- ivtest/ivltests/sv_class_prop_class_name.v | 37 +++++++++++++++ ivtest/ivltests/sv_class_prop_type_name.v | 39 ++++++++++++++++ .../sv_class_prop_wildcard_type_name.v | 45 +++++++++++++++++++ ivtest/regress-vvp.list | 3 ++ .../vvp_tests/sv_class_prop_class_name.json | 9 ++++ ivtest/vvp_tests/sv_class_prop_type_name.json | 9 ++++ .../sv_class_prop_wildcard_type_name.json | 9 ++++ 7 files changed, 151 insertions(+) create mode 100644 ivtest/ivltests/sv_class_prop_class_name.v create mode 100644 ivtest/ivltests/sv_class_prop_type_name.v create mode 100644 ivtest/ivltests/sv_class_prop_wildcard_type_name.v create mode 100644 ivtest/vvp_tests/sv_class_prop_class_name.json create mode 100644 ivtest/vvp_tests/sv_class_prop_type_name.json create mode 100644 ivtest/vvp_tests/sv_class_prop_wildcard_type_name.json diff --git a/ivtest/ivltests/sv_class_prop_class_name.v b/ivtest/ivltests/sv_class_prop_class_name.v new file mode 100644 index 000000000..2a8c768f7 --- /dev/null +++ b/ivtest/ivltests/sv_class_prop_class_name.v @@ -0,0 +1,37 @@ +// Check that a class property can have the same name as the class. + +module test; + + bit failed = 1'b0; + + `define check(val, exp) do \ + if (val !== exp) begin \ + $display("FAILED(%0d). '%s' expected %0d, got %0d", `__LINE__, `"val`", exp, val); \ + failed = 1'b1; \ + end \ + while(0) + + class C; + int C; + + function int get; + return C; + endfunction + endclass + + C obj; + + initial begin + obj = new; + + obj.C = 23; + + `check(obj.get(), 23); + `check(obj.C, 23); + + if (!failed) begin + $display("PASSED"); + end + end + +endmodule diff --git a/ivtest/ivltests/sv_class_prop_type_name.v b/ivtest/ivltests/sv_class_prop_type_name.v new file mode 100644 index 000000000..2ba13dea3 --- /dev/null +++ b/ivtest/ivltests/sv_class_prop_type_name.v @@ -0,0 +1,39 @@ +// Check that a class property can have the same name as an outer type. + +module test; + + typedef int T; + + bit failed = 1'b0; + + `define check(val, exp) do \ + if (val !== exp) begin \ + $display("FAILED(%0d). '%s' expected %0d, got %0d", `__LINE__, `"val`", exp, val); \ + failed = 1'b1; \ + end \ + while(0) + + class C; + int T; + + function int get; + return T; + endfunction + endclass + + C obj; + + initial begin + obj = new; + + obj.T = 11; + + `check(obj.get(), 11); + `check(obj.T, 11); + + if (!failed) begin + $display("PASSED"); + end + end + +endmodule diff --git a/ivtest/ivltests/sv_class_prop_wildcard_type_name.v b/ivtest/ivltests/sv_class_prop_wildcard_type_name.v new file mode 100644 index 000000000..f5a4a1762 --- /dev/null +++ b/ivtest/ivltests/sv_class_prop_wildcard_type_name.v @@ -0,0 +1,45 @@ +// Check that a class property can shadow a wildcard-imported type name. + +package P; + + typedef int T; + +endpackage + +module test; + + import P::*; + + bit failed = 1'b0; + + `define check(val, exp) do \ + if (val !== exp) begin \ + $display("FAILED(%0d). '%s' expected %0d, got %0d", `__LINE__, `"val`", exp, val); \ + failed = 1'b1; \ + end \ + while(0) + + class C; + int T; + + function int get; + return T; + endfunction + endclass + + C obj; + + initial begin + obj = new; + + obj.T = 47; + + `check(obj.get(), 47); + `check(obj.T, 47); + + if (!failed) begin + $display("PASSED"); + end + end + +endmodule diff --git a/ivtest/regress-vvp.list b/ivtest/regress-vvp.list index 050529a95..c023763ad 100644 --- a/ivtest/regress-vvp.list +++ b/ivtest/regress-vvp.list @@ -279,8 +279,11 @@ sv_chained_constructor4 vvp_tests/sv_chained_constructor4.json sv_chained_constructor5 vvp_tests/sv_chained_constructor5.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_logic vvp_tests/sv_class_prop_logic.json sv_class_prop_packed_dims vvp_tests/sv_class_prop_packed_dims.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_prop_nest_darray1 vvp_tests/sv_class_prop_nest_darray1.json sv_class_prop_nest_obj1 vvp_tests/sv_class_prop_nest_obj1.json sv_class_prop_nest_real1 vvp_tests/sv_class_prop_nest_real1.json diff --git a/ivtest/vvp_tests/sv_class_prop_class_name.json b/ivtest/vvp_tests/sv_class_prop_class_name.json new file mode 100644 index 000000000..4c7cfe9c8 --- /dev/null +++ b/ivtest/vvp_tests/sv_class_prop_class_name.json @@ -0,0 +1,9 @@ +{ + "type" : "normal", + "source" : "sv_class_prop_class_name.v", + "iverilog-args" : [ "-g2005-sv" ], + "vlog95" : { + "__comment" : "Classes are not supported", + "type" : "CE" + } +} diff --git a/ivtest/vvp_tests/sv_class_prop_type_name.json b/ivtest/vvp_tests/sv_class_prop_type_name.json new file mode 100644 index 000000000..e5543bb21 --- /dev/null +++ b/ivtest/vvp_tests/sv_class_prop_type_name.json @@ -0,0 +1,9 @@ +{ + "type" : "normal", + "source" : "sv_class_prop_type_name.v", + "iverilog-args" : [ "-g2005-sv" ], + "vlog95" : { + "__comment" : "Classes are not supported", + "type" : "CE" + } +} diff --git a/ivtest/vvp_tests/sv_class_prop_wildcard_type_name.json b/ivtest/vvp_tests/sv_class_prop_wildcard_type_name.json new file mode 100644 index 000000000..451678584 --- /dev/null +++ b/ivtest/vvp_tests/sv_class_prop_wildcard_type_name.json @@ -0,0 +1,9 @@ +{ + "type" : "normal", + "source" : "sv_class_prop_wildcard_type_name.v", + "iverilog-args" : [ "-g2005-sv" ], + "vlog95" : { + "__comment" : "Classes are not supported", + "type" : "CE" + } +}