Program: 132915
Project: 132915
Buggy source:
/** 
 * Dereference src into dst ie. dst = *src
 * @param dst
 * @param src
 * @throws UserException 
 * @throws UndefinedTypeException 
 */
public void dereference(Context context,Var dst,Var src) throws UndefinedTypeException, UserException {
  assert(Types.isRef(src.type()));
  assert(Types.isRefTo(src.type(),dst.type()));
  if (Types.isScalarFuture(dst.type())) {
    Type dstType=dst.type();
    if (dstType.equals(Types.F_INT)) {
      backend.dereferenceInt(dst,src);
    }
 else     if (dstType.equals(Types.F_STRING)) {
      backend.dereferenceString(dst,src);
    }
 else     if (dstType.equals(Types.F_FLOAT)) {
      backend.dereferenceFloat(dst,src);
    }
 else     if (dstType.equals(Types.F_BOOL)) {
      backend.dereferenceBool(dst,src);
    }
 else     if (dstType.equals(Types.F_FILE)) {
      backend.dereferenceFile(dst,src);
    }
 else     if (dstType.equals(Types.F_BLOB)) {
      backend.dereferenceBlob(dst,src);
    }
 else {
      throw new STCRuntimeError("String_Node_Str" + "String_Node_Str" + src.type().toString());
    }
  }
 else   if (Types.isArray(dst.type())) {
    String wName=context.getFunctionContext().constructName("String_Node_Str");
    List<Var> waitVars=Arrays.asList(src);
    backend.startWaitStatement(wName,waitVars,WaitMode.WAIT_ONLY,false,false,TaskMode.LOCAL);
    Var derefed=varCreator.createTmpAlias(context,dst.type());
    backend.retrieveRef(derefed,src);
    copyArrayByValue(context,dst,derefed);
    backend.endWaitStatement();
  }
 else   if (Types.isStruct(dst.type())) {
    dereferenceStruct(context,dst,src);
  }
 else {
    throw new STCRuntimeError("String_Node_Str" + src.type());
  }
}

Fixed version (ground truth):
/** 
 * Dereference src into dst ie. dst = *src
 * @param dst
 * @param src
 * @throws UserException 
 * @throws UndefinedTypeException 
 */
public void dereference(Context context,Var dst,Var src) throws UndefinedTypeException, UserException {
  assert(Types.isRef(src.type()));
  assert(Types.isAssignableRefTo(src.type(),dst.type()));
  if (Types.isScalarFuture(dst.type())) {
    Type dstType=dst.type();
    if (dstType.equals(Types.F_INT)) {
      backend.dereferenceInt(dst,src);
    }
 else     if (dstType.equals(Types.F_STRING)) {
      backend.dereferenceString(dst,src);
    }
 else     if (dstType.equals(Types.F_FLOAT)) {
      backend.dereferenceFloat(dst,src);
    }
 else     if (dstType.equals(Types.F_BOOL)) {
      backend.dereferenceBool(dst,src);
    }
 else     if (dstType.equals(Types.F_FILE)) {
      backend.dereferenceFile(dst,src);
    }
 else     if (dstType.equals(Types.F_BLOB)) {
      backend.dereferenceBlob(dst,src);
    }
 else {
      throw new STCRuntimeError("String_Node_Str" + "String_Node_Str" + src.type().toString());
    }
  }
 else   if (Types.isArray(dst.type())) {
    String wName=context.getFunctionContext().constructName("String_Node_Str");
    List<Var> waitVars=Arrays.asList(src);
    backend.startWaitStatement(wName,waitVars,WaitMode.WAIT_ONLY,false,false,TaskMode.LOCAL);
    Var derefed=varCreator.createTmpAlias(context,dst.type());
    backend.retrieveRef(derefed,src);
    copyArrayByValue(context,dst,derefed);
    backend.endWaitStatement();
  }
 else   if (Types.isStruct(dst.type())) {
    dereferenceStruct(context,dst,src);
  }
 else {
    throw new STCRuntimeError("String_Node_Str" + src.type());
  }
}