Program: 54469
Project: 54469
Buggy source:
/** 
 * Check the argument to a parameterized type to see if it will make the type it is applied to be serializable. As a side effect, populates  {@link #typeToTypeInfoComputed} in the same way as{@link #checkTypeInstantiable(TreeLogger,JType,boolean)}.
 * @param logger
 * @param baseType - The generic type the parameter is on
 * @param paramIndex - The index of the parameter in the generic type
 * @param typeArg - An upper bound on the actual argument being applied to thegeneric type
 * @return Whether the a parameterized type can be serializable if<code>baseType</code> is the base type and the <code>paramIndex</code>th type argument is a subtype of <code>typeArg</code>.
 */
private boolean checkTypeArgument(TreeLogger logger,JGenericType baseType,int paramIndex,JClassType typeArg,TypePath parent,ProblemReport problems){
  JWildcardType isWildcard=typeArg.isWildcard();
  if (isWildcard != null) {
    return checkTypeArgument(logger,baseType,paramIndex,isWildcard.getUpperBound(),parent,problems);
  }
  JArrayType typeArgAsArray=typeArg.isArray();
  if (typeArgAsArray != null) {
    JTypeParameter parameterOfTypeArgArray=typeArgAsArray.getLeafType().isTypeParameter();
    if (parameterOfTypeArgArray != null) {
      JGenericType declaringClass=parameterOfTypeArgArray.getDeclaringClass();
      if (declaringClass != null) {
        TypeParameterFlowInfo flowInfoForArrayParam=getFlowInfo(declaringClass,parameterOfTypeArgArray.getOrdinal());
        TypeParameterFlowInfo otherFlowInfo=getFlowInfo(baseType,paramIndex);
        if (otherFlowInfo.getExposure() >= 0 && otherFlowInfo.isTransitivelyAffectedBy(flowInfoForArrayParam)) {
          problems.add(baseType,"String_Node_Str" + baseType.getParameterizedQualifiedSourceName() + "String_Node_Str"+ typeArg.getParameterizedQualifiedSourceName()+ "String_Node_Str"+ "String_Node_Str",Priority.DEFAULT);
          return false;
        }
      }
    }
  }
  TypePath path=TypePaths.createTypeArgumentPath(parent,baseType,paramIndex,typeArg);
  int exposure=getTypeParameterExposure(baseType,paramIndex);
switch (exposure) {
case TypeParameterExposureComputer.EXPOSURE_DIRECT:
{
      TreeLogger branch=logger.branch(TreeLogger.DEBUG,"String_Node_Str" + paramIndex + "String_Node_Str"+ baseType.getParameterizedQualifiedSourceName()+ "String_Node_Str");
      return checkTypeInstantiable(branch,typeArg,path,problems) || mightNotBeExposed(baseType,paramIndex);
    }
case TypeParameterExposureComputer.EXPOSURE_NONE:
  logger.log(Type.DEBUG,"String_Node_Str" + paramIndex + "String_Node_Str"+ baseType.getParameterizedQualifiedSourceName()+ "String_Node_Str");
return true;
default :
{
assert(exposure >= TypeParameterExposureComputer.EXPOSURE_MIN_BOUNDED_ARRAY);
problems.add(getArrayType(typeOracle,exposure,typeArg),"String_Node_Str" + paramIndex + "String_Node_Str"+ baseType.getParameterizedQualifiedSourceName()+ "String_Node_Str"+ exposure+ "String_Node_Str",Priority.AUXILIARY);
return checkTypeInstantiable(logger,getArrayType(typeOracle,exposure,typeArg),path,problems) || mightNotBeExposed(baseType,paramIndex);
}
}
}

Fixed version (ground truth):
/** 
 * Check the argument to a parameterized type to see if it will make the type it is applied to be serializable. As a side effect, populates  {@link #typeToTypeInfoComputed} in the same way as{@link #checkTypeInstantiable(TreeLogger,JType,boolean)}.
 * @param logger
 * @param baseType - The generic type the parameter is on
 * @param paramIndex - The index of the parameter in the generic type
 * @param typeArg - An upper bound on the actual argument being applied to thegeneric type
 * @return Whether the a parameterized type can be serializable if<code>baseType</code> is the base type and the <code>paramIndex</code>th type argument is a subtype of <code>typeArg</code>.
 */
private boolean checkTypeArgument(TreeLogger logger,JGenericType baseType,int paramIndex,JClassType typeArg,TypePath parent,ProblemReport problems){
  JWildcardType isWildcard=typeArg.isWildcard();
  if (isWildcard != null) {
    return checkTypeArgument(logger,baseType,paramIndex,isWildcard.getUpperBound(),parent,problems);
  }
  JArrayType typeArgAsArray=typeArg.isArray();
  if (typeArgAsArray != null) {
    JTypeParameter parameterOfTypeArgArray=typeArgAsArray.getLeafType().isTypeParameter();
    if (parameterOfTypeArgArray != null) {
      JGenericType declaringClass=parameterOfTypeArgArray.getDeclaringClass();
      if (declaringClass != null) {
        TypeParameterFlowInfo flowInfoForArrayParam=getFlowInfo(declaringClass,parameterOfTypeArgArray.getOrdinal());
        TypeParameterFlowInfo otherFlowInfo=getFlowInfo(baseType,paramIndex);
        if (otherFlowInfo.getExposure() >= 0 && otherFlowInfo.isTransitivelyAffectedBy(flowInfoForArrayParam)) {
          problems.add(baseType,"String_Node_Str" + baseType.getParameterizedQualifiedSourceName() + "String_Node_Str"+ typeArg.getParameterizedQualifiedSourceName()+ "String_Node_Str"+ "String_Node_Str",Priority.DEFAULT);
          return false;
        }
      }
    }
  }
  TypePath path=TypePaths.createTypeArgumentPath(parent,baseType,paramIndex,typeArg);
  int exposure=getTypeParameterExposure(baseType,paramIndex);
switch (exposure) {
case TypeParameterExposureComputer.EXPOSURE_DIRECT:
{
      TreeLogger branch=logger.branch(TreeLogger.DEBUG,"String_Node_Str" + paramIndex + "String_Node_Str"+ baseType.getParameterizedQualifiedSourceName()+ "String_Node_Str");
      return computeTypeInstantiability(branch,typeArg,path,problems).hasInstantiableSubtypes() || mightNotBeExposed(baseType,paramIndex);
    }
case TypeParameterExposureComputer.EXPOSURE_NONE:
  logger.log(Type.DEBUG,"String_Node_Str" + paramIndex + "String_Node_Str"+ baseType.getParameterizedQualifiedSourceName()+ "String_Node_Str");
return true;
default :
{
assert(exposure >= TypeParameterExposureComputer.EXPOSURE_MIN_BOUNDED_ARRAY);
problems.add(getArrayType(typeOracle,exposure,typeArg),"String_Node_Str" + paramIndex + "String_Node_Str"+ baseType.getParameterizedQualifiedSourceName()+ "String_Node_Str"+ exposure+ "String_Node_Str",Priority.AUXILIARY);
return computeTypeInstantiability(logger,getArrayType(typeOracle,exposure,typeArg),path,problems).hasInstantiableSubtypes() || mightNotBeExposed(baseType,paramIndex);
}
}
}