   /// Returns the required alignment in bytes of
   /// the value returned by `_cVarArgEncoding`.
   var _cVarArgAlignment: Int { get }
+}
+
+/// Some pointers require an alternate object to be retained.  The object
+/// that is returned will be used with _cVarArgEncoding and held until
+/// the closure is complete.  This is required since autoreleased storage
+/// is available on all platforms.
+public protocol _CVarArgObject: CVarArg {
+  /// Returns the alternate object that should be encoded.
+  var _cVarArgObject: CVarArg { get }
 }
 
 #if arch(x86_64)

  @usableFromInline // c-abi
  internal var storage: UnsafeMutablePointer<Int>?

  internal static var alignedStorageForEmptyVaLists: Double = 0
}



  @inlinable // c-abi
  internal func append(_ arg: CVarArg) {
    var arg = arg

    // We may need to retain an object that provides a pointer value.
    if let obj = arg as? _CVarArgObject {
      arg = obj._cVarArgObject
      retainer.append(arg)
    }

    var encoded = arg._cVarArgEncoding

#if arch(x86_64) || arch(arm64)
