  
    /**
     * Infer the role of the function (whether it's a constructor or interface)
-@@ -501,11 +470,7 @@ final class FunctionTypeBuilder {
-    * Builds the function type, and puts it in the registry.
-    */
-   FunctionType buildAndRegister() {
--    if (returnType == null) {
--      returnType = typeRegistry.getNativeType(UNKNOWN_TYPE);
--    }
--
--    if (parametersNode == null) {
-+    if (returnType == null || parametersNode == null) {
-       throw new IllegalStateException(
-           "All Function types must have params and a return type");
-     }
-@@ -524,7 +489,7 @@ final class FunctionTypeBuilder {
+@@ -524,7 +493,7 @@ final class FunctionTypeBuilder {
            .withName(fnName)
            .withSourceNode(sourceNode)
            .withParamsNode(parametersNode)

   /** Sets an inferred return type. */
   public FunctionBuilder withInferredReturnType(JSType returnType) {
diff --git a/src/com/google/javascript/rhino/jstype/FunctionType.java b/src/com/google/javascript/rhino/jstype/FunctionType.java
index 6a4d2f46..f36d49cc 100644
--- a/src/com/google/javascript/rhino/jstype/FunctionType.java
+++ b/src/com/google/javascript/rhino/jstype/FunctionType.java
@@ -488,9 +488,13 @@ public class FunctionType extends PrototypeObjectType {
           JSType newReturnType = leastSuper ?
               call.returnType.getLeastSupertype(other.call.returnType) :
               call.returnType.getGreatestSubtype(other.call.returnType);
-          return cloneWithNewReturnType(
-              newReturnType,
-              call.returnTypeInferred || other.call.returnTypeInferred);
+          return new FunctionType(
+              registry, null, null,
+              new ArrowType(
+                  registry, call.parameters, newReturnType,
+                  call.returnTypeInferred ||
+                  other.call.returnTypeInferred),
+              typeOfThis, null, false, false);
         }
       }
 
@@ -512,13 +516,6 @@ public class FunctionType extends PrototypeObjectType {
         super.getGreatestSubtype(that);
   }
 
-  FunctionType cloneWithNewReturnType(JSType newReturnType, boolean inferred) {
-    return new FunctionType(
-        registry, null, source,
-        new ArrowType(
-            registry, call.parameters, newReturnType, inferred),
-        typeOfThis, null, false, false);
-  }
 
   /**
    * Given a constructor or an interface type, get its superclass constructor

 
       if (functionType == null && info != null && info.hasType()) {
         JSType type = info.getType().evaluate(scope, typeRegistry);
@@ -615,7 +614,6 @@ final class TypedScopeCreator implements ScopeCreator {
                     .setSourceNode(fnRoot)
                     .inferFromOverriddenFunction(propType, parametersNode)
                     .inferThisType(info, owner)
