]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - gdb/valops.c
Remove unnecessary function prototypes.
[thirdparty/binutils-gdb.git] / gdb / valops.c
index 1e372efc88bace91e84ee1005503773a8453851c..defc7d525a4bbc41f160d09f35866647d6633d2a 100644 (file)
@@ -1,6 +1,6 @@
 /* Perform non-arithmetic operations on values, for GDB.
 
-   Copyright (C) 1986-2015 Free Software Foundation, Inc.
+   Copyright (C) 1986-2017 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -39,6 +39,7 @@
 #include "observer.h"
 #include "objfiles.h"
 #include "extension.h"
+#include "byte-vector.h"
 
 extern unsigned int overload_debug;
 /* Local functions.  */
@@ -51,7 +52,7 @@ static struct value *search_struct_field (const char *, struct value *,
 
 static struct value *search_struct_method (const char *, struct value **,
                                           struct value **,
-                                          int, int *, struct type *);
+                                          LONGEST, int *, struct type *);
 
 static int find_oload_champ_namespace (struct value **, int,
                                       const char *, const char *,
@@ -96,11 +97,9 @@ static CORE_ADDR allocate_space_in_inferior (int);
 static struct value *cast_into_complex (struct type *, struct value *);
 
 static void find_method_list (struct value **, const char *,
-                             int, struct type *, struct fn_field **, int *,
+                             LONGEST, struct type *, struct fn_field **, int *,
                              VEC (xmethod_worker_ptr) **,
-                             struct type **, int *);
-
-void _initialize_valops (void);
+                             struct type **, LONGEST *);
 
 #if 0
 /* Flag for whether we want to abandon failed expression evals by
@@ -191,7 +190,7 @@ value_allocate_space_in_inferior (int len)
   struct value *blocklen;
 
   blocklen = value_from_longest (builtin_type (gdbarch)->builtin_int, len);
-  val = call_function_by_hand (val, 1, &blocklen);
+  val = call_function_by_hand (val, NULL, 1, &blocklen);
   if (value_logical_not (val))
     {
       if (!target_has_execution)
@@ -256,7 +255,8 @@ value_cast_structs (struct type *type, struct value *v2)
   if (TYPE_NAME (t2) != NULL)
     {
       /* Try downcasting using the run-time type of the value.  */
-      int full, top, using_enc;
+      int full, using_enc;
+      LONGEST top;
       struct type *real_type;
 
       real_type = value_rtti_type (v2, &full, &top, &using_enc);
