 
 # Returns deferred and retained constraints
 deferConstraints = (ctx, constraints, type) ->
+  result = tryDeferConstraints ctx, constraints, type
+  if result.error
+    ctx.extendSubstitution result.error
+  result
+
+tryDeferConstraints = (ctx, constraints, type) ->
   reducedConstraints = reduceConstraints ctx, constraints
   if not reducedConstraints.success
     return reducedConstraints

    s: stringType
    c: charType
  [formatStringToken, args...] = _arguments call
  compiledArgs = termsCompile ctx, args
  if not all map _tea, args
    call.tea = toConstrained stringType

    not isSubset validVars, (findUnconstrained constraint)
  [ambiguous, retained] = partition isAmbiguous, retained
  if _notEmpty ambiguous
    {error: substitutionFail
      message: "Constraint #{printType ambiguous[0]} is ambiguous for inferred type #{printType finalType}"
      conflicts: [type.type.origin, ambiguous[0].origin]}
  else
    success: [deferred, retained]

