   public subscript(i: Int) -> Pointee {
     @_transparent
     get {
-      // We can do a strong load normally.
-      return (UnsafePointer<Pointee>(self) + i).pointee
+      return self.advanced(by: i).pointee
     }
   }
 

  public var pointee: Pointee {
    /// Retrieve the value the pointer points to.
    @_transparent get {
      // We can do a strong load normally.
      return UnsafePointer(self).pointee
    }
    /// Set the value the pointer points to, copying over the previous value.
    ///
    /// AutoreleasingUnsafeMutablePointers are assumed to reference a

    /// storing it to the referenced memory.
    @_transparent nonmutating set {
      // Autorelease the object reference.
      let object = unsafeBitCast(newValue, to: Optional<AnyObject>.self)
      Builtin.retain(object)
      Builtin.autorelease(object)

      // Convert it to an unmanaged reference and trivially assign it to the
      // memory addressed by this pointer.
      let unmanaged: Optional<Unmanaged<AnyObject>>
      if let object = object {
        unmanaged = Unmanaged.passUnretained(object)
      } else {
        unmanaged = nil
      }
      UnsafeMutableRawPointer(_rawValue).storeBytes(
        of: unmanaged,
        as: Optional<Unmanaged<AnyObject>>.self)
    }
  }

