Program: 88737
Project: 88737
Buggy source:
public void caseAssignStmt(AssignStmt stmt){
  Value l=stmt.getLeftOp();
  Value r=stmt.getRightOp();
  TypeNode left=null;
  if (l instanceof ArrayRef) {
    ArrayRef ref=(ArrayRef)l;
    TypeNode base=hierarchy.typeNode(((Local)ref.getBase()).getType());
    if (!base.hasElement()) {
      error("String_Node_Str");
    }
    left=base.element();
    Value index=ref.getIndex();
    if (index instanceof Local) {
      if (!hierarchy.typeNode(((Local)index).getType()).hasAncestorOrSelf(hierarchy.typeNode(IntType.v()))) {
        error("String_Node_Str");
      }
    }
  }
 else   if (l instanceof Local) {
    try {
      left=hierarchy.typeNode(((Local)l).getType());
    }
 catch (    InternalTypingException e) {
      G.v().out.println("String_Node_Str" + l);
      throw e;
    }
  }
 else   if (l instanceof InstanceFieldRef) {
    InstanceFieldRef ref=(InstanceFieldRef)l;
    TypeNode base=hierarchy.typeNode(((Local)ref.getBase()).getType());
    if (!base.hasAncestorOrSelf(hierarchy.typeNode(ref.getField().getDeclaringClass().getType()))) {
      if (fix) {
        ref.setBase(insertCast((Local)ref.getBase(),ref.getField().getDeclaringClass().getType(),stmt));
      }
 else {
        error("String_Node_Str");
      }
    }
    left=hierarchy.typeNode(ref.getField().getType());
  }
 else   if (l instanceof StaticFieldRef) {
    StaticFieldRef ref=(StaticFieldRef)l;
    left=hierarchy.typeNode(ref.getField().getType());
  }
 else {
    throw new RuntimeException("String_Node_Str" + l.getClass());
  }
  if (r instanceof ArrayRef) {
    ArrayRef ref=(ArrayRef)r;
    TypeNode base=hierarchy.typeNode(((Local)ref.getBase()).getType());
    if (!base.hasElement()) {
      if (base == hierarchy.NULL) {
        return;
      }
      error("String_Node_Str" + base + "String_Node_Str");
    }
    if (!left.hasDescendantOrSelf(base.element())) {
      if (fix) {
        Type lefttype=left.type();
        if (lefttype instanceof ArrayType) {
          ArrayType atype=(ArrayType)lefttype;
          ref.setBase(insertCast((Local)ref.getBase(),ArrayType.v(atype.baseType,atype.numDimensions + 1),stmt));
        }
 else {
          ref.setBase(insertCast((Local)ref.getBase(),ArrayType.v(lefttype,1),stmt));
        }
      }
 else {
        error("String_Node_Str");
      }
    }
    Value index=ref.getIndex();
    if (index instanceof Local) {
      if (!hierarchy.typeNode(((Local)index).getType()).hasAncestorOrSelf(hierarchy.typeNode(IntType.v()))) {
        error("String_Node_Str");
      }
    }
  }
 else   if (r instanceof DoubleConstant) {
    if (!left.hasDescendantOrSelf(hierarchy.typeNode(DoubleType.v()))) {
      error("String_Node_Str");
    }
  }
 else   if (r instanceof FloatConstant) {
    if (!left.hasDescendantOrSelf(hierarchy.typeNode(FloatType.v()))) {
      error("String_Node_Str");
    }
  }
 else   if (r instanceof IntConstant) {
    if (!left.hasDescendantOrSelf(hierarchy.typeNode(IntType.v()))) {
      error("String_Node_Str");
    }
  }
 else   if (r instanceof LongConstant) {
    if (!left.hasDescendantOrSelf(hierarchy.typeNode(LongType.v()))) {
      error("String_Node_Str");
    }
  }
 else   if (r instanceof NullConstant) {
    if (!left.hasDescendantOrSelf(hierarchy.typeNode(NullType.v()))) {
      error("String_Node_Str");
    }
  }
 else   if (r instanceof StringConstant) {
    if (!left.hasDescendantOrSelf(hierarchy.typeNode(RefType.v("String_Node_Str")))) {
      error("String_Node_Str");
    }
  }
 else   if (r instanceof BinopExpr) {
    BinopExpr be=(BinopExpr)r;
    Value lv=be.getOp1();
    Value rv=be.getOp2();
    TypeNode lop;
    TypeNode rop;
    if (lv instanceof Local) {
      lop=hierarchy.typeNode(((Local)lv).getType());
    }
 else     if (lv instanceof DoubleConstant) {
      lop=hierarchy.typeNode(DoubleType.v());
    }
 else     if (lv instanceof FloatConstant) {
      lop=hierarchy.typeNode(FloatType.v());
    }
 else     if (lv instanceof IntConstant) {
      lop=hierarchy.typeNode(IntType.v());
    }
 else     if (lv instanceof LongConstant) {
      lop=hierarchy.typeNode(LongType.v());
    }
 else     if (lv instanceof NullConstant) {
      lop=hierarchy.typeNode(NullType.v());
    }
 else     if (lv instanceof StringConstant) {
      lop=hierarchy.typeNode(RefType.v("String_Node_Str"));
    }
 else {
      throw new RuntimeException("String_Node_Str" + lv.getClass());
    }
    if (rv instanceof Local) {
      rop=hierarchy.typeNode(((Local)rv).getType());
    }
 else     if (rv instanceof DoubleConstant) {
      rop=hierarchy.typeNode(DoubleType.v());
    }
 else     if (rv instanceof FloatConstant) {
      rop=hierarchy.typeNode(FloatType.v());
    }
 else     if (rv instanceof IntConstant) {
      rop=hierarchy.typeNode(IntType.v());
    }
 else     if (rv instanceof LongConstant) {
      rop=hierarchy.typeNode(LongType.v());
    }
 else     if (rv instanceof NullConstant) {
      rop=hierarchy.typeNode(NullType.v());
    }
 else     if (rv instanceof StringConstant) {
      rop=hierarchy.typeNode(RefType.v("String_Node_Str"));
    }
 else {
      throw new RuntimeException("String_Node_Str" + rv.getClass());
    }
    if ((be instanceof AddExpr) || (be instanceof SubExpr) || (be instanceof MulExpr)|| (be instanceof DivExpr)|| (be instanceof RemExpr)|| (be instanceof AndExpr)|| (be instanceof OrExpr)|| (be instanceof XorExpr)) {
      if (!(left.hasDescendantOrSelf(lop) && left.hasDescendantOrSelf(rop))) {
        error("String_Node_Str");
      }
    }
 else     if ((be instanceof ShlExpr) || (be instanceof ShrExpr) || (be instanceof UshrExpr)) {
      if (!(left.hasDescendantOrSelf(lop) && hierarchy.typeNode(IntType.v()).hasAncestorOrSelf(rop))) {
        error("String_Node_Str");
      }
    }
 else     if ((be instanceof CmpExpr) || (be instanceof CmpgExpr) || (be instanceof CmplExpr)|| (be instanceof EqExpr)|| (be instanceof GeExpr)|| (be instanceof GtExpr)|| (be instanceof LeExpr)|| (be instanceof LtExpr)|| (be instanceof NeExpr)) {
      try {
        lop.lca(rop);
      }
 catch (      TypeException e) {
        error(e.getMessage());
      }
      if (!left.hasDescendantOrSelf(hierarchy.typeNode(IntType.v()))) {
        error("String_Node_Str");
      }
    }
 else {
      throw new RuntimeException("String_Node_Str" + be.getClass());
    }
  }
 else   if (r instanceof CastExpr) {
    CastExpr ce=(CastExpr)r;
    TypeNode cast=hierarchy.typeNode(ce.getCastType());
    if (ce.getOp() instanceof Local) {
      TypeNode op=hierarchy.typeNode(((Local)ce.getOp()).getType());
      try {
        if (cast.isClassOrInterface() || op.isClassOrInterface()) {
          cast.lca(op);
        }
      }
 catch (      TypeException e) {
        G.v().out.println(r + "String_Node_Str" + op+ "String_Node_Str"+ cast+ "String_Node_Str");
        error(e.getMessage());
      }
    }
    if (!left.hasDescendantOrSelf(cast)) {
      error("String_Node_Str");
    }
  }
 else   if (r instanceof InstanceOfExpr) {
    InstanceOfExpr ioe=(InstanceOfExpr)r;
    TypeNode type=hierarchy.typeNode(ioe.getCheckType());
    TypeNode op=hierarchy.typeNode(((Local)ioe.getOp()).getType());
    try {
      op.lca(type);
    }
 catch (    TypeException e) {
      G.v().out.println(r + "String_Node_Str" + op+ "String_Node_Str"+ type+ "String_Node_Str");
      error(e.getMessage());
    }
    if (!left.hasDescendantOrSelf(hierarchy.typeNode(IntType.v()))) {
      error("String_Node_Str");
    }
  }
 else   if (r instanceof InvokeExpr) {
    InvokeExpr ie=(InvokeExpr)r;
    handleInvokeExpr(ie,stmt);
    if (!left.hasDescendantOrSelf(hierarchy.typeNode(ie.getMethod().getReturnType()))) {
      error("String_Node_Str");
    }
  }
 else   if (r instanceof NewArrayExpr) {
    NewArrayExpr nae=(NewArrayExpr)r;
    Type baseType=nae.getBaseType();
    TypeNode right;
    if (baseType instanceof ArrayType) {
      right=hierarchy.typeNode(ArrayType.v(((ArrayType)baseType).baseType,((ArrayType)baseType).numDimensions + 1));
    }
 else {
      right=hierarchy.typeNode(ArrayType.v(baseType,1));
    }
    if (!left.hasDescendantOrSelf(right)) {
      error("String_Node_Str");
    }
    Value size=nae.getSize();
    if (size instanceof Local) {
      TypeNode var=hierarchy.typeNode(((Local)size).getType());
      if (!var.hasAncestorOrSelf(hierarchy.typeNode(IntType.v()))) {
        error("String_Node_Str");
      }
    }
  }
 else   if (r instanceof NewExpr) {
    NewExpr ne=(NewExpr)r;
    if (!left.hasDescendantOrSelf(hierarchy.typeNode(ne.getBaseType()))) {
      error("String_Node_Str");
    }
  }
 else   if (r instanceof NewMultiArrayExpr) {
    NewMultiArrayExpr nmae=(NewMultiArrayExpr)r;
    if (!left.hasDescendantOrSelf(hierarchy.typeNode(nmae.getBaseType()))) {
      error("String_Node_Str");
    }
    for (int i=0; i < nmae.getSizeCount(); i++) {
      Value size=nmae.getSize(i);
      if (size instanceof Local) {
        TypeNode var=hierarchy.typeNode(((Local)size).getType());
        if (!var.hasAncestorOrSelf(hierarchy.typeNode(IntType.v()))) {
          error("String_Node_Str");
        }
      }
    }
  }
 else   if (r instanceof LengthExpr) {
    LengthExpr le=(LengthExpr)r;
    if (!left.hasDescendantOrSelf(hierarchy.typeNode(IntType.v()))) {
      error("String_Node_Str");
    }
    if (le.getOp() instanceof Local) {
      if (!hierarchy.typeNode(((Local)le.getOp()).getType()).hasElement()) {
        error("String_Node_Str");
      }
    }
  }
 else   if (r instanceof NegExpr) {
    NegExpr ne=(NegExpr)r;
    TypeNode right;
    if (ne.getOp() instanceof Local) {
      right=hierarchy.typeNode(((Local)ne.getOp()).getType());
    }
 else     if (ne.getOp() instanceof DoubleConstant) {
      right=hierarchy.typeNode(DoubleType.v());
    }
 else     if (ne.getOp() instanceof FloatConstant) {
      right=hierarchy.typeNode(FloatType.v());
    }
 else     if (ne.getOp() instanceof IntConstant) {
      right=hierarchy.typeNode(IntType.v());
    }
 else     if (ne.getOp() instanceof LongConstant) {
      right=hierarchy.typeNode(LongType.v());
    }
 else {
      throw new RuntimeException("String_Node_Str" + ne.getOp().getClass());
    }
    if (!left.hasDescendantOrSelf(right)) {
      error("String_Node_Str");
    }
  }
 else   if (r instanceof Local) {
    if (!left.hasDescendantOrSelf(hierarchy.typeNode(((Local)r).getType()))) {
      if (fix) {
        stmt.setRightOp(insertCast((Local)r,left.type(),stmt));
      }
 else {
        error("String_Node_Str");
      }
    }
  }
 else   if (r instanceof InstanceFieldRef) {
    InstanceFieldRef ref=(InstanceFieldRef)r;
    TypeNode baseType=hierarchy.typeNode(((Local)ref.getBase()).getType());
    if (!baseType.hasAncestorOrSelf(hierarchy.typeNode(ref.getField().getDeclaringClass().getType()))) {
      if (fix) {
        ref.setBase(insertCast((Local)ref.getBase(),ref.getField().getDeclaringClass().getType(),stmt));
      }
 else {
        error("String_Node_Str");
      }
    }
    if (!left.hasDescendantOrSelf(hierarchy.typeNode(ref.getField().getType()))) {
      error("String_Node_Str");
    }
  }
 else   if (r instanceof StaticFieldRef) {
    StaticFieldRef ref=(StaticFieldRef)r;
    if (!left.hasDescendantOrSelf(hierarchy.typeNode(ref.getField().getType()))) {
      error("String_Node_Str");
    }
  }
 else {
    throw new RuntimeException("String_Node_Str" + r.getClass());
  }
}

