         ctx.extendSubstitution substituionFail "#{name}'s context is too weak, missing #{listOf (map printType, retainedConstraints)}"
   else
     [deferredConstraints, retainedConstraints] = deferConstraints ctx,
-      ctx.allBoundTypeVariables(),
-      (findFree currentType),
       (substituteList ctx.substitution, constraints)
     # Finalizing type again after possibly added substitution when defer constraints
     currentType = substitute ctx.substitution, type
-    # log "assign type", name, (printType (addConstraints currentType, retainedConstraints)), (printType quantifyUnbound ctx, (addConstraints currentType, retainedConstraints))
+    # log "assign type", name, ctx.allBoundTypeVariables(), (printType (addConstraints currentType, retainedConstraints)), (printType quantifyUnbound ctx, (addConstraints currentType, retainedConstraints))
     ctx.assignType name,
       if polymorphic
         quantifyUnbound ctx, (addConstraints currentType, retainedConstraints)

      # Force context reduction
      inferredType = (substitute ctx.substitution, expression.tea)
      deferConstraints ctx,
        ctx.allBoundTypeVariables(),
        (findFree inferredType),
        inferredType.constraints
    translatedExpression


      notDeclared = filter (__ _not, isDeclaredConstraint), checked = (substituteList ctx.substitution, constraints)
      try
        [deferredConstraints, retainedConstraints] = deferConstraints ctx,
          notDeclared
      catch e
        throw new Error "Error when deferring #{name} #{e.message}"
