Fix dynamic array elements passed to ref argument (#6877)

This commit is contained in:
Ryszard Rozak 2026-01-01 16:21:09 +01:00 committed by GitHub
parent c388e793e0
commit cc11ff8c53
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 51 additions and 38 deletions

View File

@ -534,8 +534,11 @@ class TaskVisitor final : public VNVisitor {
refArgOk = cMethodp->method() == VCMethod::DYN_AT_WRITE_APPEND
|| cMethodp->method() == VCMethod::DYN_AT_WRITE_APPEND_BACK;
} else {
refArgOk = cMethodp->method() == VCMethod::ARRAY_AT
|| cMethodp->method() == VCMethod::ARRAY_AT_BACK;
if (cMethodp->method() == VCMethod::ARRAY_AT) {
// Change the method to writable variant
cMethodp->method(VCMethod::ARRAY_AT_WRITE);
}
refArgOk = cMethodp->method() == VCMethod::ARRAY_AT_WRITE;
}
}
if (refArgOk) {

View File

@ -8,53 +8,63 @@
`define checkh(gotv,expv) do if ((gotv) !== (expv)) begin $write("%%Error: %s:%0d: got='h%x exp='h%x\n", `__FILE__,`__LINE__, (gotv), (expv)); `stop; end while(0);
class MyInt;
int x;
function new(int a);
x = a;
endfunction
int x;
function new(int a);
x = a;
endfunction
endclass
function int get_val_set_5(ref int x);
automatic int y = x;
x = 5;
return y;
automatic int y = x;
x = 5;
return y;
endfunction
class Cls;
function int get_val_set_2(ref int x);
automatic int y = x;
x = 2;
return y;
endfunction
function int get_val_set_2(ref int x);
automatic int y = x;
x = 2;
return y;
endfunction
endclass
module t;
int a, b;
int arr[1];
Cls cls;
MyInt mi;
initial begin
a = 10;
b = get_val_set_5(a);
`checkh(a, 5);
`checkh(b, 10);
int a, b;
int arr[1];
int dyn_arr[];
Cls cls;
MyInt mi;
initial begin
a = 10;
b = get_val_set_5(a);
`checkh(a, 5);
`checkh(b, 10);
cls = new;
b = cls.get_val_set_2(a);
`checkh(a, 2);
`checkh(b, 5);
cls = new;
b = cls.get_val_set_2(a);
`checkh(a, 2);
`checkh(b, 5);
mi = new(1);
b = cls.get_val_set_2(mi.x);
`checkh(mi.x, 2);
`checkh(b, 1);
mi = new(1);
b = cls.get_val_set_2(mi.x);
`checkh(mi.x, 2);
`checkh(b, 1);
arr[0] = 10;
b = cls.get_val_set_2(arr[0]);
`checkh(arr[0], 2);
`checkh(b, 10);
arr[0] = 10;
b = cls.get_val_set_2(arr[0]);
`checkh(arr[0], 2);
`checkh(b, 10);
$write("*-* All Finished *-*\n");
$finish;
end
dyn_arr = new[3];
dyn_arr[1] = 10;
b = get_val_set_5(dyn_arr[1]);
`checkh(dyn_arr[1], 5);
`checkh(b, 10);
b = cls.get_val_set_2(dyn_arr[1]);
`checkh(dyn_arr[1], 2);
`checkh(b, 5);
$write("*-* All Finished *-*\n");
$finish;
end
endmodule