Program: 38382
Project: 38382
Buggy source:
/** 
 * Make a "fake" function (it doesn't exist in source code but it does in bytecode) for covariant return types.
 * @param overriding Declaration of the overriding method.
 * @param overridden Binding of the overridden method, in a a superclass or implemented interface.
 * @param oldContext
 * @return
 */
private CAstEntity makeSyntheticCovariantRedirect(MethodDeclaration overriding,IMethodBinding overridingBinding,IMethodBinding overridden,WalkContext oldContext){
  final Map<CAstNode,CAstEntity> memberEntities=new LinkedHashMap<CAstNode,CAstEntity>();
  final MethodContext context=new MethodContext(oldContext,memberEntities);
  CAstNode calltarget;
  if ((overridingBinding.getModifiers() & Modifier.STATIC) == 0)   calltarget=makeNode(context,fFactory,null,CAstNode.THIS);
 else   calltarget=makeNode(context,fFactory,null,CAstNode.VOID);
  ITypeBinding paramTypes[]=overridden.getParameterTypes();
  ArrayList<CAstNode> arguments=new ArrayList<CAstNode>();
  int i=0;
  for (  Object o : overriding.parameters()) {
    SingleVariableDeclaration svd=(SingleVariableDeclaration)o;
    CAstNode varNode=makeNode(context,fFactory,null,CAstNode.VAR,fFactory.makeConstant(svd.getName().getIdentifier()));
    ITypeBinding fromType=JDT2CAstUtils.getErasedType(paramTypes[i],ast);
    ITypeBinding toType=JDT2CAstUtils.getErasedType(overridingBinding.getParameterTypes()[i],ast);
    if (fromType.equals(toType))     arguments.add(varNode);
 else     arguments.add(createCast(null,varNode,fromType,toType,context));
    i++;
  }
  CAstNode callnode=createMethodInvocation(null,overridingBinding,calltarget,arguments,context);
  CAstNode mdast=makeNode(context,fFactory,null,CAstNode.LOCAL_SCOPE,makeNode(context,fFactory,null,CAstNode.BLOCK_STMT,makeNode(context,fFactory,null,CAstNode.RETURN,callnode)));
  ArrayList<CAstType> paramCAstTypes=new ArrayList<CAstType>(overridden.getParameterTypes().length);
  for (  ITypeBinding paramType : overridden.getParameterTypes())   paramCAstTypes.add(fTypeDict.getCAstTypeFor(paramType));
  return new ProcedureEntity(mdast,overriding,overridingBinding.getDeclaringClass(),memberEntities,context,paramCAstTypes,overridden.getReturnType());
}

Fixed version (ground truth):
/** 
 * Make a "fake" function (it doesn't exist in source code but it does in bytecode) for covariant return types.
 * @param overriding Declaration of the overriding method.
 * @param overridden Binding of the overridden method, in a a superclass or implemented interface.
 * @param oldContext
 * @return
 */
private CAstEntity makeSyntheticCovariantRedirect(MethodDeclaration overriding,IMethodBinding overridingBinding,IMethodBinding overridden,WalkContext oldContext){
  final Map<CAstNode,CAstEntity> memberEntities=new LinkedHashMap<CAstNode,CAstEntity>();
  final MethodContext context=new MethodContext(oldContext,memberEntities);
  CAstNode calltarget;
  if ((overridingBinding.getModifiers() & Modifier.STATIC) == 0)   calltarget=makeNode(context,fFactory,null,CAstNode.SUPER);
 else   calltarget=makeNode(context,fFactory,null,CAstNode.VOID);
  ITypeBinding paramTypes[]=overridden.getParameterTypes();
  ArrayList<CAstNode> arguments=new ArrayList<CAstNode>();
  int i=0;
  for (  Object o : overriding.parameters()) {
    SingleVariableDeclaration svd=(SingleVariableDeclaration)o;
    CAstNode varNode=makeNode(context,fFactory,null,CAstNode.VAR,fFactory.makeConstant(svd.getName().getIdentifier()));
    ITypeBinding fromType=JDT2CAstUtils.getErasedType(paramTypes[i],ast);
    ITypeBinding toType=JDT2CAstUtils.getErasedType(overridingBinding.getParameterTypes()[i],ast);
    if (fromType.equals(toType)) {
      arguments.add(varNode);
    }
 else {
      arguments.add(createCast(null,varNode,fromType,toType,context));
    }
    i++;
  }
  CAstNode callnode=createMethodInvocation(null,overridingBinding,calltarget,arguments,context);
  CAstNode mdast=makeNode(context,fFactory,null,CAstNode.LOCAL_SCOPE,makeNode(context,fFactory,null,CAstNode.BLOCK_STMT,makeNode(context,fFactory,null,CAstNode.RETURN,callnode)));
  ArrayList<CAstType> paramCAstTypes=new ArrayList<CAstType>(overridden.getParameterTypes().length);
  for (  ITypeBinding paramType : overridden.getParameterTypes())   paramCAstTypes.add(fTypeDict.getCAstTypeFor(paramType));
  return new ProcedureEntity(mdast,overriding,overridingBinding.getDeclaringClass(),memberEntities,context,paramCAstTypes,overridden.getReturnType());
}