       isDeclaredConstraint = (c) ->
         entailed = entail ctx, unifiedType.constraints, c
       notDeclared = filter (__ _not, isDeclaredConstraint), checked = (substituteList ctx.substitution, constraints)
-      try
       {success, error} = deferConstraints ctx, notDeclared
       if error
-        throw new Error "Error when deferring #{name} #{error}"
-      [deferredConstraints, retainedConstraints] = success
-      if _notEmpty retainedConstraints
-        ctx.extendSubstitution substitutionFail "#{name}'s context is too weak, missing #{listOf (map printType, retainedConstraints)}"
+        ctx.extendSubstitution error
+      else
+        [deferredConstraints, retainedConstraints] = success
+        if _notEmpty retainedConstraints
+          ctx.extendSubstitution substitutionFail "#{name}'s context is too weak, missing #{listOf (map printType, retainedConstraints)}"
   else
     # log name, "constraints", (substituteList ctx.substitution, constraints)
     {success, error} = deferConstraints ctx,

      ctx.extendSubstitution substitution
      return map ((c) -> substitute substitution, c), freshed.constraints
  null

_names = (list) ->
  map _symbol, list

    newSubstitution variable.name, type

typeFail = (message, t1, t2) ->
  [first, second] = sortBasedOnOriginPosition t1, t2
  substitutionFail
    message: "#{message} #{(safePrintType first)}, #{(safePrintType second)}"
    conflicts: [first.origin, second.origin]

sortBasedOnOriginPosition = (t1, t2) ->
  if t1.origin?.start > t2.origin?.start
    [t2, t1]
  else
    [t1, t2]


# Maybe substitution if the types match
