 /// Invoke `f` with a C `va_list` argument derived from `args`.
 public func withVaList<R>(args: [CVarArg],
   @noescape _ f: CVaListPointer -> R) -> R {
-  let builder = VaListBuilder()
+  let builder = _VaListBuilder()
   for a in args {
     builder.append(a)
   }
-  return withVaList(builder, f)
+  return _withVaList(builder, f)
 }
 
 /// Invoke `f` with a C `va_list` argument derived from `builder`.
-public func withVaList<R>(builder: VaListBuilder,
-  @noescape _ f: CVaListPointer -> R) -> R {
+internal func _withVaList<R>(
+  builder: _VaListBuilder,
+  @noescape _ f: CVaListPointer -> R
+) -> R {
   let result = f(builder.va_list())
   _fixLifetime(builder)
   return result


/// An object that can manage the lifetime of storage backing a
/// `CVaListPointer`.
final public class VaListBuilder {

  struct Header {
    var gp_offset = CUnsignedInt(0)

/// `withVaList` as intended.
@warn_unused_result
public func getVaList(args: [CVarArg]) -> CVaListPointer {
  let builder = _VaListBuilder()
  for a in args {
    builder.append(a)
  }
