parameters: (dtype, i=0)
return_statement: return (
          dtype.is_error or
          # Pointers are not valid (yet)
          # (dtype.is_ptr and valid_memslice_dtype(dtype.base_type)) or
          (dtype.is_array and i < 8 and
           valid_memslice_dtype(dtype.base_type, i + 1)) or
          dtype.is_numeric or
          dtype.is_pyobject or
          dtype.is_fused or # accept this as it will be replaced by specializations later
          (dtype.is_typedef and valid_memslice_dtype(dtype.typedef_base_type))
      )
docstring: Return whether type dtype can be used as the base type of a
      memoryview slice.
  
      We support structs, numeric types and objects
docstring_summary: Return whether type dtype can be used as the base type of a
      memoryview slice.
docstring_tokens: Return whether type dtype can be used as the base type of a memoryview slice .
function: def valid_memslice_dtype(dtype, i=0):
      """
      Return whether type dtype can be used as the base type of a
      memoryview slice.
  
      We support structs, numeric types and objects
      """
      if dtype.is_complex and dtype.real_type.is_int:
          return False
  
      if dtype is PyrexTypes.c_bint_type:
          return False
  
      if dtype.is_struct and dtype.kind == 'struct':
          for member in dtype.scope.var_entries:
              if not valid_memslice_dtype(member.type):
                  return False
  
          return True
  
      return (
          dtype.is_error or
          # Pointers are not valid (yet)
          # (dtype.is_ptr and valid_memslice_dtype(dtype.base_type)) or
          (dtype.is_array and i < 8 and
           valid_memslice_dtype(dtype.base_type, i + 1)) or
          dtype.is_numeric or
          dtype.is_pyobject or
          dtype.is_fused or # accept this as it will be replaced by specializations later
          (dtype.is_typedef and valid_memslice_dtype(dtype.typedef_base_type))
      )
function_tokens: def valid_memslice_dtype ( dtype , i = 0 ) : if dtype . is_complex and dtype . real_type . is_int : return False if dtype is PyrexTypes . c_bint_type : return False if dtype . is_struct and dtype . kind == 'struct' : for member in dtype . scope . var_entries : if not valid_memslice_dtype ( member . type ) : return False return True return ( dtype . is_error or # Pointers are not valid (yet) # (dtype.is_ptr and valid_memslice_dtype(dtype.base_type)) or ( dtype . is_array and i < 8 and valid_memslice_dtype ( dtype . base_type , i + 1 ) ) or dtype . is_numeric or dtype . is_pyobject or dtype . is_fused or # accept this as it will be replaced by specializations later ( dtype . is_typedef and valid_memslice_dtype ( dtype . typedef_base_type ) ) )