Fixed version (ground truth):
public void caseAssignStmt(AssignStmt stmt){
  Value l=stmt.getLeftOp();
  Value r=stmt.getRightOp();
  TypeNode left=null;
  if (l instanceof ArrayRef) {
    ArrayRef ref=(ArrayRef)l;
    TypeNode base=hierarchy.typeNode(((Local)ref.getBase()).getType());
    if (!base.hasElement()) {
      error("String_Node_Str");
    }
    left=base.element();
    Value index=ref.getIndex();
    if (index instanceof Local) {
      if (!hierarchy.typeNode(((Local)index).getType()).hasAncestorOrSelf(hierarchy.typeNode(IntType.v()))) {
        error("String_Node_Str");
      }
    }
  }
 else   if (l instanceof Local) {
    try {
      left=hierarchy.typeNode(((Local)l).getType());
    }
 catch (    InternalTypingException e) {
      G.v().out.println("String_Node_Str" + l);
      throw e;
    }
  }
 else   if (l instanceof InstanceFieldRef) {
    InstanceFieldRef ref=(InstanceFieldRef)l;
    TypeNode base=hierarchy.typeNode(((Local)ref.getBase()).getType());
    if (!base.hasAncestorOrSelf(hierarchy.typeNode(ref.getField().getDeclaringClass().getType()))) {
      if (fix) {
        ref.setBase(insertCast((Local)ref.getBase(),ref.getField().getDeclaringClass().getType(),stmt));
      }
 else {
        error("String_Node_Str");
      }
    }
    left=hierarchy.typeNode(ref.getField().getType());
  }
 else   if (l instanceof StaticFieldRef) {
    StaticFieldRef ref=(StaticFieldRef)l;
    left=hierarchy.typeNode(ref.getField().getType());
  }
 else {
    throw new RuntimeException("String_Node_Str" + l.getClass());
  }
  if (r instanceof ArrayRef) {
    ArrayRef ref=(ArrayRef)r;
    TypeNode base=hierarchy.typeNode(((Local)ref.getBase()).getType());
    if (!base.hasElement()) {
      if (base == hierarchy.NULL) {
        return;
      }
      error("String_Node_Str" + base + "String_Node_Str");
    }
    if (!left.hasDescendantOrSelf(base.element())) {
      if (fix) {
        Type lefttype=left.type();
        if (lefttype instanceof ArrayType) {
          ArrayType atype=(ArrayType)lefttype;
          ref.setBase(insertCast((Local)ref.getBase(),ArrayType.v(atype.baseType,atype.numDimensions + 1),stmt));
        }
 else {
          ref.setBase(insertCast((Local)ref.getBase(),ArrayType.v(lefttype,1),stmt));
        }
      }
 else {
        error("String_Node_Str");
      }
    }
    Value index=ref.getIndex();
    if (index instanceof Local) {
      if (!hierarchy.typeNode(((Local)index).getType()).hasAncestorOrSelf(hierarchy.typeNode(IntType.v()))) {
        error("String_Node_Str");
      }
    }
  }
 else   if (r instanceof DoubleConstant) {
    if (!left.hasDescendantOrSelf(hierarchy.typeNode(DoubleType.v()))) {
      error("String_Node_Str");
    }
  }
 else   if (r instanceof FloatConstant) {
    if (!left.hasDescendantOrSelf(hierarchy.typeNode(FloatType.v()))) {
      error("String_Node_Str");
    }
  }
 else   if (r instanceof IntConstant) {
    if (!left.hasDescendantOrSelf(hierarchy.typeNode(IntType.v()))) {
      error("String_Node_Str");
    }
  }
 else   if (r instanceof LongConstant) {
    if (!left.hasDescendantOrSelf(hierarchy.typeNode(LongType.v()))) {
      error("String_Node_Str");
    }
  }
 else   if (r instanceof NullConstant) {
    if (!left.hasDescendantOrSelf(hierarchy.typeNode(NullType.v()))) {
      error("String_Node_Str");
    }
  }
 else   if (r instanceof StringConstant) {
    if (!left.hasDescendantOrSelf(hierarchy.typeNode(RefType.v("String_Node_Str")))) {
      error("String_Node_Str");
    }
  }
 else   if (r instanceof BinopExpr) {
    BinopExpr be=(BinopExpr)r;
    Value lv=be.getOp1();
    Value rv=be.getOp2();
    TypeNode lop;
    TypeNode rop;
    if (lv instanceof Local) {
      lop=hierarchy.typeNode(((Local)lv).getType());
    }
 else     if (lv instanceof DoubleConstant) {
      lop=hierarchy.typeNode(DoubleType.v());
    }
 else     if (lv instanceof FloatConstant) {
      lop=hierarchy.typeNode(FloatType.v());
    }
 else     if (lv instanceof IntConstant) {
      lop=hierarchy.typeNode(IntType.v());
    }
 else     if (lv instanceof LongConstant) {
      lop=hierarchy.typeNode(LongType.v());
    }
 else     if (lv instanceof NullConstant) {
      lop=hierarchy.typeNode(NullType.v());
    }
 else     if (lv instanceof StringConstant) {
      lop=hierarchy.typeNode(RefType.v("String_Node_Str"));
    }
 else {
      throw new RuntimeException("String_Node_Str" + lv.getClass());
    }
    if (rv instanceof Local) {
      rop=hierarchy.typeNode(((Local)rv).getType());
    }
 else     if (rv instanceof DoubleConstant) {
      rop=hierarchy.typeNode(DoubleType.v());
    }
 else     if (rv instanceof FloatConstant) {
      rop=hierarchy.typeNode(FloatType.v());
    }
 else     if (rv instanceof IntConstant) {
      rop=hierarchy.typeNode(IntType.v());
    }
 else     if (rv instanceof LongConstant) {
      rop=hierarchy.typeNode(LongType.v());
    }
 else     if (rv instanceof NullConstant) {
      rop=hierarchy.typeNode(NullType.v());
    }
 else     if (rv instanceof StringConstant) {
      rop=hierarchy.typeNode(RefType.v("String_Node_Str"));
    }
 else {
      throw new RuntimeException("String_Node_Str" + rv.getClass());
    }
    if ((be instanceof AddExpr) || (be instanceof SubExpr) || (be instanceof MulExpr)|| (be instanceof DivExpr)|| (be instanceof RemExpr)|| (be instanceof AndExpr)|| (be instanceof OrExpr)|| (be instanceof XorExpr)) {
      if (!(left.hasDescendantOrSelf(lop) && left.hasDescendantOrSelf(rop))) {
        error("String_Node_Str");
      }
    }
 else     if ((be instanceof ShlExpr) || (be instanceof ShrExpr) || (be instanceof UshrExpr)) {
      if (!(left.hasDescendantOrSelf(lop) && hierarchy.typeNode(IntType.v()).hasAncestorOrSelf(rop))) {
        error("String_Node_Str");
      }
    }
 else     if ((be instanceof CmpExpr) || (be instanceof CmpgExpr) || (be instanceof CmplExpr)|| (be instanceof EqExpr)|| (be instanceof GeExpr)|| (be instanceof GtExpr)|| (be instanceof LeExpr)|| (be instanceof LtExpr)|| (be instanceof NeExpr)) {
      try {
        lop.lca(rop);
      }
 catch (      TypeException e) {
        error(e.getMessage());
      }
      if (!left.hasDescendantOrSelf(hierarchy.typeNode(IntType.v()))) {
        error("String_Node_Str");
      }
    }
 else {
      throw new RuntimeException("String_Node_Str" + be.getClass());
    }
  }
 else   if (r instanceof CastExpr) {
    CastExpr ce=(CastExpr)r;
    TypeNode cast=hierarchy.typeNode(ce.getCastType());
    if (ce.getOp() instanceof Local) {
      TypeNode op=hierarchy.typeNode(((Local)ce.getOp()).getType());
      try {
        if (cast.isClassOrInterface() || op.isClassOrInterface()) {
          cast.lca(op);
        }
      }
 catch (      TypeException e) {
        G.v().out.println(r + "String_Node_Str" + op+ "String_Node_Str"+ cast+ "String_Node_Str");
        error(e.getMessage());
      }
    }
    if (!left.hasDescendantOrSelf(cast)) {
      error("String_Node_Str");
    }
  }
 else   if (r instanceof InstanceOfExpr) {
    InstanceOfExpr ioe=(InstanceOfExpr)r;
    TypeNode type=hierarchy.typeNode(ioe.getCheckType());
    TypeNode op=hierarchy.typeNode(ioe.getOp().getType());
    try {
      op.lca(type);
    }
 catch (    TypeException e) {
      G.v().out.println(r + "String_Node_Str" + op+ "String_Node_Str"+ type+ "String_Node_Str");
      error(e.getMessage());
    }
    if (!left.hasDescendantOrSelf(hierarchy.typeNode(IntType.v()))) {
      error("String_Node_Str");
    }
  }
 else   if (r instanceof InvokeExpr) {
    InvokeExpr ie=(InvokeExpr)r;
    handleInvokeExpr(ie,stmt);
    if (!left.hasDescendantOrSelf(hierarchy.typeNode(ie.getMethod().getReturnType()))) {
      error("String_Node_Str");
    }
  }
 else   if (r instanceof NewArrayExpr) {
    NewArrayExpr nae=(NewArrayExpr)r;
    Type baseType=nae.getBaseType();
    TypeNode right;
    if (baseType instanceof ArrayType) {
      right=hierarchy.typeNode(ArrayType.v(((ArrayType)baseType).baseType,((ArrayType)baseType).numDimensions + 1));
    }
 else {
      right=hierarchy.typeNode(ArrayType.v(baseType,1));
    }
    if (!left.hasDescendantOrSelf(right)) {
      error("String_Node_Str");
    }
    Value size=nae.getSize();
    if (size instanceof Local) {
      TypeNode var=hierarchy.typeNode(((Local)size).getType());
      if (!var.hasAncestorOrSelf(hierarchy.typeNode(IntType.v()))) {
        error("String_Node_Str");
      }
    }
  }
 else   if (r instanceof NewExpr) {
    NewExpr ne=(NewExpr)r;
    if (!left.hasDescendantOrSelf(hierarchy.typeNode(ne.getBaseType()))) {
      error("String_Node_Str");
    }
  }
 else   if (r instanceof NewMultiArrayExpr) {
    NewMultiArrayExpr nmae=(NewMultiArrayExpr)r;
    if (!left.hasDescendantOrSelf(hierarchy.typeNode(nmae.getBaseType()))) {
      error("String_Node_Str");
    }
    for (int i=0; i < nmae.getSizeCount(); i++) {
      Value size=nmae.getSize(i);
      if (size instanceof Local) {
        TypeNode var=hierarchy.typeNode(((Local)size).getType());
        if (!var.hasAncestorOrSelf(hierarchy.typeNode(IntType.v()))) {
          error("String_Node_Str");
        }
      }
    }
  }
 else   if (r instanceof LengthExpr) {
    LengthExpr le=(LengthExpr)r;
    if (!left.hasDescendantOrSelf(hierarchy.typeNode(IntType.v()))) {
      error("String_Node_Str");
    }
    if (le.getOp() instanceof Local) {
      if (!hierarchy.typeNode(((Local)le.getOp()).getType()).hasElement()) {
        error("String_Node_Str");
      }
    }
  }
 else   if (r instanceof NegExpr) {
    NegExpr ne=(NegExpr)r;
    TypeNode right;
    if (ne.getOp() instanceof Local) {
      right=hierarchy.typeNode(((Local)ne.getOp()).getType());
    }
 else     if (ne.getOp() instanceof DoubleConstant) {
      right=hierarchy.typeNode(DoubleType.v());
    }
 else     if (ne.getOp() instanceof FloatConstant) {
      right=hierarchy.typeNode(FloatType.v());
    }
 else     if (ne.getOp() instanceof IntConstant) {
      right=hierarchy.typeNode(IntType.v());
    }
 else     if (ne.getOp() instanceof LongConstant) {
      right=hierarchy.typeNode(LongType.v());
    }
 else {
      throw new RuntimeException("String_Node_Str" + ne.getOp().getClass());
    }
    if (!left.hasDescendantOrSelf(right)) {
      error("String_Node_Str");
    }
  }
 else   if (r instanceof Local) {
    if (!left.hasDescendantOrSelf(hierarchy.typeNode(((Local)r).getType()))) {
      if (fix) {
        stmt.setRightOp(insertCast((Local)r,left.type(),stmt));
      }
 else {
        error("String_Node_Str");
      }
    }
  }
 else   if (r instanceof InstanceFieldRef) {
    InstanceFieldRef ref=(InstanceFieldRef)r;
    TypeNode baseType=hierarchy.typeNode(((Local)ref.getBase()).getType());
    if (!baseType.hasAncestorOrSelf(hierarchy.typeNode(ref.getField().getDeclaringClass().getType()))) {
      if (fix) {
        ref.setBase(insertCast((Local)ref.getBase(),ref.getField().getDeclaringClass().getType(),stmt));
      }
 else {
        error("String_Node_Str");
      }
    }
    if (!left.hasDescendantOrSelf(hierarchy.typeNode(ref.getField().getType()))) {
      error("String_Node_Str");
    }
  }
 else   if (r instanceof StaticFieldRef) {
    StaticFieldRef ref=(StaticFieldRef)r;
    if (!left.hasDescendantOrSelf(hierarchy.typeNode(ref.getField().getType()))) {
      error("String_Node_Str");
    }
  }
 else {
    throw new RuntimeException("String_Node_Str" + r.getClass());
  }
}