From cc11ff8c5368ecca9a6f7cc87b63b5b3b47e06be Mon Sep 17 00:00:00 2001 From: Ryszard Rozak Date: Thu, 1 Jan 2026 16:21:09 +0100 Subject: [PATCH] Fix dynamic array elements passed to ref argument (#6877) --- src/V3Task.cpp | 7 ++- test_regress/t/t_func_ref_arg.v | 82 ++++++++++++++++++--------------- 2 files changed, 51 insertions(+), 38 deletions(-) diff --git a/src/V3Task.cpp b/src/V3Task.cpp index 75544d232..b527ff445 100644 --- a/src/V3Task.cpp +++ b/src/V3Task.cpp @@ -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) { diff --git a/test_regress/t/t_func_ref_arg.v b/test_regress/t/t_func_ref_arg.v index d2c371762..9d864d078 100644 --- a/test_regress/t/t_func_ref_arg.v +++ b/test_regress/t/t_func_ref_arg.v @@ -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