   var buffer: AnyObject?
   var isMutable: Bool
   var isCocoa: Bool
+  var needsElementTypeCheck: Bool
   
   func getNative<T>() -> ContiguousArrayBuffer<T> {
     _sanityCheck(!isCocoa)

    if result { return result }
    return nil
  }
  
  /// Copy the given subRange of this buffer into uninitialized memory
  /// starting at target.  Return a pointer past-the-end of the
  /// just-initialized memory.
  func _uninitializedCopy(subRange: Range<Int>, target: T*) -> T* {
    if _fastPath(_isNative) {
      return _native._uninitializedCopy(subRange, target: target)
    }

      ? nil : Builtin.castToNativeObject(
      IndirectArrayBuffer(
        nativeBuffer: ContiguousArrayBuffer<T>(),
        isMutable: false,
        needsElementTypeCheck: false
      ))
  }

  init(_ cocoa: CocoaArray) {
    _sanityCheck(_isClassOrObjCExistential(T.self))
    storage = Builtin.castToNativeObject(
      IndirectArrayBuffer(
        cocoa: cocoa,
        needsElementTypeCheck: !(AnyObject.self is T.Type)))
  }

  /// An ArrayBuffer<T> containing the same elements.
