COERCE_NUMBER (arg1); COERCE_NUMBER (arg2);
COERCE_ARRAY (arg1); COERCE_ARRAY (arg2);
value_sub (struct value *arg1, struct value *arg2){  struct type *type1, *type2;  COERCE_NUMBER (arg1);  COERCE_NUMBER (arg2);  type1 = check_typedef (VALUE_TYPE (arg1));  type2 = check_typedef (VALUE_TYPE (arg2));  if (TYPE_CODE (type1) == TYPE_CODE_PTR)    {      if (TYPE_CODE (type2) == TYPE_CODE_INT)	{	  /* pointer - integer.  */	  LONGEST sz = find_size_for_pointer_math (type1);	  return value_from_pointer (type1,				     (value_as_address (arg1)				      - (sz * value_as_long (arg2))));	}      else if (TYPE_CODE (type2) == TYPE_CODE_PTR	       && TYPE_LENGTH (check_typedef (TYPE_TARGET_TYPE (type1)))	       == TYPE_LENGTH (check_typedef (TYPE_TARGET_TYPE (type2))))	{	  /* pointer to <type x> - pointer to <type x>.  */	  LONGEST sz = TYPE_LENGTH (check_typedef (TYPE_TARGET_TYPE (type1)));	  return value_from_longest	    (builtin_type_long,	/* FIXME -- should be ptrdiff_t */	     (value_as_long (arg1) - value_as_long (arg2)) / sz);	}      else	{	  error ("\First argument of `-' is a pointer and second argument is neither\n\an integer nor a pointer of the same type.");	}    }  return value_binop (arg1, arg2, BINOP_SUB);}