     super.init(noFail: try unwrap(delegatingFailDuringDelegationArgEmission))
   }
 
-  convenience init(noFail2: ()) {
-    try! self.init()
-  }
-
-  convenience init(failBeforeDelegation: Int) throws {
-    try unwrap(failBeforeDelegation)
+  // CHECK-LABEL: sil hidden @_T021failable_initializers17ThrowDerivedClassCACSi34delegatingFailDuringDelegationCall_tKcfc : $@convention(method) (Int, @owned ThrowDerivedClass) -> (@owned ThrowDerivedClass, @error Error) {
+  // CHECK: bb0(
+  // First initialize.
+  // CHECK:   [[REF:%.*]] = alloc_box ${ var ThrowDerivedClass }, let, name "self"
+  // CHECK:   [[MARK_UNINIT:%.*]] = mark_uninitialized [derivedself] [[REF]] : ${ var ThrowDerivedClass }
+  // CHECK:   [[PROJ:%.*]] = project_box [[MARK_UNINIT]]
+  // CHECK:   store {{%.*}} to [init] [[PROJ]]
+  //
+  // Call the initializer.
+  // CHECK:   [[SELF:%.*]] = load [take] [[PROJ]]
+  // CHECK:   [[BASE_SELF:%.*]] = upcast [[SELF]] : $ThrowDerivedClass to $ThrowBaseClass
+  // CHECK:   [[INIT_FN:%.*]] = function_ref @_T021failable_initializers14ThrowBaseClassCACyKcfc : $@convention(method)
+  // CHECK:   try_apply [[INIT_FN]]([[BASE_SELF]]) : $@convention(method) (@owned ThrowBaseClass) -> (@owned ThrowBaseClass, @error Error), normal [[NORMAL_BB:bb[0-9]+]], error [[ERROR_BB:bb[0-9]+]]
+  //
+  // Insert the return statement into the normal block...
+  // CHECK: [[NORMAL_BB]]([[BASE_SELF_INIT:%.*]] : $ThrowBaseClass):
+  // CHECK:   [[OUT_SELF:%.*]] = unchecked_ref_cast [[BASE_SELF_INIT]] : $ThrowBaseClass to $ThrowDerivedClass
+  // CHECK:   store [[OUT_SELF]] to [init] [[PROJ]]
+  // CHECK:   [[RESULT:%.*]] = load [copy] [[PROJ]]
+  // CHECK:   destroy_value [[MARK_UNINIT]]
+  // CHECK:   return [[RESULT]]
+  //
+  // ... and destroy the box in the error block.
+  // CHECK: [[ERROR_BB]]([[ERROR:%.*]] : $Error):
+  // CHECK-NEXT:   destroy_value [[MARK_UNINIT]]
+  // CHECK-NEXT:   throw [[ERROR]]
+  // CHECK: } // end sil function '_T021failable_initializers17ThrowDerivedClassCACSi34delegatingFailDuringDelegationCall_tKcfc'
+  init(delegatingFailDuringDelegationCall : Int) throws {
+    try super.init()
+  }
+
+  // CHECK-LABEL: sil hidden @_T021failable_initializers17ThrowDerivedClassCACSi29delegatingFailAfterDelegation_tKcfc : $@convention(method) (Int, @owned ThrowDerivedClass) -> (@owned ThrowDerivedClass, @error Error) {
+  // CHECK: bb0(
+  // First initialize.
+  // CHECK:   [[REF:%.*]] = alloc_box ${ var ThrowDerivedClass }, let, name "self"
+  // CHECK:   [[MARK_UNINIT:%.*]] = mark_uninitialized [derivedself] [[REF]] : ${ var ThrowDerivedClass }
+  // CHECK:   [[PROJ:%.*]] = project_box [[MARK_UNINIT]]
+  // CHECK:   store {{%.*}} to [init] [[PROJ]]
+  //
+  // Call the initializer and then store the new self back into its memory slot.
+  // CHECK:   [[SELF:%.*]] = load [take] [[PROJ]]
+  // CHECK:   [[BASE_SELF:%.*]] = upcast [[SELF]] : $ThrowDerivedClass to $ThrowBaseClass
+  // CHECK:   [[INIT_FN:%.*]] = function_ref @_T021failable_initializers14ThrowBaseClassCACyt6noFail_tcfc : $@convention(method)
+  // CHECK:   [[NEW_SELF:%.*]] = apply [[INIT_FN]]([[BASE_SELF]]) : $@convention(method) (@owned ThrowBaseClass) -> @owned ThrowBaseClass
+  // CHECK:   [[NEW_SELF_CAST:%.*]] = unchecked_ref_cast [[NEW_SELF]] : $ThrowBaseClass to $ThrowDerivedClass
+  // CHECK:   store [[NEW_SELF_CAST]] to [init] [[PROJ]]
+  //
+  // Finally perform the unwrap.
+  // CHECK:   [[UNWRAP_FN:%.*]] = function_ref @_T021failable_initializers6unwrapS2iKF : $@convention(thin) (Int) -> (Int, @error Error)
+  // CHECK:   try_apply [[UNWRAP_FN]]({{%.*}}) : $@convention(thin) (Int) -> (Int, @error Error), normal [[NORMAL_BB:bb[0-9]+]], error [[ERROR_BB:bb[0-9]+]]
+  //
+  // Insert the return statement into the normal block...
+  // CHECK: [[NORMAL_BB]](
+  // CHECK:   [[RESULT:%.*]] = load [copy] [[PROJ]]
+  // CHECK:   destroy_value [[MARK_UNINIT]]
+  // CHECK:   return [[RESULT]]
+  //
+  // ... and destroy the box in the error block.
+  // CHECK: [[ERROR_BB]]([[ERROR:%.*]] : $Error):
+  // CHECK-NEXT:   destroy_value [[MARK_UNINIT]]
+  // CHECK-NEXT:   throw [[ERROR]]
+  // CHECK: } // end sil function '_T021failable_initializers17ThrowDerivedClassCACSi29delegatingFailAfterDelegation_tKcfc'
+  init(delegatingFailAfterDelegation : Int) throws {
+    super.init(noFail: ())
+    try unwrap(delegatingFailAfterDelegation)
+  }
+
+  // CHECK-LABEL: sil hidden @_T021failable_initializers17ThrowDerivedClassCACSi30delegatingFailBeforeDelegation_Si0fg6DuringI11ArgEmissiontKcfc : $@convention(method) (Int, Int, @owned ThrowDerivedClass) -> (@owned ThrowDerivedClass, @error Error) {
+  // Create our box.
+  // CHECK:   [[REF:%.*]] = alloc_box ${ var ThrowDerivedClass }, let, name "self"
+  // CHECK:   [[MARK_UNINIT:%.*]] = mark_uninitialized [derivedself] [[REF]] : ${ var ThrowDerivedClass }
+  // CHECK:   [[PROJ:%.*]] = project_box [[MARK_UNINIT]]
+  //
+  // Perform the unwrap.
+  // CHECK:   [[UNWRAP_FN:%.*]] = function_ref @_T021failable_initializers6unwrapS2iKF : $@convention(thin) (Int) -> (Int, @error Error)
+  // CHECK:   try_apply [[UNWRAP_FN]]({{%.*}}) : $@convention(thin) (Int) -> (Int, @error Error), normal [[UNWRAP_NORMAL_BB:bb[0-9]+]], error [[UNWRAP_ERROR_BB:bb[0-9]+]]
+  //
+  // Now we begin argument emission where we perform another unwrap.
+  // CHECK: [[UNWRAP_NORMAL_BB]](
+  // CHECK:   [[SELF:%.*]] = load [take] [[PROJ]]
+  // CHECK:   [[SELF_CAST:%.*]] = upcast [[SELF]] : $ThrowDerivedClass to $ThrowBaseClass
+  // CHECK:   [[INIT_FN2:%.*]] = function_ref @_T021failable_initializers14ThrowBaseClassCACSi6noFail_tcfc : $@convention(method) (Int, @owned ThrowBaseClass) -> @owned ThrowBaseClass
+  // CHECK:   [[UNWRAP_FN2:%.*]] = function_ref @_T021failable_initializers6unwrapS2iKF : $@convention(thin) (Int) -> (Int, @error Error)
+  // CHECK:   try_apply [[UNWRAP_FN2]]({{%.*}}) : $@convention(thin) (Int) -> (Int, @error Error), normal [[UNWRAP_NORMAL_BB2:bb[0-9]+]], error [[UNWRAP_ERROR_BB2:bb[0-9]+]]
+  //
+  // Then since this example has a
+  // CHECK: [[UNWRAP_NORMAL_BB2]]([[INT:%.*]] : $Int):
+  // CHECK:   [[NEW_SELF_CAST:%.*]] = apply [[INIT_FN2]]([[INT]], [[SELF_CAST]]) : $@convention(method) (Int, @owned ThrowBaseClass) -> @owned ThrowBaseClass
+  // CHECK:   [[NEW_SELF:%.*]] = unchecked_ref_cast [[NEW_SELF_CAST]] : $ThrowBaseClass to $ThrowDerivedClass
+  // CHECK:   store [[NEW_SELF]] to [init] [[PROJ]]
+  // CHECK:   [[RESULT:%.*]] = load [copy] [[PROJ]]
+  // CHECK:   destroy_value [[MARK_UNINIT]]
+  // CHECK:   return [[RESULT]]
+  //
+  // ... and destroy the box in the error block.
+  // CHECK: [[UNWRAP_ERROR_BB]]([[ERROR:%.*]] : $Error):
+  // CHECK:   br [[ERROR_JOIN:bb[0-9]+]]([[ERROR]]
+  //
+  // CHECK: [[UNWRAP_ERROR_BB2]]([[ERROR:%.*]] : $Error):
+  // CHECK:   [[SELF_CASTED_BACK:%.*]] = unchecked_ref_cast [[SELF_CAST]] : $ThrowBaseClass to $ThrowDerivedClass
+  // CHECK:   store [[SELF_CASTED_BACK]] to [init] [[PROJ]]
+  // CHECK:   br [[ERROR_JOIN]]([[ERROR]]
+  //
+  // CHECK: [[ERROR_JOIN]]([[ERROR_PHI:%.*]] : $Error):
+  // CHECK:   destroy_value [[MARK_UNINIT]]
+  // CHECK:   throw [[ERROR_PHI]]
+  // CHECK: } // end sil function '_T021failable_initializers17ThrowDerivedClassCACSi30delegatingFailBeforeDelegation_Si0fg6DuringI11ArgEmissiontKcfc'
+  init(delegatingFailBeforeDelegation : Int, delegatingFailDuringDelegationArgEmission : Int) throws {
+    try unwrap(delegatingFailBeforeDelegation)
+    super.init(noFail: try unwrap(delegatingFailDuringDelegationArgEmission))
+  }
+
+  init(delegatingFailBeforeDelegation : Int, delegatingFailDuringDelegationCall : Int) throws {
+    try unwrap(delegatingFailBeforeDelegation)
+    try super.init()
+  }
+
+  init(delegatingFailBeforeDelegation : Int, delegatingFailAfterDelegation : Int) throws {
+    try unwrap(delegatingFailBeforeDelegation)
+    super.init(noFail: ())
+    try unwrap(delegatingFailAfterDelegation)
+  }
+
+  init(delegatingFailDuringDelegationArgEmission : Int, delegatingFailDuringDelegationCall : Int) throws {
+    try super.init(fail: try unwrap(delegatingFailDuringDelegationArgEmission))
+  }
+
+  init(delegatingFailDuringDelegationArgEmission : Int, delegatingFailAfterDelegation : Int) throws {
+    super.init(noFail: try unwrap(delegatingFailDuringDelegationArgEmission))
+    try unwrap(delegatingFailAfterDelegation)
+  }
+
+  init(delegatingFailDuringDelegationCall : Int, delegatingFailAfterDelegation : Int) throws {
+    try super.init()
+    try unwrap(delegatingFailAfterDelegation)
+  }
+
+  init(delegatingFailBeforeDelegation : Int, delegatingFailDuringDelegationArgEmission : Int, delegatingFailDuringDelegationCall : Int) throws {
+    try unwrap(delegatingFailBeforeDelegation)
+    try super.init(fail: try unwrap(delegatingFailDuringDelegationArgEmission))
+  }
+
+  init(delegatingFailBeforeDelegation : Int, delegatingFailDuringDelegationArgEmission : Int, delegatingFailAfterDelegation : Int) throws {
+    try unwrap(delegatingFailBeforeDelegation)
+    super.init(noFail: try unwrap(delegatingFailDuringDelegationArgEmission))
+    try unwrap(delegatingFailAfterDelegation)
+  }
+
+  init(delegatingFailBeforeDelegation : Int, delegatingFailDuringDelegationCall : Int, delegatingFailAfterDelegation : Int) throws {
+    try unwrap(delegatingFailBeforeDelegation)
+    try super.init()
+    try unwrap(delegatingFailAfterDelegation)
+  }
+
+  init(delegatingFailDuringDelegationArgEmission : Int, delegatingFailDuringDelegationCall : Int, delegatingFailAfterDelegation : Int) throws {
+    try super.init(fail: try unwrap(delegatingFailDuringDelegationArgEmission))
+    try unwrap(delegatingFailAfterDelegation)
+  }
+
+  init(delegatingFailBeforeDelegation : Int, delegatingFailDuringDelegationArgEmission : Int, delegatingFailDuringDelegationCall : Int, delegatingFailAfterDelegation : Int) throws {
+    try unwrap(delegatingFailBeforeDelegation)
+    try super.init(fail: try unwrap(delegatingFailDuringDelegationArgEmission))
+    try unwrap(delegatingFailAfterDelegation)
+  }
+
+  // ---- Delegating to other self method.
+
+  convenience init(chainingFailBeforeDelegation : Int) throws {
+    try unwrap(chainingFailBeforeDelegation)
     self.init(noFail: ())
   }
 
-  convenience init(failDuringDelegation: Int) throws {
+  convenience init(chainingFailDuringDelegationArgEmission : Int) throws {
+    self.init(noFail: try unwrap(chainingFailDuringDelegationArgEmission))
+  }
+
+  convenience init(chainingFailDuringDelegationCall : Int) throws {
     try self.init()
   }
 
-  convenience init(failBeforeOrDuringDelegation: Int) throws {
-    try unwrap(failBeforeOrDuringDelegation)
+  convenience init(chainingFailAfterDelegation : Int) throws {
+    self.init(noFail: ())
+    try unwrap(chainingFailAfterDelegation)
+  }
+
+  convenience init(chainingFailBeforeDelegation : Int, chainingFailDuringDelegationArgEmission : Int) throws {
+    try unwrap(chainingFailBeforeDelegation)
+    self.init(noFail: try unwrap(chainingFailDuringDelegationArgEmission))
+  }
+
+  convenience init(chainingFailBeforeDelegation : Int, chainingFailDuringDelegationCall : Int) throws {
+    try unwrap(chainingFailBeforeDelegation)
     try self.init()
   }
 
-  // CHECK-LABEL: sil hidden @_T021failable_initializers17ThrowDerivedClassCACSi29failBeforeOrDuringDelegation2_tKcfc
+  convenience init(chainingFailBeforeDelegation : Int, chainingFailAfterDelegation : Int) throws {
+    try unwrap(chainingFailBeforeDelegation)
+    self.init(noFail: ())
+    try unwrap(chainingFailAfterDelegation)
+  }
+
+  // CHECK-LABEL: sil hidden @_T021failable_initializers17ThrowDerivedClassCACSi39chainingFailDuringDelegationArgEmission_Si0fghI4CalltKcfc : $@convention(method) (Int, Int, @owned ThrowDerivedClass) -> (@owned ThrowDerivedClass, @error Error) {
   // CHECK: bb0({{.*}}, [[OLD_SELF:%.*]] : $ThrowDerivedClass):
   // CHECK:   [[SELF_BOX:%.*]] = alloc_box ${ var ThrowDerivedClass }, let, name "self"
   // CHECK:   [[MARKED_SELF_BOX:%.*]] = mark_uninitialized [delegatingself] [[SELF_BOX]]

  // CHECK: [[THROWING_BB]]([[ERROR:%.*]] : $Error):
  // CHECK-NEXT: destroy_value [[MARKED_SELF_BOX]]
  // CHECK-NEXT: throw [[ERROR]]
  convenience init(failBeforeOrDuringDelegation2: Int) throws {
    try self.init(failBeforeDelegation: unwrap(failBeforeOrDuringDelegation2))
  }

  convenience init(failAfterDelegation: Int) throws {
    self.init(noFail: ())
    try unwrap(failAfterDelegation)
  }

  // CHECK-LABEL: sil hidden @_T021failable_initializers17ThrowDerivedClassCACSi27failDuringOrAfterDelegation_tKcfc : $@convention(method) (Int, @owned ThrowDerivedClass) -> (@owned ThrowDerivedClass, @error Error) {
  // CHECK: bb0({{.*}}, [[OLD_SELF:%.*]] : $ThrowDerivedClass):
  // CHECK:   [[SELF_BOX:%.*]] = alloc_box ${ var ThrowDerivedClass }, let, name "self"
  // CHECK:   [[MARKED_SELF_BOX:%.*]] = mark_uninitialized [delegatingself] [[SELF_BOX]]

  // CHECK: [[THROWING_BB]]([[ERROR:%.*]] : $Error):
  // CHECK-NEXT: destroy_value [[MARKED_SELF_BOX]]
  // CHECK-NEXT: throw [[ERROR]]
  // CHECK: } // end sil function '_T021failable_initializers17ThrowDerivedClassCACSi28chainingFailBeforeDelegation_Si0fg6DuringI11ArgEmissionSi0fgjI4CalltKcfC'
  convenience init(chainingFailDuringDelegationCall : Int, chainingFailAfterDelegation : Int) throws {
    try self.init()
    try unwrap(chainingFailAfterDelegation)
  }

  convenience init(chainingFailBeforeDelegation : Int, chainingFailDuringDelegationArgEmission : Int, chainingFailDuringDelegationCall : Int) throws {
    try unwrap(chainingFailBeforeDelegation)
    try self.init(fail: try unwrap(chainingFailDuringDelegationArgEmission))
  }

  convenience init(chainingFailBeforeDelegation : Int, chainingFailDuringDelegationArgEmission : Int, chainingFailAfterDelegation : Int) throws {
    try unwrap(chainingFailBeforeDelegation)
    self.init(noFail: try unwrap(chainingFailDuringDelegationArgEmission))
    try unwrap(chainingFailAfterDelegation)
  }

  convenience init(chainingFailBeforeDelegation : Int, chainingFailDuringDelegationCall : Int, chainingFailAfterDelegation : Int) throws {
    try unwrap(chainingFailBeforeDelegation)
    try self.init()
    try unwrap(chainingFailAfterDelegation)
  }

  convenience init(chainingFailDuringDelegationArgEmission : Int, chainingFailDuringDelegationCall : Int, chainingFailAfterDelegation : Int) throws {
    try self.init(fail: try unwrap(chainingFailDuringDelegationArgEmission))
    try unwrap(chainingFailAfterDelegation)
  }

  convenience init(chainingFailBeforeDelegation : Int, chainingFailDuringDelegationArgEmission : Int, chainingFailDuringDelegationCall : Int, chainingFailAfterDelegation : Int) throws {
    try unwrap(chainingFailBeforeDelegation)
    try self.init(fail: try unwrap(chainingFailDuringDelegationArgEmission))
    try unwrap(chainingFailAfterDelegation)
  }
}

