Use target_terminal_ours_for_output in warning/internal_error
[deliverable/binutils-gdb.git] / gdb / valarith.c
index fb9ec601a7df9763ef600d2f0fa9e68d960e607c..7959f3b2215eff75058e025dd9f34594e40842aa 100644 (file)
@@ -1,6 +1,6 @@
 /* Perform arithmetic and other operations on values, for GDB.
 
-   Copyright (C) 1986-2015 Free Software Foundation, Inc.
+   Copyright (C) 1986-2016 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -54,7 +54,7 @@ find_size_for_pointer_math (struct type *ptr_type)
   gdb_assert (TYPE_CODE (ptr_type) == TYPE_CODE_PTR);
   ptr_target = check_typedef (TYPE_TARGET_TYPE (ptr_type));
 
-  sz = TYPE_LENGTH (ptr_target);
+  sz = type_length_units (ptr_target);
   if (sz == 0)
     {
       if (TYPE_CODE (ptr_type) == TYPE_CODE_VOID)
@@ -121,7 +121,7 @@ value_ptrdiff (struct value *arg1, struct value *arg2)
             "second argument is neither\n"
             "an integer nor a pointer of the same type."));
 
-  sz = TYPE_LENGTH (check_typedef (TYPE_TARGET_TYPE (type1)));
+  sz = type_length_units (check_typedef (TYPE_TARGET_TYPE (type1)));
   if (sz == 0) 
     {
       warning (_("Type size unknown, assuming 1. "
@@ -192,13 +192,20 @@ value_subscripted_rvalue (struct value *array, LONGEST index, int lowerbound)
 {
   struct type *array_type = check_typedef (value_type (array));
   struct type *elt_type = check_typedef (TYPE_TARGET_TYPE (array_type));
-  unsigned int elt_size = TYPE_LENGTH (elt_type);
+  unsigned int elt_size = type_length_units (elt_type);
   unsigned int elt_offs = elt_size * longest_to_int (index - lowerbound);
   struct value *v;
 
   if (index < lowerbound || (!TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (array_type)
-                            && elt_offs >= TYPE_LENGTH (array_type)))
-    error (_("no such vector element"));
+                            && elt_offs >= type_length_units (array_type)))
+    {
+      if (type_not_associated (array_type))
+        error (_("no such vector element (vector not associated)"));
+      else if (type_not_allocated (array_type))
+        error (_("no such vector element (vector not allocated)"));
+      else
+        error (_("no such vector element"));
+    }
 
   if (VALUE_LVAL (array) == lval_memory && value_lazy (array))
     v = allocate_value_lazy (elt_type);
@@ -482,6 +489,21 @@ value_x_binop (struct value *arg1, struct value *arg2, enum exp_opcode op,
          argvec[1] = argvec[0];
          argvec++;
        }
+      if (TYPE_CODE (value_type (argvec[0])) == TYPE_CODE_XMETHOD)
+       {
+         /* Static xmethods are not supported yet.  */
+         gdb_assert (static_memfuncp == 0);
+         if (noside == EVAL_AVOID_SIDE_EFFECTS)
+           {
+             struct type *return_type
+               = result_type_of_xmethod (argvec[0], 2, argvec + 1);
+
+             if (return_type == NULL)
+               error (_("Xmethod is missing return type."));
+             return value_zero (return_type, VALUE_LVAL (arg1));
+           }
+         return call_xmethod (argvec[0], 2, argvec + 1);
+       }
       if (noside == EVAL_AVOID_SIDE_EFFECTS)
        {
          struct type *return_type;
@@ -490,16 +512,8 @@ value_x_binop (struct value *arg1, struct value *arg2, enum exp_opcode op,
            = TYPE_TARGET_TYPE (check_typedef (value_type (argvec[0])));
          return value_zero (return_type, VALUE_LVAL (arg1));
        }
-
-      if (TYPE_CODE (value_type (argvec[0])) == TYPE_CODE_XMETHOD)
-       {
-         /* Static xmethods are not supported yet.  */
-         gdb_assert (static_memfuncp == 0);
-         return call_xmethod (argvec[0], 2, argvec + 1);
-       }
-      else
-       return call_function_by_hand (argvec[0], 2 - static_memfuncp,
-                                     argvec + 1);
+      return call_function_by_hand (argvec[0], 2 - static_memfuncp,
+                                   argvec + 1);
     }
   throw_error (NOT_FOUND_ERROR,
                _("member function %s not found"), tstr);
@@ -594,6 +608,21 @@ value_x_unop (struct value *arg1, enum exp_opcode op, enum noside noside)
          nargs --;
          argvec++;
        }
+      if (TYPE_CODE (value_type (argvec[0])) == TYPE_CODE_XMETHOD)
+       {
+         /* Static xmethods are not supported yet.  */
+         gdb_assert (static_memfuncp == 0);
+         if (noside == EVAL_AVOID_SIDE_EFFECTS)
+           {
+             struct type *return_type
+               = result_type_of_xmethod (argvec[0], 1, argvec + 1);
+
+             if (return_type == NULL)
+               error (_("Xmethod is missing return type."));
+             return value_zero (return_type, VALUE_LVAL (arg1));
+           }
+         return call_xmethod (argvec[0], 1, argvec + 1);
+       }
       if (noside == EVAL_AVOID_SIDE_EFFECTS)
        {
          struct type *return_type;
@@ -602,14 +631,7 @@ value_x_unop (struct value *arg1, enum exp_opcode op, enum noside noside)
            = TYPE_TARGET_TYPE (check_typedef (value_type (argvec[0])));
          return value_zero (return_type, VALUE_LVAL (arg1));
        }
-      if (TYPE_CODE (value_type (argvec[0])) == TYPE_CODE_XMETHOD)
-       {
-         /* Static xmethods are not supported yet.  */
-         gdb_assert (static_memfuncp == 0);
-         return call_xmethod (argvec[0], 1, argvec + 1);
-       }
-      else
-       return call_function_by_hand (argvec[0], nargs, argvec + 1);
+      return call_function_by_hand (argvec[0], nargs, argvec + 1);
     }
   throw_error (NOT_FOUND_ERROR,
                _("member function %s not found"), tstr);
@@ -1376,7 +1398,7 @@ value_vector_widen (struct value *scalar_value, struct type *vector_type)
   LONGEST low_bound, high_bound;
   int i;
 
-  CHECK_TYPEDEF (vector_type);
+  vector_type = check_typedef (vector_type);
 
   gdb_assert (TYPE_CODE (vector_type) == TYPE_CODE_ARRAY
              && TYPE_VECTOR (vector_type));
This page took 0.026318 seconds and 4 git commands to generate.