// DESCRIPTION: Verilator: Verilog Test module
//
// This file ONLY is placed under the Creative Commons Public Domain.
// SPDX-FileCopyrightText: 2023 Wilson Snyder
// SPDX-License-Identifier: CC0-1.0

class uvm_policy;
  typedef enum {
    NEVER,
    STARTED,
    FINISHED
  } recursion_state_e;
endclass

typedef enum {
  UVM_DEFAULT_POLICY = 0,
  UVM_DEEP = (1 << 16),
  UVM_SHALLOW = (1 << 17),
  UVM_REFERENCE = (1 << 18)
} uvm_recursion_policy_enum;

class Cls;
  typedef struct {
    uvm_policy::recursion_state_e state;
    bit ret_val;
  } state_info_t;

  state_info_t m_recur_states/*[uvm_object][uvm_object]*/ [uvm_recursion_policy_enum];

  function uvm_recursion_policy_enum get_recursion_policy();
    return UVM_DEEP;
  endfunction

  function bit get_ret_val();
    return $c(1);
  endfunction

  function void test();
    bit ret_val;
    ret_val = $c1(1);
    // See issue #4568
    m_recur_states[get_recursion_policy()] = '{uvm_policy::FINISHED, ret_val};
  endfunction

endclass

module t;

  initial begin
    Cls c;
    c = new;
    $display("%p", c);
    $write("*-* All Finished *-*\n");
    $finish;
  end

endmodule
