Program: 82961
Project: 82961
Buggy source:
@Override public IType resolveType(MarkerList markers,IContext context){
  if (this.name == Names.Tuple) {
    this.resolveTypeArguments(markers,context);
    return new TupleType(this.typeArguments,this.typeArgumentCount);
  }
  if (this.name == Names.Function) {
    if (this.typeArgumentCount > 0) {
      this.resolveTypeArguments(markers,context);
      return new LambdaType(this.typeArguments,this.typeArgumentCount - 1,this.typeArguments[this.typeArgumentCount - 1]);
    }
  }
  IType resolved=new NamedType(this.position,this.name,this.parent).resolveType0(markers,context);
  if (!resolved.isResolved()) {
    this.resolveTypeArguments(markers,context);
    return this;
  }
  this.resolveTypeArguments(markers,context);
  IClass iClass=resolved.getTheClass();
  ITypeVariable[] typeVariables;
  IType concrete;
  if (!resolved.isGenericType()) {
    resolved=iClass.getType();
    typeVariables=iClass.getTypeVariables();
    concrete=new ClassGenericType(iClass,this.typeArguments,this.typeArgumentCount);
  }
 else {
    typeVariables=new ITypeVariable[this.typeArgumentCount];
    concrete=resolved.getConcreteType(typeVar -> {
      int index=typeVar.getIndex();
      if (index >= this.typeArgumentCount) {
        return null;
      }
      typeVariables[index]=typeVar;
      return this.typeArguments[index];
    }
);
  }
  for (int i=0; i < this.typeArgumentCount; i++) {
    ITypeVariable typeVariable=typeVariables[i];
    IType type=this.typeArguments[i];
    if (typeVariable != null && !typeVariable.isAssignableFrom(type)) {
      Marker marker=MarkerMessages.createMarker(type.getPosition(),"String_Node_Str",typeVariable.getName().qualified);
      marker.addInfo(MarkerMessages.getMarker("String_Node_Str",type));
      marker.addInfo(MarkerMessages.getMarker("String_Node_Str",typeVariable));
      markers.add(marker);
    }
  }
  return concrete;
}

Fixed version (ground truth):
@Override public IType resolveType(MarkerList markers,IContext context){
  if (this.parent == null) {
    if (this.name == Names.Tuple) {
      this.resolveTypeArguments(markers,context);
      return new TupleType(this.typeArguments,this.typeArgumentCount);
    }
    if (this.name == Names.Function) {
      if (this.typeArgumentCount > 0) {
        this.resolveTypeArguments(markers,context);
        return new LambdaType(this.typeArguments,this.typeArgumentCount - 1,this.typeArguments[this.typeArgumentCount - 1]);
      }
    }
  }
  final IType resolved=new NamedType(this.position,this.name,this.parent).resolveType0(markers,context);
  if (!resolved.isResolved()) {
    this.resolveTypeArguments(markers,context);
    return this;
  }
  this.resolveTypeArguments(markers,context);
  final IClass iClass=resolved.getTheClass();
  final ITypeVariable[] typeVariables;
  final IType concrete;
  if (!resolved.isGenericType()) {
    typeVariables=iClass.getTypeVariables();
    concrete=new ClassGenericType(iClass,this.typeArguments,this.typeArgumentCount);
  }
 else {
    typeVariables=new ITypeVariable[this.typeArgumentCount];
    concrete=resolved.getConcreteType(typeVar -> {
      int index=typeVar.getIndex();
      if (index >= this.typeArgumentCount) {
        return null;
      }
      typeVariables[index]=typeVar;
      return this.typeArguments[index];
    }
);
  }
  for (int i=0; i < this.typeArgumentCount; i++) {
    final ITypeVariable typeVariable=typeVariables[i];
    final IType type=this.typeArguments[i];
    if (typeVariable != null && !typeVariable.isAssignableFrom(type)) {
      final Marker marker=MarkerMessages.createMarker(type.getPosition(),"String_Node_Str",typeVariable.getName().qualified);
      marker.addInfo(MarkerMessages.getMarker("String_Node_Str",type));
      marker.addInfo(MarkerMessages.getMarker("String_Node_Str",typeVariable));
      markers.add(marker);
    }
  }
  return concrete;
}