code: @SuppressWarnings("unchecked")
  	protected static <T extends SemanticType> T unionHelper(T lhs, T rhs) {
  		if (lhs.equals(rhs)) {
  			return lhs;
  		} else if (lhs instanceof Type.Void) {
  			return rhs;
  		} else if (rhs instanceof Type.Void) {
  			return lhs;
  		} else if (lhs instanceof Type && rhs instanceof Type) {
  			return (T) new Type.Union(new Type[] { (Type) lhs, (Type) rhs });
  		} else {
  			return (T) new SemanticType.Union(new SemanticType[] { lhs, rhs });
  		}
  	}
docs: Provides a simplistic form of type union which, in some cases, does slightly
  better than simply creating a new union. For example, unioning
  <code>int</code> with <code>int</code> will return <code>int</code> rather
  than <code>int|int</code>.
  
  @param lhs
  @param rhs
  @return