docs: def find_noncopyable_vars(class_type, already_visited_cls_vars=None):
      """
      Returns list of all `noncopyable` variables.
  
      If an already_visited_cls_vars list is provided as argument, the returned
      list will not contain these variables. This list will be extended with
      whatever variables pointing to classes have been found.
  
      Args:
          class_type (declarations.class_t): the class to be searched.
          already_visited_cls_vars (list): optional list of vars that should not
              be checked a second time, to prevent infinite recursions.
  
      Returns:
          list: list of all `noncopyable` variables.
  
      """
  
      assert isinstance(class_type, class_declaration.class_t)
  
      logger = utils.loggers.cxx_parser
      mvars = class_type.variables(
          lambda v: not v.type_qualifiers.has_static,
          recursive=False,
          allow_empty=True)
      noncopyable_vars = []
  
      if already_visited_cls_vars is None:
          already_visited_cls_vars = []
  
      message = (
          "__contains_noncopyable_mem_var - %s - TRUE - " +
          "contains const member variable")
  
      for mvar in mvars:
  
          var_type = type_traits.remove_reference(mvar.decl_type)
  
          if type_traits.is_const(var_type):
              no_const = type_traits.remove_const(var_type)
              if type_traits.is_fundamental(no_const) or is_enum(no_const):
                  logger.debug(
                      (message + "- fundamental or enum"),
                      var_type.decl_string)
                  noncopyable_vars.append(mvar)
              if is_class(no_const):
                  logger.debug((message + " - class"), var_type.decl_string)
                  noncopyable_vars.append(mvar)
              if type_traits.is_array(no_const):
                  logger.debug((message + " - array"), var_type.decl_string)
                  noncopyable_vars.append(mvar)
  
          if type_traits.is_pointer(var_type):
              continue
  
          if class_traits.is_my_case(var_type):
              cls = class_traits.get_declaration(var_type)
  
              # Exclude classes that have already been visited.
              if cls in already_visited_cls_vars:
                  continue
              already_visited_cls_vars.append(cls)
  
              if is_noncopyable(cls, already_visited_cls_vars):
                  logger.debug(
                      (message + " - class that is not copyable"),
                      var_type.decl_string)
                  noncopyable_vars.append(mvar)
  
      logger.debug((
          "__contains_noncopyable_mem_var - %s - FALSE - doesn't " +
          "contain noncopyable members"), class_type.decl_string)
  
      return noncopyable_vars