Program: 82973
Project: 82973
Buggy source:
private boolean checkTypeInstantiable(TreeLogger logger,JType type,boolean isSpeculative){
  assert(type != null);
  if (type.isPrimitive() != null) {
    return true;
  }
  assert(type instanceof JClassType);
  JClassType classType=(JClassType)type;
  if (classType.isGenericType() != null) {
    classType=classType.isGenericType().getRawType();
  }
  TreeLogger localLogger=logger.branch(TreeLogger.DEBUG,classType.getParameterizedQualifiedSourceName(),null);
  TypeInfoComputed tic=getTypeInfoComputed(classType);
  if (tic.isPendingInstantiable()) {
    return true;
  }
 else   if (tic.isDone()) {
    return tic.isInstantiable();
  }
  tic.setPendingInstantiable();
  if (classType.getLeafType() == typeOracle.getJavaLangObject()) {
    markAsUninstantiableAndLog(logger,isSpeculative,"String_Node_Str",tic);
    return false;
  }
  if (classType.isArray() != null) {
    return checkArrayInstantiable(logger,classType.isArray(),tic,isSpeculative);
  }
 else   if (classType.isWildcard() != null) {
    return checkWildcardInstantiable(logger,classType.isWildcard(),tic,isSpeculative);
  }
 else   if (classType.isClassOrInterface() != null) {
    TypeInfo typeInfo=getTypeInfo(classType);
    if (isSpeculative && typeInfo.isDirectlySerializable()) {
      isSpeculative=false;
    }
    boolean anySubtypes=false;
    if (checkClassOrInterfaceInstantiable(localLogger,classType,isSpeculative)) {
      tic.setInstantiable(true);
      anySubtypes=true;
    }
    if (classType.isParameterized() != null) {
      JParameterizedType parameterizedType=classType.isParameterized();
      if (!checkTypeArgumentsInstantiable(localLogger,parameterizedType,isSpeculative)) {
        return false;
      }
    }
 else     if (classType.isRawType() != null) {
      TreeLogger rawTypeLogger=logger.branch(TreeLogger.WARN,"String_Node_Str" + classType.getQualifiedSourceName() + "String_Node_Str",null);
      if (classType.isAssignableTo(collectionClass) || classType.isAssignableTo(mapClass)) {
        checkAllSubtypesOfObject(rawTypeLogger);
      }
    }
    JClassType[] subtypes=classType.getSubtypes();
    if (subtypes.length > 0) {
      TreeLogger subLogger=localLogger.branch(TreeLogger.DEBUG,"String_Node_Str",null);
      for (      JClassType subType : subtypes) {
        if (checkClassOrInterfaceInstantiable(subLogger.branch(TreeLogger.DEBUG,subType.getParameterizedQualifiedSourceName(),null),subType,true)) {
          getTypeInfoComputed(subType).setInstantiable(true);
          anySubtypes=true;
        }
      }
    }
    if (!anySubtypes && !isSpeculative) {
      markAsUninstantiableAndLog(logger,isSpeculative,"String_Node_Str" + classType.getParameterizedQualifiedSourceName() + "String_Node_Str",tic);
    }
    return anySubtypes;
  }
 else {
    assert(false);
    return false;
  }
}

Fixed version (ground truth):
private boolean checkTypeInstantiable(TreeLogger logger,JType type,boolean isSpeculative){
  assert(type != null);
  if (type.isPrimitive() != null) {
    return true;
  }
  assert(type instanceof JClassType);
  JClassType classType=(JClassType)type;
  TreeLogger localLogger=logger.branch(TreeLogger.DEBUG,classType.getParameterizedQualifiedSourceName(),null);
  TypeInfoComputed tic=getTypeInfoComputed(classType);
  if (tic.isPendingInstantiable()) {
    return true;
  }
 else   if (tic.isDone()) {
    return tic.isInstantiable();
  }
  tic.setPendingInstantiable();
  if (classType.getLeafType() == typeOracle.getJavaLangObject()) {
    markAsUninstantiableAndLog(logger,isSpeculative,"String_Node_Str",tic);
    return false;
  }
  if (classType.isArray() != null) {
    return checkArrayInstantiable(logger,classType.isArray(),tic,isSpeculative);
  }
 else   if (classType.isWildcard() != null) {
    return checkWildcardInstantiable(logger,classType.isWildcard(),tic,isSpeculative);
  }
 else   if (classType.isClassOrInterface() != null) {
    TypeInfo typeInfo=getTypeInfo(classType);
    if (isSpeculative && typeInfo.isDirectlySerializable()) {
      isSpeculative=false;
    }
    boolean anySubtypes=false;
    if (checkClassOrInterfaceInstantiable(localLogger,classType,isSpeculative)) {
      tic.setInstantiable(true);
      anySubtypes=true;
    }
    if (classType.isParameterized() != null) {
      JParameterizedType parameterizedType=classType.isParameterized();
      if (!checkTypeArgumentsInstantiable(localLogger,parameterizedType,isSpeculative)) {
        return false;
      }
    }
 else     if (classType.isRawType() != null) {
      TreeLogger rawTypeLogger=logger.branch(TreeLogger.WARN,"String_Node_Str" + classType.getQualifiedSourceName() + "String_Node_Str",null);
      if (classType.isAssignableTo(collectionClass) || classType.isAssignableTo(mapClass)) {
        checkAllSubtypesOfObject(rawTypeLogger);
      }
    }
    JClassType[] subtypes=classType.getSubtypes();
    if (subtypes.length > 0) {
      TreeLogger subLogger=localLogger.branch(TreeLogger.DEBUG,"String_Node_Str",null);
      for (      JClassType subType : subtypes) {
        if (checkClassOrInterfaceInstantiable(subLogger.branch(TreeLogger.DEBUG,subType.getParameterizedQualifiedSourceName(),null),subType,true)) {
          getTypeInfoComputed(subType).setInstantiable(true);
          anySubtypes=true;
        }
      }
    }
    if (!anySubtypes && !isSpeculative) {
      markAsUninstantiableAndLog(logger,isSpeculative,"String_Node_Str" + classType.getParameterizedQualifiedSourceName() + "String_Node_Str",tic);
    }
    return anySubtypes;
  }
 else {
    assert(false);
    return false;
  }
}