@@ -317,7 +317,7 @@ value_cast_pointers (struct type *type, struct value *arg2,
     {
       struct value *v2;
 
-      if (TYPE_CODE (type2) == TYPE_CODE_REF)
+      if (TYPE_IS_REFERENCE (type2))
        v2 = coerce_ref (arg2);
       else
        v2 = value_ind (arg2);
@@ -360,27 +360,28 @@ value_cast (struct type *type, struct value *arg2)
   if (value_type (arg2) == type)
     return arg2;
 
-  code1 = TYPE_CODE (check_typedef (type));
-
   /* Check if we are casting struct reference to struct reference.  */
-  if (code1 == TYPE_CODE_REF)
+  if (TYPE_IS_REFERENCE (check_typedef (type)))
     {
       /* We dereference type; then we recurse and finally
          we generate value of the given reference.  Nothing wrong with 
         that.  */
       struct type *t1 = check_typedef (type);
       struct type *dereftype = check_typedef (TYPE_TARGET_TYPE (t1));
-      struct value *val =  value_cast (dereftype, arg2);
+      struct value *val = value_cast (dereftype, arg2);
 
-      return value_ref (val); 
+      return value_ref (val, TYPE_CODE (t1));
     }
 
-  code2 = TYPE_CODE (check_typedef (value_type (arg2)));
-
-  if (code2 == TYPE_CODE_REF)
+  if (TYPE_IS_REFERENCE (check_typedef (value_type (arg2))))
     /* We deref the value and then do the cast.  */
     return value_cast (type, coerce_ref (arg2)); 
 
+  /* Strip typedefs / resolve stubs in order to get at the type's
+     code/length, but remember the original type, to use as the
+     resulting type of the cast, in case it was a typedef.  */
+  struct type *to_type = type;
+
   type = check_typedef (type);
   code1 = TYPE_CODE (type);
   arg2 = coerce_ref (arg2);
@@ -388,7 +389,7 @@ value_cast (struct type *type, struct value *arg2)
 
   /* You can't cast to a reference type.  See value_cast_pointers
      instead.  */
-  gdb_assert (code1 != TYPE_CODE_REF);
+  gdb_assert (!TYPE_IS_REFERENCE (type));
 
   /* A cast to an undetermined-length array_type, such as 
      (TYPE [])OBJECT, is treated like a cast to (TYPE [N])OBJECT,
@@ -436,7 +437,7 @@ value_cast (struct type *type, struct value *arg2)
   code2 = TYPE_CODE (type2);
 
   if (code1 == TYPE_CODE_COMPLEX)
-    return cast_into_complex (type, arg2);
+    return cast_into_complex (to_type, arg2);
   if (code1 == TYPE_CODE_BOOL)
     {
       code1 = TYPE_CODE_INT;
@@ -455,14 +456,14 @@ value_cast (struct type *type, struct value *arg2)
       && (code2 == TYPE_CODE_STRUCT || code2 == TYPE_CODE_UNION)
       && TYPE_NAME (type) != 0)
     {
-      struct value *v = value_cast_structs (type, arg2);
+      struct value *v = value_cast_structs (to_type, arg2);
 
       if (v)
        return v;
     }
 
   if (code1 == TYPE_CODE_FLT && scalar)
-    return value_from_double (type, value_as_double (arg2));
+    return value_from_double (to_type, value_as_double (arg2));
   else if (code1 == TYPE_CODE_DECFLOAT && scalar)
     {
       enum bfd_endian byte_order = gdbarch_byte_order (get_type_arch (type));
@@ -478,7 +479,7 @@ value_cast (struct type *type, struct value *arg2)
        /* The only option left is an integral type.  */
        decimal_from_integral (arg2, dec, dec_len, byte_order);
 
-      return value_from_decfloat (type, dec);
+      return value_from_decfloat (to_type, dec);
     }
   else if ((code1 == TYPE_CODE_INT || code1 == TYPE_CODE_ENUM
            || code1 == TYPE_CODE_RANGE)
@@ -499,7 +500,7 @@ value_cast (struct type *type, struct value *arg2)
                     gdbarch_byte_order (get_type_arch (type2)));
       else
         longest = value_as_long (arg2);
-      return value_from_longest (type, convert_to_boolean ?
+      return value_from_longest (to_type, convert_to_boolean ?
                                 (LONGEST) (longest ? 1 : 0) : longest);
     }
   else if (code1 == TYPE_CODE_PTR && (code2 == TYPE_CODE_INT  
@@ -525,14 +526,14 @@ value_cast (struct type *type, struct value *arg2)
              || longest <= -((LONGEST) 1 << addr_bit))
            warning (_("value truncated"));
        }
-      return value_from_longest (type, longest);
+      return value_from_longest (to_type, longest);
     }
   else if (code1 == TYPE_CODE_METHODPTR && code2 == TYPE_CODE_INT
           && value_as_long (arg2) == 0)
     {
-      struct value *result = allocate_value (type);
+      struct value *result = allocate_value (to_type);
 
-      cplus_make_method_ptr (type, value_contents_writeable (result), 0, 0);
+      cplus_make_method_ptr (to_type, value_contents_writeable (result), 0, 0);
       return result;
     }
   else if (code1 == TYPE_CODE_MEMBERPTR && code2 == TYPE_CODE_INT
@@ -540,7 +541,7 @@ value_cast (struct type *type, struct value *arg2)
     {
       /* The Itanium C++ ABI represents NULL pointers to members as
         minus one, instead of biasing the normal case.  */
-      return value_from_longest (type, -1);
+      return value_from_longest (to_type, -1);
     }
   else if (code1 == TYPE_CODE_ARRAY && TYPE_VECTOR (type)
           && code2 == TYPE_CODE_ARRAY && TYPE_VECTOR (type2)
@@ -551,21 +552,21 @@ value_cast (struct type *type, struct value *arg2)
     error (_("can only cast scalar to vector of same size"));
   else if (code1 == TYPE_CODE_VOID)
     {
-      return value_zero (type, not_lval);
+      return value_zero (to_type, not_lval);
     }
   else if (TYPE_LENGTH (type) == TYPE_LENGTH (type2))
     {
       if (code1 == TYPE_CODE_PTR && code2 == TYPE_CODE_PTR)
-       return value_cast_pointers (type, arg2, 0);
+       return value_cast_pointers (to_type, arg2, 0);
 
       arg2 = value_copy (arg2);
-      deprecated_set_value_type (arg2, type);
-      set_value_enclosing_type (arg2, type);
+      deprecated_set_value_type (arg2, to_type);
+      set_value_enclosing_type (arg2, to_type);
       set_value_pointed_to_offset (arg2, 0);   /* pai: chk_val */
       return arg2;
     }
   else if (VALUE_LVAL (arg2) == lval_memory)
-    return value_at_lazy (type, value_address (arg2));
+    return value_at_lazy (to_type, value_address (arg2));
   else
     {
       error (_("Invalid cast."));
@@ -591,8 +592,8 @@ value_reinterpret_cast (struct type *type, struct value *arg)
   dest_type = type;
 
   /* If we are casting to a reference type, transform
-     reinterpret_cast<T&>(V) to *reinterpret_cast<T*>(&V).  */
-  if (TYPE_CODE (real_type) == TYPE_CODE_REF)
+     reinterpret_cast<T&[&]>(V) to *reinterpret_cast<T*>(&V).  */
+  if (TYPE_IS_REFERENCE (real_type))
     {
       is_ref = 1;
       arg = value_addr (arg);
@@ -622,7 +623,8 @@ value_reinterpret_cast (struct type *type, struct value *arg)
     error (_("Invalid reinterpret_cast"));
 
   if (is_ref)
-    result = value_cast (type, value_ref (value_ind (result)));
+    result = value_cast (type, value_ref (value_ind (result),
+                                          TYPE_CODE (type)));
 
   return result;
 }
@@ -635,7 +637,7 @@ value_reinterpret_cast (struct type *type, struct value *arg)
 static int
 dynamic_cast_check_1 (struct type *desired_type,
                      const gdb_byte *valaddr,
-                     int embedded_offset,
+                     LONGEST embedded_offset,
                      CORE_ADDR address,
                      struct value *val,
                      struct type *search_type,
@@ -647,8 +649,9 @@ dynamic_cast_check_1 (struct type *desired_type,
 
   for (i = 0; i < TYPE_N_BASECLASSES (search_type) && result_count < 2; ++i)
     {
-      int offset = baseclass_offset (search_type, i, valaddr, embedded_offset,
-                                    address, val);
+      LONGEST offset = baseclass_offset (search_type, i, valaddr,
+                                        embedded_offset,
+                                        address, val);
 
       if (class_types_same_p (desired_type, TYPE_BASECLASS (search_type, i)))
        {
@@ -682,7 +685,7 @@ dynamic_cast_check_1 (struct type *desired_type,
 static int
 dynamic_cast_check_2 (struct type *desired_type,
                      const gdb_byte *valaddr,
-                     int embedded_offset,
+                     LONGEST embedded_offset,
                      CORE_ADDR address,
                      struct value *val,
                      struct type *search_type,
@@ -692,7 +695,7 @@ dynamic_cast_check_2 (struct type *desired_type,
 
   for (i = 0; i < TYPE_N_BASECLASSES (search_type) && result_count < 2; ++i)
     {
-      int offset;
+      LONGEST offset;
 
       if (! BASETYPE_VIA_PUBLIC (search_type, i))
        continue;
@@ -723,16 +726,17 @@ dynamic_cast_check_2 (struct type *desired_type,
 struct value *
 value_dynamic_cast (struct type *type, struct value *arg)
 {
-  int full, top, using_enc;
+  int full, using_enc;
+  LONGEST top;
   struct type *resolved_type = check_typedef (type);
   struct type *arg_type = check_typedef (value_type (arg));
   struct type *class_type, *rtti_type;
   struct value *result, *tem, *original_arg = arg;
   CORE_ADDR addr;
-  int is_ref = TYPE_CODE (resolved_type) == TYPE_CODE_REF;
+  int is_ref = TYPE_IS_REFERENCE (resolved_type);
 
   if (TYPE_CODE (resolved_type) != TYPE_CODE_PTR
-      && TYPE_CODE (resolved_type) != TYPE_CODE_REF)
+      && !TYPE_IS_REFERENCE (resolved_type))
     error (_("Argument to dynamic_cast must be a pointer or reference type"));
   if (TYPE_CODE (TYPE_TARGET_TYPE (resolved_type)) != TYPE_CODE_VOID
       && TYPE_CODE (TYPE_TARGET_TYPE (resolved_type)) != TYPE_CODE_STRUCT)
@@ -816,7 +820,9 @@ value_dynamic_cast (struct type *type, struct value *arg)
                                arg_type,
                                &result) == 1)
        return value_cast (type,
-                          is_ref ? value_ref (result) : value_addr (result));
+                          is_ref
+                          ? value_ref (result, TYPE_CODE (resolved_type))
+                          : value_addr (result));
     }
 
   /* The second dynamic check specified in 5.2.7.  */
@@ -828,7 +834,9 @@ value_dynamic_cast (struct type *type, struct value *arg)
                               value_address (tem), tem,
                               rtti_type, &result) == 1)
     return value_cast (type,
-                      is_ref ? value_ref (result) : value_addr (result));
+                      is_ref
+                      ? value_ref (result, TYPE_CODE (resolved_type))
+                      : value_addr (result));
 
   if (TYPE_CODE (resolved_type) == TYPE_CODE_PTR)
     return value_zero (type, not_lval);
@@ -954,13 +962,16 @@ value_at_lazy (struct type *type, CORE_ADDR addr)
 }
 
 void
-read_value_memory (struct value *val, int embedded_offset,
+read_value_memory (struct value *val, LONGEST bit_offset,
                   int stack, CORE_ADDR memaddr,
                   gdb_byte *buffer, size_t length)
 {
   ULONGEST xfered_total = 0;
   struct gdbarch *arch = get_value_arch (val);
   int unit_size = gdbarch_addressable_memory_unit_size (arch);
+  enum target_object object;
+
+  object = stack ? TARGET_OBJECT_STACK_MEMORY : TARGET_OBJECT_MEMORY;
 
   while (xfered_total < length)
     {
@@ -968,7 +979,7 @@ read_value_memory (struct value *val, int embedded_offset,
       ULONGEST xfered_partial;
 
       status = target_xfer_partial (current_target.beneath,
-                                   TARGET_OBJECT_MEMORY, NULL,
+                                   object, NULL,
                                    buffer + xfered_total * unit_size, NULL,
                                    memaddr + xfered_total,
                                    length - xfered_total,
@@ -977,8 +988,9 @@ read_value_memory (struct value *val, int embedded_offset,
       if (status == TARGET_XFER_OK)
        /* nothing */;
       else if (status == TARGET_XFER_UNAVAILABLE)
-       mark_value_bytes_unavailable (val, embedded_offset + xfered_total,
-                                     xfered_partial);
+       mark_value_bits_unavailable (val, (xfered_total * HOST_CHAR_BIT
+                                          + bit_offset),
+                                    xfered_partial * HOST_CHAR_BIT);
       else if (status == TARGET_XFER_EOF)
        memory_error (TARGET_XFER_E_IO, memaddr + xfered_total);
       else
@@ -1031,7 +1043,7 @@ value_assign (struct value *toval, struct value *fromval)
 
     case lval_internalvar_component:
       {
-       int offset = value_offset (toval);
+       LONGEST offset = value_offset (toval);
 
        /* Are we dealing with a bitfield?
 
@@ -1106,8 +1118,15 @@ value_assign (struct value *toval, struct value *fromval)
        struct gdbarch *gdbarch;
        int value_reg;
 
-       /* Figure out which frame this is in currently.  */
+       /* Figure out which frame this is in currently.
+       
+          We use VALUE_FRAME_ID for obtaining the value's frame id instead of
+          VALUE_NEXT_FRAME_ID due to requiring a frame which may be passed to
+          put_frame_register_bytes() below.  That function will (eventually)
+          perform the necessary unwind operation by first obtaining the next
+          frame.  */
        frame = frame_find_by_id (VALUE_FRAME_ID (toval));
+
        value_reg = VALUE_REGNUM (toval);
 
        if (!frame)
@@ -1118,7 +1137,7 @@ value_assign (struct value *toval, struct value *fromval)
        if (value_bitsize (toval))
          {
            struct value *parent = value_parent (toval);
-           int offset = value_offset (parent) + value_offset (toval);
+           LONGEST offset = value_offset (parent) + value_offset (toval);
            int changed_len;
            gdb_byte buffer[sizeof (LONGEST)];
            int optim, unavail;
@@ -1327,7 +1346,7 @@ address_of_variable (struct symbol *var, const struct block *b)
        struct frame_info *frame;
        const char *regname;
 
-       frame = frame_find_by_id (VALUE_FRAME_ID (val));
+       frame = frame_find_by_id (VALUE_NEXT_FRAME_ID (val));
        gdb_assert (frame);
 
        regname = gdbarch_register_name (get_frame_arch (frame),
@@ -1460,15 +1479,30 @@ value_addr (struct value *arg1)
   struct value *arg2;
   struct type *type = check_typedef (value_type (arg1));
 
-  if (TYPE_CODE (type) == TYPE_CODE_REF)
+  if (TYPE_IS_REFERENCE (type))
     {
-      /* Copy the value, but change the type from (T&) to (T*).  We
-         keep the same location information, which is efficient, and
-         allows &(&X) to get the location containing the reference.  */
-      arg2 = value_copy (arg1);
-      deprecated_set_value_type (arg2, 
-                                lookup_pointer_type (TYPE_TARGET_TYPE (type)));
-      return arg2;
+      if (value_bits_synthetic_pointer (arg1, value_embedded_offset (arg1),
+         TARGET_CHAR_BIT * TYPE_LENGTH (type)))
+       arg1 = coerce_ref (arg1);
+      else
+       {
+         /* Copy the value, but change the type from (T&) to (T*).  We
+            keep the same location information, which is efficient, and
+            allows &(&X) to get the location containing the reference.
+            Do the same to its enclosing type for consistency.  */
+         struct type *type_ptr
+           = lookup_pointer_type (TYPE_TARGET_TYPE (type));
+         struct type *enclosing_type
+           = check_typedef (value_enclosing_type (arg1));
+         struct type *enclosing_type_ptr
+           = lookup_pointer_type (TYPE_TARGET_TYPE (enclosing_type));
+
+         arg2 = value_copy (arg1);
+         deprecated_set_value_type (arg2, type_ptr);
+         set_value_enclosing_type (arg2, enclosing_type_ptr);
+
+         return arg2;
+       }
     }
   if (TYPE_CODE (type) == TYPE_CODE_FUNC)
     return value_coerce_function (arg1);
@@ -1499,16 +1533,20 @@ value_addr (struct value *arg1)
    contents.  */
 
 struct value *
-value_ref (struct value *arg1)
+value_ref (struct value *arg1, enum type_code refcode)
 {
   struct value *arg2;
   struct type *type = check_typedef (value_type (arg1));
 
-  if (TYPE_CODE (type) == TYPE_CODE_REF)
+  gdb_assert (refcode == TYPE_CODE_REF || refcode == TYPE_CODE_RVALUE_REF);
+
+  if ((TYPE_CODE (type) == TYPE_CODE_REF
+       || TYPE_CODE (type) == TYPE_CODE_RVALUE_REF)
+      && TYPE_CODE (type) == refcode)
     return arg1;
 
   arg2 = value_addr (arg1);
-  deprecated_set_value_type (arg2, lookup_reference_type (type));
+  deprecated_set_value_type (arg2, lookup_reference_type (type, refcode));
   return arg2;
 }
 
@@ -1582,7 +1620,7 @@ value_array (int lowbound, int highbound, struct value **elemvec)
 {
   int nelem;
   int idx;
-  unsigned int typelength;
+  ULONGEST typelength;
   struct value *val;
   struct type *arraytype;
 
@@ -1626,7 +1664,7 @@ value_array (int lowbound, int highbound, struct value **elemvec)
 }
 
 struct value *
-value_cstring (char *ptr, ssize_t len, struct type *char_type)
+value_cstring (const char *ptr, ssize_t len, struct type *char_type)
 {
   struct value *val;
   int lowbound = current_language->string_lower_bound;
@@ -1649,7 +1687,7 @@ value_cstring (char *ptr, ssize_t len, struct type *char_type)
    string may contain embedded null bytes.  */
 
 struct value *
-value_string (char *ptr, ssize_t len, struct type *char_type)
+value_string (const char *ptr, ssize_t len, struct type *char_type)
 {
   struct value *val;
   int lowbound = current_language->string_lower_bound;
@@ -1707,7 +1745,7 @@ typecmp (int staticp, int varargs, int nargs,
       tt1 = check_typedef (t1[i].type);
       tt2 = check_typedef (value_type (t2[i]));
 
-      if (TYPE_CODE (tt1) == TYPE_CODE_REF
+      if (TYPE_IS_REFERENCE (tt1)
          /* We should be doing hairy argument matching, as below.  */
          && (TYPE_CODE (check_typedef (TYPE_TARGET_TYPE (tt1)))
              == TYPE_CODE (tt2)))
@@ -1715,7 +1753,7 @@ typecmp (int staticp, int varargs, int nargs,
          if (TYPE_CODE (tt2) == TYPE_CODE_ARRAY)
            t2[i] = value_coerce_array (t2[i]);
          else
-           t2[i] = value_ref (t2[i]);
+           t2[i] = value_ref (t2[i], TYPE_CODE (tt1));
          continue;
        }
 
@@ -1725,14 +1763,13 @@ typecmp (int staticp, int varargs, int nargs,
         char *>, and properly access map["hello"], because the
         argument to [] will be a reference to a pointer to a char,
         and the argument will be a pointer to a char.  */
-      while (TYPE_CODE(tt1) == TYPE_CODE_REF
-            || TYPE_CODE (tt1) == TYPE_CODE_PTR)
+      while (TYPE_IS_REFERENCE (tt1) || TYPE_CODE (tt1) == TYPE_CODE_PTR)
        {
          tt1 = check_typedef( TYPE_TARGET_TYPE(tt1) );
        }
       while (TYPE_CODE(tt2) == TYPE_CODE_ARRAY
             || TYPE_CODE(tt2) == TYPE_CODE_PTR
-            || TYPE_CODE(tt2) == TYPE_CODE_REF)
+            || TYPE_IS_REFERENCE (tt2))
        {
          tt2 = check_typedef (TYPE_TARGET_TYPE(tt2));
        }
@@ -1758,7 +1795,7 @@ typecmp (int staticp, int varargs, int nargs,
 
 static void
 update_search_result (struct value **result_ptr, struct value *v,
-                     int *last_boffset, int boffset,
+                     LONGEST *last_boffset, LONGEST boffset,
                      const char *name, struct type *type)
 {
   if (v != NULL)
@@ -1782,10 +1819,10 @@ update_search_result (struct value **result_ptr, struct value *v,
    lookup is ambiguous.  */
 
 static void
-do_search_struct_field (const char *name, struct value *arg1, int offset,
+do_search_struct_field (const char *name, struct value *arg1, LONGEST offset,
                        struct type *type, int looking_for_baseclass,
                        struct value **result_ptr,
-                       int *last_boffset,
+                       LONGEST *last_boffset,
                        struct type *outermost_type)
 {
   int i;
@@ -1832,7 +1869,7 @@ do_search_struct_field (const char *name, struct value *arg1, int offset,
                   <variant field>.  */
 
                struct value *v = NULL;
-               int new_offset = offset;
+               LONGEST new_offset = offset;
 
                /* This is pretty gross.  In G++, the offset in an
                   anonymous union is relative to the beginning of the
@@ -1871,7 +1908,7 @@ do_search_struct_field (const char *name, struct value *arg1, int offset,
                             && (strcmp_iw (name, 
                                            TYPE_BASECLASS_NAME (type, 
                                                                 i)) == 0));
-      int boffset = value_embedded_offset (arg1) + offset;
+      LONGEST boffset = value_embedded_offset (arg1) + offset;
 
       if (BASETYPE_VIA_VIRTUAL (type, i))
        {
@@ -1947,7 +1984,7 @@ search_struct_field (const char *name, struct value *arg1,
                     struct type *type, int looking_for_baseclass)
 {
   struct value *result = NULL;
-  int boffset = 0;
+  LONGEST boffset = 0;
 
   do_search_struct_field (name, arg1, 0, type, looking_for_baseclass,
                          &result, &boffset, type);
@@ -1964,7 +2001,7 @@ search_struct_field (const char *name, struct value *arg1,
 
 static struct value *
 search_struct_method (const char *name, struct value **arg1p,
-                     struct value **args, int offset,
+                     struct value **args, LONGEST offset,
                      int *static_memfuncp, struct type *type)
 {
   int i;
@@ -2028,8 +2065,8 @@ search_struct_method (const char *name, struct value **arg1p,
 
   for (i = TYPE_N_BASECLASSES (type) - 1; i >= 0; i--)
     {
-      int base_offset;
-      int this_offset;
+      LONGEST base_offset;
+      LONGEST this_offset;
 
       if (BASETYPE_VIA_VIRTUAL (type, i))
        {
@@ -2043,24 +2080,20 @@ search_struct_method (const char *name, struct value **arg1p,
 
          if (offset < 0 || offset >= TYPE_LENGTH (type))
            {
-             gdb_byte *tmp;
-             struct cleanup *back_to;
              CORE_ADDR address;
 
-             tmp = (gdb_byte *) xmalloc (TYPE_LENGTH (baseclass));
-             back_to = make_cleanup (xfree, tmp);
+             gdb::byte_vector tmp (TYPE_LENGTH (baseclass));
              address = value_address (*arg1p);
 
              if (target_read_memory (address + offset,
-                                     tmp, TYPE_LENGTH (baseclass)) != 0)
+                                     tmp.data (), TYPE_LENGTH (baseclass)) != 0)
                error (_("virtual baseclass botch"));
 
              base_val = value_from_contents_and_address (baseclass,
-                                                         tmp,
+                                                         tmp.data (),
                                                          address + offset);
              base_valaddr = value_contents_for_printing (base_val);
              this_offset = 0;
-             do_cleanups (back_to);
            }
          else
            {
@@ -2124,7 +2157,7 @@ value_struct_elt (struct value **argp, struct value **args,
 
   /* Follow pointers until we get to a non-pointer.  */
 
-  while (TYPE_CODE (t) == TYPE_CODE_PTR || TYPE_CODE (t) == TYPE_CODE_REF)
+  while (TYPE_CODE (t) == TYPE_CODE_PTR || TYPE_IS_REFERENCE (t))
     {
       *argp = value_ind (*argp);
       /* Don't coerce fn pointer to fn and then back again!  */
@@ -2205,15 +2238,13 @@ value_struct_elt_bitpos (struct value **argp, int bitpos, struct type *ftype,
                         const char *err)
 {
   struct type *t;
-  struct value *v;
   int i;
-  int nbases;
 
   *argp = coerce_array (*argp);
 
   t = check_typedef (value_type (*argp));
 
-  while (TYPE_CODE (t) == TYPE_CODE_PTR || TYPE_CODE (t) == TYPE_CODE_REF)
+  while (TYPE_CODE (t) == TYPE_CODE_PTR || TYPE_IS_REFERENCE (t))
     {
       *argp = value_ind (*argp);
       if (TYPE_CODE (check_typedef (value_type (*argp))) != TYPE_CODE_FUNC)
@@ -2264,10 +2295,10 @@ value_struct_elt_bitpos (struct value **argp, int bitpos, struct type *ftype,
 
 static void
 find_method_list (struct value **argp, const char *method,
-                 int offset, struct type *type,
+                 LONGEST offset, struct type *type,
                  struct fn_field **fn_list, int *num_fns,
                  VEC (xmethod_worker_ptr) **xm_worker_vec,
-                 struct type **basetype, int *boffset)
+                 struct type **basetype, LONGEST *boffset)
 {
   int i;
   struct fn_field *f = NULL;
@@ -2324,7 +2355,7 @@ find_method_list (struct value **argp, const char *method,
      extension methods.  */
   for (i = TYPE_N_BASECLASSES (type) - 1; i >= 0; i--)
     {
-      int base_offset;
+      LONGEST base_offset;
 
       if (BASETYPE_VIA_VIRTUAL (type, i))
        {
@@ -2364,17 +2395,17 @@ find_method_list (struct value **argp, const char *method,
 
 static void
 value_find_oload_method_list (struct value **argp, const char *method,
-                              int offset, struct fn_field **fn_list,
+                              LONGEST offset, struct fn_field **fn_list,
                               int *num_fns,
                               VEC (xmethod_worker_ptr) **xm_worker_vec,
-                             struct type **basetype, int *boffset)
+                             struct type **basetype, LONGEST *boffset)
 {
   struct type *t;
 
   t = check_typedef (value_type (*argp));
 
   /* Code snarfed from value_struct_elt.  */
-  while (TYPE_CODE (t) == TYPE_CODE_PTR || TYPE_CODE (t) == TYPE_CODE_REF)
+  while (TYPE_CODE (t) == TYPE_CODE_PTR || TYPE_IS_REFERENCE (t))
     {
       *argp = value_ind (*argp);
       /* Don't coerce fn pointer to fn and then back again!  */
@@ -2460,7 +2491,6 @@ find_overload_match (struct value **args, int nargs,
   int method_oload_champ = -1;
   int src_method_oload_champ = -1;
   int ext_method_oload_champ = -1;
-  int src_and_ext_equal = 0;
 
   /* The measure for the current best match.  */
   struct badness_vector *method_badness = NULL;
@@ -2478,7 +2508,7 @@ find_overload_match (struct value **args, int nargs,
   /* Number of overloaded instances being considered.  */
   int num_fns = 0;
   struct type *basetype = NULL;
-  int boffset;
+  LONGEST boffset;
 
   struct cleanup *all_cleanups = make_cleanup (null_cleanup, NULL);
 
@@ -2559,7 +2589,6 @@ find_overload_match (struct value **args, int nargs,
          switch (compare_badness (ext_method_badness, src_method_badness))
            {
              case 0: /* Src method and xmethod are equally good.  */
-               src_and_ext_equal = 1;
                /* If src method and xmethod are equally good, then
                   xmethod should be the winner.  Hence, fall through to the
                   case where a xmethod is better than the source
@@ -2785,7 +2814,7 @@ find_overload_match (struct value **args, int nargs,
 
       if (TYPE_CODE (temp_type) != TYPE_CODE_PTR
          && (TYPE_CODE (objtype) == TYPE_CODE_PTR
-             || TYPE_CODE (objtype) == TYPE_CODE_REF))
+             || TYPE_IS_REFERENCE (objtype)))
        {
          temp = value_addr (temp);
        }
@@ -2984,7 +3013,6 @@ find_oload_champ (struct value **args, int nargs,
 {
   int ix;
   int fn_count;
-  int xm_worker_vec_n = VEC_length (xmethod_worker_ptr, xm_worker_vec);
   /* A measure of how good an overloaded instance is.  */
   struct badness_vector *bv;
   /* Index of best overloaded function.  */
@@ -3394,6 +3422,11 @@ value_struct_elt_for_reference (struct type *domain, int offset,
            {
              for (j = 0; j < len; ++j)
                {
+                 if (TYPE_CONST (intype) != TYPE_FN_FIELD_CONST (f, j))
+                   continue;
+                 if (TYPE_VOLATILE (intype) != TYPE_FN_FIELD_VOLATILE (f, j))
+                   continue;
+
                  if (compare_parameters (TYPE_FN_FIELD_TYPE (f, j), intype, 0)
                      || compare_parameters (TYPE_FN_FIELD_TYPE (f, j),
                                             intype, 1))
@@ -3575,14 +3608,14 @@ value_maybe_namespace_elt (const struct type *curtype,
 
 struct type *
 value_rtti_indirect_type (struct value *v, int *full, 
-                         int *top, int *using_enc)
+                         LONGEST *top, int *using_enc)
 {
   struct value *target = NULL;
   struct type *type, *real_type, *target_type;
 
   type = value_type (v);
   type = check_typedef (type);
-  if (TYPE_CODE (type) == TYPE_CODE_REF)
+  if (TYPE_IS_REFERENCE (type))
     target = coerce_ref (v);
   else if (TYPE_CODE (type) == TYPE_CODE_PTR)
     {
@@ -3615,8 +3648,8 @@ value_rtti_indirect_type (struct value *v, int *full,
       target_type = value_type (target);
       real_type = make_cv_type (TYPE_CONST (target_type),
                                TYPE_VOLATILE (target_type), real_type, NULL);
-      if (TYPE_CODE (type) == TYPE_CODE_REF)
-        real_type = lookup_reference_type (real_type);
+      if (TYPE_IS_REFERENCE (type))
+        real_type = lookup_reference_type (real_type, TYPE_CODE (type));
       else if (TYPE_CODE (type) == TYPE_CODE_PTR)
         real_type = lookup_pointer_type (real_type);
       else
@@ -3648,7 +3681,7 @@ value_full_object (struct value *argp,
 {
   struct type *real_type;
   int full = 0;
-  int top = -1;
+  LONGEST top = -1;
   int using_enc = 0;
   struct value *new_val;
 
@@ -3804,7 +3837,6 @@ value_slice (struct value *array, int lowbound, int length)
       }
 
     set_value_component_location (slice, array);
-    VALUE_FRAME_ID (slice) = VALUE_FRAME_ID (array);
     set_value_offset (slice, value_offset (array) + offset);
   }