Add regression tests for chained constructors

Check that constructor chaining for various corner cases of mixing implicit
and explicit constructors are handled correctly.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
This commit is contained in:
Lars-Peter Clausen 2023-08-01 03:51:14 -07:00
parent c512faa967
commit 8ca8ad3c81
11 changed files with 189 additions and 0 deletions

View File

@ -0,0 +1,40 @@
// Check that the constructor of a base class gets called exactly once when
// mixing implicit and explicit constructors.
module test;
bit failed = 1'b0;
`define check(val, exp) do begin \
if ((val) !== (exp)) begin \
$display("FAILED(%0d): `%s`, expected `%0d`, got `%0d`.", `__LINE__, \
`"val`", (exp), (val)); \
failed = 1'b1; \
end \
end while (0)
int c_new_calls = 0;
class C;
function new;
c_new_calls++;
endfunction
endclass
class D extends C;
int x = 10;
endclass
initial begin
D d;
d = new;
`check(c_new_calls, 1);
`check(d.x, 10);
if (!failed) begin
$display("PASSED");
end
end
endmodule

View File

@ -0,0 +1,48 @@
// Check that the constructor of a base class gets called exactly once when
// mixing implicit and explicit constructors.
module test;
bit failed = 1'b0;
`define check(val, exp) do begin \
if ((val) !== (exp)) begin \
$display("FAILED(%0d): `%s`, expected `%0d`, got `%0d`.", `__LINE__, \
`"val`", (exp), (val)); \
failed = 1'b1; \
end \
end while (0)
int d_new_calls = 0;
class C;
int x = 10;
endclass
class D extends C;
function new;
d_new_calls++;
endfunction
endclass
class E extends D;
int y;
function new;
y = 20;
endfunction
endclass
initial begin
E e;
e = new;
`check(d_new_calls, 1);
`check(e.x, 10);
`check(e.y, 20);
if (!failed) begin
$display("PASSED");
end
end
endmodule

View File

@ -0,0 +1,22 @@
// Check that forwarding base class constructor arguments through the `extends`
// works when the derived class has no constructor.
module test;
class C;
function new(int a);
if (a == 10) begin
$display("PASSED");
end else begin
$display("FAILED");
end
endfunction
endclass
// D has no constructor
class D extends C(10);
endclass
D d = new;
endmodule

View File

@ -0,0 +1,23 @@
// Check that forwarding base class constructor arguments through the `extends`
// works when the derived class has an implicit constructor.
module test;
class C;
function new(int a);
if (a == 10) begin
$display("PASSED");
end else begin
$display("FAILED");
end
endfunction
endclass
// D has an implicit constructor
class D extends C(10);
int y;
endclass
D d = new;
endmodule

View File

@ -0,0 +1,26 @@
// Check that forwarding base class constructor arguments through the `extends`
// works when the derived class has an explicit constructor.
module test;
class C;
function new(int a);
if (a == 10) begin
$display("PASSED");
end else begin
$display("FAILED");
end
endfunction
endclass
// D has an explicit constructor
class D extends C(10);
int x;
function new;
x = 10;
endfunction
endclass
D d = new;
endmodule

View File

@ -61,6 +61,11 @@ sv_array_assign_fail2 vvp_tests/sv_array_assign_fail2.json
sv_array_cassign6 vvp_tests/sv_array_cassign6.json
sv_array_cassign7 vvp_tests/sv_array_cassign7.json
sv_automatic_2state vvp_tests/sv_automatic_2state.json
sv_chained_constructor1 vvp_tests/sv_chained_constructor1.json
sv_chained_constructor2 vvp_tests/sv_chained_constructor2.json
sv_chained_constructor3 vvp_tests/sv_chained_constructor3.json
sv_chained_constructor4 vvp_tests/sv_chained_constructor4.json
sv_chained_constructor5 vvp_tests/sv_chained_constructor5.json
sv_const1 vvp_tests/sv_const1.json
sv_const2 vvp_tests/sv_const2.json
sv_const3 vvp_tests/sv_const3.json

View File

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

View File

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

View File

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

View File

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

View File

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