Fix ARI warning about function names in first column.
[deliverable/binutils-gdb.git] / gdb / gdbtypes.c
index d08dbfe396c1e034aaa5946118fd9167ff3733ad..91fafa21524fea912fd2b985185feec52dc8b1db 100644 (file)
@@ -1,7 +1,7 @@
 /* Support routines for manipulating internal types for GDB.
 
    Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002,
-   2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+   2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
    Free Software Foundation, Inc.
 
    Contributed by Cygnus Support, using pieces from other GDB modules.
 #include "hashtab.h"
 
 
+/* Initialize BADNESS constants.  */
+
+const struct rank LENGTH_MISMATCH_BADNESS = {100,0};
+
+const struct rank TOO_FEW_PARAMS_BADNESS = {100,0};
+const struct rank INCOMPATIBLE_TYPE_BADNESS = {100,0};
+
+const struct rank EXACT_MATCH_BADNESS = {0,0};
+
+const struct rank INTEGER_PROMOTION_BADNESS = {1,0};
+const struct rank FLOAT_PROMOTION_BADNESS = {1,0};
+const struct rank BASE_PTR_CONVERSION_BADNESS = {1,0};
+const struct rank INTEGER_CONVERSION_BADNESS = {2,0};
+const struct rank FLOAT_CONVERSION_BADNESS = {2,0};
+const struct rank INT_FLOAT_CONVERSION_BADNESS = {2,0};
+const struct rank VOID_PTR_CONVERSION_BADNESS = {2,0};
+const struct rank BOOL_PTR_CONVERSION_BADNESS = {3,0};
+const struct rank BASE_CONVERSION_BADNESS = {2,0};
+const struct rank REFERENCE_CONVERSION_BADNESS = {2,0};
+
+const struct rank NS_POINTER_CONVERSION_BADNESS = {10,0};
+
 /* Floatformat pairs.  */
 const struct floatformat *floatformats_ieee_half[BFD_ENDIAN_UNKNOWN] = {
   &floatformat_ieee_half_big,
@@ -98,8 +120,8 @@ show_opaque_type_resolution (struct ui_file *file, int from_tty,
                             struct cmd_list_element *c, 
                             const char *value)
 {
-  fprintf_filtered (file, _("\
-Resolution of opaque struct/class/union types (if set before loading symbols) is %s.\n"),
+  fprintf_filtered (file, _("Resolution of opaque struct/class/union types "
+                           "(if set before loading symbols) is %s.\n"),
                    value);
 }
 
@@ -751,7 +773,7 @@ get_discrete_bounds (struct type *type, LONGEST *lowp, LONGEST *highp)
       if (TYPE_NFIELDS (type) > 0)
        {
          /* The enums may not be sorted by value, so search all
-            entries */
+            entries */
          int i;
 
          *lowp = *highp = TYPE_FIELD_BITPOS (type, 0);
@@ -802,6 +824,50 @@ get_discrete_bounds (struct type *type, LONGEST *lowp, LONGEST *highp)
     }
 }
 
+/* Assuming TYPE is a simple, non-empty array type, compute its upper
+   and lower bound.  Save the low bound into LOW_BOUND if not NULL.
+   Save the high bound into HIGH_BOUND if not NULL.
+
+   Return 1 if the operation was successful.  Return zero otherwise,
+   in which case the values of LOW_BOUND and HIGH_BOUNDS are unmodified.
+
+   We now simply use get_discrete_bounds call to get the values
+   of the low and high bounds.
+   get_discrete_bounds can return three values:
+   1, meaning that index is a range,
+   0, meaning that index is a discrete type,
+   or -1 for failure.  */
+
+int
+get_array_bounds (struct type *type, LONGEST *low_bound, LONGEST *high_bound)
+{
+  struct type *index = TYPE_INDEX_TYPE (type);
+  LONGEST low = 0;
+  LONGEST high = 0;
+  int res;
+
+  if (index == NULL)
+    return 0;
+
+  res = get_discrete_bounds (index, &low, &high);
+  if (res == -1)
+    return 0;
+
+  /* Check if the array bounds are undefined.  */
+  if (res == 1
+      && ((low_bound && TYPE_ARRAY_LOWER_BOUND_IS_UNDEFINED (type))
+         || (high_bound && TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type))))
+    return 0;
+
+  if (low_bound)
+    *low_bound = low;
+
+  if (high_bound)
+    *high_bound = high;
+
+  return 1;
+}
+
 /* Create an array type using either a blank type supplied in
    RESULT_TYPE, or creating a new type, inheriting the objfile from
    RANGE_TYPE.
@@ -842,7 +908,7 @@ create_array_type (struct type *result_type,
   TYPE_INDEX_TYPE (result_type) = range_type;
   TYPE_VPTR_FIELDNO (result_type) = -1;
 
-  /* TYPE_FLAG_TARGET_STUB will take care of zero length arrays */
+  /* TYPE_FLAG_TARGET_STUB will take care of zero length arrays */
   if (TYPE_LENGTH (result_type) == 0)
     TYPE_TARGET_STUB (result_type) = 1;
 
@@ -1180,7 +1246,7 @@ lookup_template_type (char *name, struct type *type,
   strcpy (nam, name);
   strcat (nam, "<");
   strcat (nam, TYPE_NAME (type));
-  strcat (nam, " >");  /* FIXME, extra space still introduced in gcc? */
+  strcat (nam, " >");  /* FIXME, extra space still introduced in gcc?  */
 
   sym = lookup_symbol (nam, block, VAR_DOMAIN, 0);
 
@@ -1234,7 +1300,7 @@ lookup_struct_elt_type (struct type *type, char *name, int noerr)
 #if 0
   /* FIXME: This change put in by Michael seems incorrect for the case
      where the structure tag name is the same as the member name.
-     I.E. when doing "ptype bell->bar" for "struct foo { int bar; int
+     I.e. when doing "ptype bell->bar" for "struct foo { int bar; int
      foo; } bell;" Disabled by fnf.  */
   {
     char *typename;
@@ -1318,7 +1384,7 @@ get_vptr_fieldno (struct type *type, struct type **basetypep)
          if (fieldno >= 0)
            {
              /* If the type comes from a different objfile we can't cache
-                it, it may have a different lifetime. PR 2384 */
+                it, it may have a different lifetime.  PR 2384 */
              if (TYPE_OBJFILE (type) == TYPE_OBJFILE (basetype))
                {
                  TYPE_VPTR_FIELDNO (type) = fieldno;
@@ -1364,7 +1430,7 @@ stub_noname_complaint (void)
    the target type.
 
    If this is a stubbed struct (i.e. declared as struct foo *), see if
-   we can find a full definition in some other file. If so, copy this
+   we can find a full definition in some other file.  If so, copy this
    definition, so we can use it in future.  There used to be a comment
    (but not any code) that if we don't find a full definition, we'd
    set a flag so we don't spend time in the future checking the same
@@ -1516,7 +1582,7 @@ check_typedef (struct type *type)
 
       if (TYPE_STUB (target_type) || TYPE_TARGET_STUB (target_type))
        {
-         /* Empty.  */
+         /* Nothing we can do.  */
        }
       else if (TYPE_CODE (type) == TYPE_CODE_ARRAY
               && TYPE_NFIELDS (type) == 1
@@ -1526,7 +1592,7 @@ check_typedef (struct type *type)
          /* Now recompute the length of the array type, based on its
             number of elements and the target type's length.
             Watch out for Ada null Ada arrays where the high bound
-            is smaller than the low bound. */
+            is smaller than the low bound.  */
          const LONGEST low_bound = TYPE_LOW_BOUND (range_type);
          const LONGEST high_bound = TYPE_HIGH_BOUND (range_type);
          ULONGEST len;
@@ -1540,12 +1606,12 @@ check_typedef (struct type *type)
                 that for x < 0, (ULONGEST) x == -x + ULONGEST_MAX + 1,
                 which is technically not guaranteed by C, but is usually true
                 (because it would be true if x were unsigned with its
-                high-order bit on). It uses the fact that
+                high-order bit on).  It uses the fact that
                 high_bound-low_bound is always representable in
                 ULONGEST and that if high_bound-low_bound+1 overflows,
                 it overflows to 0.  We must change these tests if we 
                 decide to increase the representation of TYPE_LENGTH
-                from unsigned int to ULONGEST. */
+                from unsigned int to ULONGEST.  */
              ULONGEST ulow = low_bound, uhigh = high_bound;
              ULONGEST tlen = TYPE_LENGTH (target_type);
 
@@ -1670,7 +1736,7 @@ check_stub_method (struct type *type, int method_id, int signature_id)
       argcount = 1;
     }
 
-  if (*p != ')')               /* () means no args, skip while */
+  if (*p != ')')               /* () means no args, skip while */
     {
       depth = 0;
       while (*p)
@@ -1889,6 +1955,68 @@ is_integral_type (struct type *t)
         || (TYPE_CODE (t) == TYPE_CODE_BOOL)));
 }
 
+/* Return true if TYPE is scalar.  */
+
+static int
+is_scalar_type (struct type *type)
+{
+  CHECK_TYPEDEF (type);
+
+  switch (TYPE_CODE (type))
+    {
+    case TYPE_CODE_ARRAY:
+    case TYPE_CODE_STRUCT:
+    case TYPE_CODE_UNION:
+    case TYPE_CODE_SET:
+    case TYPE_CODE_STRING:
+    case TYPE_CODE_BITSTRING:
+      return 0;
+    default:
+      return 1;
+    }
+}
+
+/* Return true if T is scalar, or a composite type which in practice has
+   the memory layout of a scalar type.  E.g., an array or struct with only
+   one scalar element inside it, or a union with only scalar elements.  */
+
+int
+is_scalar_type_recursive (struct type *t)
+{
+  CHECK_TYPEDEF (t);
+
+  if (is_scalar_type (t))
+    return 1;
+  /* Are we dealing with an array or string of known dimensions?  */
+  else if ((TYPE_CODE (t) == TYPE_CODE_ARRAY
+           || TYPE_CODE (t) == TYPE_CODE_STRING) && TYPE_NFIELDS (t) == 1
+          && TYPE_CODE (TYPE_INDEX_TYPE (t)) == TYPE_CODE_RANGE)
+    {
+      LONGEST low_bound, high_bound;
+      struct type *elt_type = check_typedef (TYPE_TARGET_TYPE (t));
+
+      get_discrete_bounds (TYPE_INDEX_TYPE (t), &low_bound, &high_bound);
+
+      return high_bound == low_bound && is_scalar_type_recursive (elt_type);
+    }
+  /* Are we dealing with a struct with one element?  */
+  else if (TYPE_CODE (t) == TYPE_CODE_STRUCT && TYPE_NFIELDS (t) == 1)
+    return is_scalar_type_recursive (TYPE_FIELD_TYPE (t, 0));
+  else if (TYPE_CODE (t) == TYPE_CODE_UNION)
+    {
+      int i, n = TYPE_NFIELDS (t);
+
+      /* If all elements of the union are scalar, then the union is scalar.  */
+      for (i = 0; i < n; i++)
+       if (!is_scalar_type_recursive (TYPE_FIELD_TYPE (t, i)))
+         return 0;
+
+      return 1;
+    }
+
+  return 0;
+}
+
 /* A helper function which returns true if types A and B represent the
    "same" class type.  This is true if the types have the same main
    type, or the same name.  */
@@ -1901,32 +2029,50 @@ class_types_same_p (const struct type *a, const struct type *b)
              && !strcmp (TYPE_NAME (a), TYPE_NAME (b))));
 }
 
-/* Check whether BASE is an ancestor or base class of DCLASS
-   Return 1 if so, and 0 if not.  If PUBLIC is 1 then only public
-   ancestors are considered, and the function returns 1 only if
-   BASE is a public ancestor of DCLASS.  */
+/* If BASE is an ancestor of DCLASS return the distance between them.
+   otherwise return -1;
+   eg:
+
+   class A {};
+   class B: public A {};
+   class C: public B {};
+   class D: C {};
+
+   distance_to_ancestor (A, A, 0) = 0
+   distance_to_ancestor (A, B, 0) = 1
+   distance_to_ancestor (A, C, 0) = 2
+   distance_to_ancestor (A, D, 0) = 3
+
+   If PUBLIC is 1 then only public ancestors are considered,
+   and the function returns the distance only if BASE is a public ancestor
+   of DCLASS.
+   Eg:
+
+   distance_to_ancestor (A, D, 1) = -1.  */
 
 static int
-do_is_ancestor (struct type *base, struct type *dclass, int public)
+distance_to_ancestor (struct type *base, struct type *dclass, int public)
 {
   int i;
+  int d;
 
   CHECK_TYPEDEF (base);
   CHECK_TYPEDEF (dclass);
 
   if (class_types_same_p (base, dclass))
-    return 1;
+    return 0;
 
   for (i = 0; i < TYPE_N_BASECLASSES (dclass); i++)
     {
       if (public && ! BASETYPE_VIA_PUBLIC (dclass, i))
        continue;
 
-      if (do_is_ancestor (base, TYPE_BASECLASS (dclass, i), public))
-       return 1;
+      d = distance_to_ancestor (base, TYPE_BASECLASS (dclass, i), public);
+      if (d >= 0)
+       return 1 + d;
     }
 
-  return 0;
+  return -1;
 }
 
 /* Check whether BASE is an ancestor or base class or DCLASS
@@ -1938,7 +2084,7 @@ do_is_ancestor (struct type *base, struct type *dclass, int public)
 int
 is_ancestor (struct type *base, struct type *dclass)
 {
-  return do_is_ancestor (base, dclass, 0);
+  return distance_to_ancestor (base, dclass, 0) >= 0;
 }
 
 /* Like is_ancestor, but only returns true when BASE is a public
@@ -1947,7 +2093,7 @@ is_ancestor (struct type *base, struct type *dclass)
 int
 is_public_ancestor (struct type *base, struct type *dclass)
 {
-  return do_is_ancestor (base, dclass, 1);
+  return distance_to_ancestor (base, dclass, 1) >= 0;
 }
 
 /* A helper function for is_unique_ancestor.  */
@@ -1955,7 +2101,8 @@ is_public_ancestor (struct type *base, struct type *dclass)
 static int
 is_unique_ancestor_worker (struct type *base, struct type *dclass,
                           int *offset,
-                          const bfd_byte *contents, CORE_ADDR address)
+                          const gdb_byte *valaddr, int embedded_offset,
+                          CORE_ADDR address, struct value *val)
 {
   int i, count = 0;
 
@@ -1964,11 +2111,13 @@ is_unique_ancestor_worker (struct type *base, struct type *dclass,
 
   for (i = 0; i < TYPE_N_BASECLASSES (dclass) && count < 2; ++i)
     {
-      struct type *iter = check_typedef (TYPE_BASECLASS (dclass, i));
-      int this_offset = baseclass_offset (dclass, i, contents, address);
+      struct type *iter;
+      int this_offset;
+
+      iter = check_typedef (TYPE_BASECLASS (dclass, i));
 
-      if (this_offset == -1)
-       error (_("virtual baseclass botch"));
+      this_offset = baseclass_offset (dclass, i, valaddr, embedded_offset,
+                                     address, val);
 
       if (class_types_same_p (base, iter))
        {
@@ -1990,8 +2139,9 @@ is_unique_ancestor_worker (struct type *base, struct type *dclass,
        }
       else
        count += is_unique_ancestor_worker (base, iter, offset,
-                                           contents + this_offset,
-                                           address + this_offset);
+                                           valaddr,
+                                           embedded_offset + this_offset,
+                                           address, val);
     }
 
   return count;
@@ -2006,14 +2156,50 @@ is_unique_ancestor (struct type *base, struct value *val)
   int offset = -1;
 
   return is_unique_ancestor_worker (base, value_type (val), &offset,
-                                   value_contents (val),
-                                   value_address (val)) == 1;
+                                   value_contents_for_printing (val),
+                                   value_embedded_offset (val),
+                                   value_address (val), val) == 1;
 }
 
 \f
 
+/* Return the sum of the rank of A with the rank of B.  */
+
+struct rank
+sum_ranks (struct rank a, struct rank b)
+{
+  struct rank c;
+  c.rank = a.rank + b.rank;
+  c.subrank = a.subrank + b.subrank;
+  return c;
+}
+
+/* Compare rank A and B and return:
+   0 if a = b
+   1 if a is better than b
+  -1 if b is better than a.  */
+
+int
+compare_ranks (struct rank a, struct rank b)
+{
+  if (a.rank == b.rank)
+    {
+      if (a.subrank == b.subrank)
+       return 0;
+      if (a.subrank < b.subrank)
+       return 1;
+      if (a.subrank > b.subrank)
+       return -1;
+    }
+
+  if (a.rank < b.rank)
+    return 1;
 
-/* Functions for overload resolution begin here */
+  /* a.rank > b.rank */
+  return -1;
+}
+
+/* Functions for overload resolution begin here.  */
 
 /* Compare two badness vectors A and B and return the result.
    0 => A and B are identical
@@ -2036,7 +2222,7 @@ compare_badness (struct badness_vector *a, struct badness_vector *b)
   /* Subtract b from a */
   for (i = 0; i < a->length; i++)
     {
-      tmp = a->rank[i] - b->rank[i];
+      tmp = compare_ranks (b->rank[i], a->rank[i]);
       if (tmp > 0)
        found_pos = 1;
       else if (tmp < 0)
@@ -2074,7 +2260,7 @@ rank_function (struct type **parms, int nparms,
   int min_len = nparms < nargs ? nparms : nargs;
 
   bv = xmalloc (sizeof (struct badness_vector));
-  bv->length = nargs + 1;      /* add 1 for the length-match rank */
+  bv->length = nargs + 1;      /* add 1 for the length-match rank */
   bv->rank = xmalloc ((nargs + 1) * sizeof (int));
 
   /* First compare the lengths of the supplied lists.
@@ -2084,13 +2270,15 @@ rank_function (struct type **parms, int nparms,
      arguments and ellipsis parameter lists, we should consider those
      and rank the length-match more finely.  */
 
-  LENGTH_MATCH (bv) = (nargs != nparms) ? LENGTH_MISMATCH_BADNESS : 0;
+  LENGTH_MATCH (bv) = (nargs != nparms)
+                     ? LENGTH_MISMATCH_BADNESS
+                     : EXACT_MATCH_BADNESS;
 
-  /* Now rank all the parameters of the candidate function */
+  /* Now rank all the parameters of the candidate function */
   for (i = 1; i <= min_len; i++)
     bv->rank[i] = rank_one_type (parms[i-1], args[i-1]);
 
-  /* If more arguments than parameters, add dummy entries */
+  /* If more arguments than parameters, add dummy entries */
   for (i = min_len + 1; i <= nargs; i++)
     bv->rank[i] = TOO_FEW_PARAMS_BADNESS;
 
@@ -2167,12 +2355,10 @@ types_equal (struct type *a, struct type *b)
     return types_equal (TYPE_TARGET_TYPE (a),
                         TYPE_TARGET_TYPE (b));
 
-  /*
-     Well, damnit, if the names are exactly the same, I'll say they
+  /* Well, damnit, if the names are exactly the same, I'll say they
      are exactly the same.  This happens when we generate method
      stubs.  The types won't point to the same address, but they
-     really are the same.
-  */
+     really are the same.  */
 
   if (TYPE_NAME (a) && TYPE_NAME (b)
       && strcmp (TYPE_NAME (a), TYPE_NAME (b)) == 0)
@@ -2195,12 +2381,13 @@ types_equal (struct type *a, struct type *b)
  * PARM is to ARG.  The higher the return value, the worse the match.
  * Generally the "bad" conversions are all uniformly assigned a 100.  */
 
-int
+struct rank
 rank_one_type (struct type *parm, struct type *arg)
 {
+  struct rank rank = {0,0};
 
   if (types_equal (parm, arg))
-    return 0;
+    return EXACT_MATCH_BADNESS;
 
   /* Resolve typedefs */
   if (TYPE_CODE (parm) == TYPE_CODE_TYPEDEF)
@@ -2211,11 +2398,11 @@ rank_one_type (struct type *parm, struct type *arg)
   /* See through references, since we can almost make non-references
      references.  */
   if (TYPE_CODE (arg) == TYPE_CODE_REF)
-    return (rank_one_type (parm, TYPE_TARGET_TYPE (arg))
-           + REFERENCE_CONVERSION_BADNESS);
+    return (sum_ranks (rank_one_type (parm, TYPE_TARGET_TYPE (arg)),
+                       REFERENCE_CONVERSION_BADNESS));
   if (TYPE_CODE (parm) == TYPE_CODE_REF)
-    return (rank_one_type (TYPE_TARGET_TYPE (parm), arg)
-           + REFERENCE_CONVERSION_BADNESS);
+    return (sum_ranks (rank_one_type (TYPE_TARGET_TYPE (parm), arg),
+                       REFERENCE_CONVERSION_BADNESS));
   if (overload_debug)
   /* Debugging only.  */
     fprintf_filtered (gdb_stderr, 
@@ -2223,7 +2410,7 @@ rank_one_type (struct type *parm, struct type *arg)
                      TYPE_NAME (arg), TYPE_CODE (arg), 
                      TYPE_NAME (parm), TYPE_CODE (parm));
 
-  /* x -> y means arg of type x being supplied for parameter of type y */
+  /* x -> y means arg of type x being supplied for parameter of type y */
 
   switch (TYPE_CODE (parm))
     {
@@ -2238,15 +2425,17 @@ rank_one_type (struct type *parm, struct type *arg)
            return VOID_PTR_CONVERSION_BADNESS;
 
          /* (b) pointer to ancestor-pointer conversion.  */
-         if (is_ancestor (TYPE_TARGET_TYPE (parm),
-                                 TYPE_TARGET_TYPE (arg)))
-           return BASE_PTR_CONVERSION_BADNESS;
+         rank.subrank = distance_to_ancestor (TYPE_TARGET_TYPE (parm),
+                                              TYPE_TARGET_TYPE (arg),
+                                              0);
+         if (rank.subrank >= 0)
+           return sum_ranks (BASE_PTR_CONVERSION_BADNESS, rank);
 
          return INCOMPATIBLE_TYPE_BADNESS;
        case TYPE_CODE_ARRAY:
          if (types_equal (TYPE_TARGET_TYPE (parm),
                           TYPE_TARGET_TYPE (arg)))
-           return 0;
+           return EXACT_MATCH_BADNESS;
          return INCOMPATIBLE_TYPE_BADNESS;
        case TYPE_CODE_FUNC:
          return rank_one_type (TYPE_TARGET_TYPE (parm), arg);
@@ -2287,9 +2476,9 @@ rank_one_type (struct type *parm, struct type *arg)
                 signed and unsigned ints.  */
              if (TYPE_NOSIGN (parm))
                {
-                 /* This case only for character types */
+                 /* This case only for character types */
                  if (TYPE_NOSIGN (arg))
-                   return 0;   /* plain char -> plain char */
+                   return EXACT_MATCH_BADNESS; /* plain char -> plain char */
                  else          /* signed/unsigned char -> plain char */
                    return INTEGER_CONVERSION_BADNESS;
                }
@@ -2301,14 +2490,16 @@ rank_one_type (struct type *parm, struct type *arg)
                         unsigned long -> unsigned long */
                      if (integer_types_same_name_p (TYPE_NAME (parm), 
                                                     TYPE_NAME (arg)))
-                       return 0;
+                       return EXACT_MATCH_BADNESS;
                      else if (integer_types_same_name_p (TYPE_NAME (arg), 
                                                          "int")
                               && integer_types_same_name_p (TYPE_NAME (parm),
                                                             "long"))
-                       return INTEGER_PROMOTION_BADNESS;       /* unsigned int -> unsigned long */
+                       /* unsigned int -> unsigned long */
+                       return INTEGER_PROMOTION_BADNESS;
                      else
-                       return INTEGER_CONVERSION_BADNESS;      /* unsigned long -> unsigned int */
+                       /* unsigned long -> unsigned int */
+                       return INTEGER_CONVERSION_BADNESS;
                    }
                  else
                    {
@@ -2316,16 +2507,18 @@ rank_one_type (struct type *parm, struct type *arg)
                                                     "long")
                          && integer_types_same_name_p (TYPE_NAME (parm), 
                                                        "int"))
-                       return INTEGER_CONVERSION_BADNESS;      /* signed long -> unsigned int */
+                       /* signed long -> unsigned int */
+                       return INTEGER_CONVERSION_BADNESS;
                      else
-                       return INTEGER_CONVERSION_BADNESS;      /* signed int/long -> unsigned int/long */
+                       /* signed int/long -> unsigned int/long */
+                       return INTEGER_CONVERSION_BADNESS;
                    }
                }
              else if (!TYPE_NOSIGN (arg) && !TYPE_UNSIGNED (arg))
                {
                  if (integer_types_same_name_p (TYPE_NAME (parm), 
                                                 TYPE_NAME (arg)))
-                   return 0;
+                   return EXACT_MATCH_BADNESS;
                  else if (integer_types_same_name_p (TYPE_NAME (arg), 
                                                      "int")
                           && integer_types_same_name_p (TYPE_NAME (parm), 
@@ -2391,19 +2584,19 @@ rank_one_type (struct type *parm, struct type *arg)
          if (TYPE_NOSIGN (parm))
            {
              if (TYPE_NOSIGN (arg))
-               return 0;
+               return EXACT_MATCH_BADNESS;
              else
                return INTEGER_CONVERSION_BADNESS;
            }
          else if (TYPE_UNSIGNED (parm))
            {
              if (TYPE_UNSIGNED (arg))
-               return 0;
+               return EXACT_MATCH_BADNESS;
              else
                return INTEGER_PROMOTION_BADNESS;
            }
          else if (!TYPE_NOSIGN (arg) && !TYPE_UNSIGNED (arg))
-           return 0;
+           return EXACT_MATCH_BADNESS;
          else
            return INTEGER_CONVERSION_BADNESS;
        default:
@@ -2437,7 +2630,7 @@ rank_one_type (struct type *parm, struct type *arg)
        case TYPE_CODE_PTR:
          return BOOL_PTR_CONVERSION_BADNESS;
        case TYPE_CODE_BOOL:
-         return 0;
+         return EXACT_MATCH_BADNESS;
        default:
          return INCOMPATIBLE_TYPE_BADNESS;
        }
@@ -2449,7 +2642,7 @@ rank_one_type (struct type *parm, struct type *arg)
          if (TYPE_LENGTH (arg) < TYPE_LENGTH (parm))
            return FLOAT_PROMOTION_BADNESS;
          else if (TYPE_LENGTH (arg) == TYPE_LENGTH (parm))
-           return 0;
+           return EXACT_MATCH_BADNESS;
          else
            return FLOAT_CONVERSION_BADNESS;
        case TYPE_CODE_INT:
@@ -2468,19 +2661,20 @@ rank_one_type (struct type *parm, struct type *arg)
        case TYPE_CODE_FLT:
          return FLOAT_PROMOTION_BADNESS;
        case TYPE_CODE_COMPLEX:
-         return 0;
+         return EXACT_MATCH_BADNESS;
        default:
          return INCOMPATIBLE_TYPE_BADNESS;
        }
       break;
     case TYPE_CODE_STRUCT:
-      /* currently same as TYPE_CODE_CLASS */
+      /* currently same as TYPE_CODE_CLASS */
       switch (TYPE_CODE (arg))
        {
        case TYPE_CODE_STRUCT:
          /* Check for derivation */
-         if (is_ancestor (parm, arg))
-           return BASE_CONVERSION_BADNESS;
+         rank.subrank = distance_to_ancestor (parm, arg, 0);
+         if (rank.subrank >= 0)
+           return sum_ranks (BASE_CONVERSION_BADNESS, rank);
          /* else fall through */
        default:
          return INCOMPATIBLE_TYPE_BADNESS;
@@ -2536,7 +2730,7 @@ rank_one_type (struct type *parm, struct type *arg)
 }
 
 
-/* End of functions for overload resolution */
+/* End of functions for overload resolution */
 
 static void
 print_bit_vector (B_TYPE *bits, int nbits)
@@ -2980,7 +3174,8 @@ recursive_dump_type (struct type *type, int spaces)
                        plongest (TYPE_LOW_BOUND (type)), 
                        TYPE_LOW_BOUND_UNDEFINED (type) ? " (undefined)" : "",
                        plongest (TYPE_HIGH_BOUND (type)),
-                       TYPE_HIGH_BOUND_UNDEFINED (type) ? " (undefined)" : "");
+                       TYPE_HIGH_BOUND_UNDEFINED (type) 
+                       ? " (undefined)" : "");
     }
   printfi_filtered (spaces, "vptr_basetype ");
   gdb_print_host_address (TYPE_VPTR_BASETYPE (type), gdb_stdout);
@@ -3111,7 +3306,8 @@ copy_type_recursive (struct objfile *objfile,
 
   /* We must add the new type to the hash table immediately, in case
      we encounter this type again during a recursive call below.  */
-  stored = obstack_alloc (&objfile->objfile_obstack, sizeof (struct type_pair));
+  stored
+    = obstack_alloc (&objfile->objfile_obstack, sizeof (struct type_pair));
   stored->old = type;
   stored->new = new_type;
   *slot = stored;
@@ -3172,7 +3368,7 @@ copy_type_recursive (struct objfile *objfile,
        }
     }
 
-  /* For range types, copy the bounds information. */
+  /* For range types, copy the bounds information.  */
   if (TYPE_CODE (type) == TYPE_CODE_RANGE)
     {
       TYPE_RANGE_DATA (new_type) = xmalloc (sizeof (struct range_bounds));
@@ -3745,20 +3941,23 @@ _initialize_gdbtypes (void)
   gdbtypes_data = gdbarch_data_register_post_init (gdbtypes_post_init);
   objfile_type_data = register_objfile_data ();
 
-  add_setshow_zinteger_cmd ("overload", no_class, &overload_debug, _("\
-Set debugging of C++ overloading."), _("\
-Show debugging of C++ overloading."), _("\
-When enabled, ranking of the functions is displayed."),
+  add_setshow_zinteger_cmd ("overload", no_class, &overload_debug,
+                           _("Set debugging of C++ overloading."),
+                           _("Show debugging of C++ overloading."),
+                           _("When enabled, ranking of the "
+                             "functions is displayed."),
                            NULL,
                            show_overload_debug,
                            &setdebuglist, &showdebuglist);
 
   /* Add user knob for controlling resolution of opaque types.  */
   add_setshow_boolean_cmd ("opaque-type-resolution", class_support,
-                          &opaque_type_resolution, _("\
-Set resolution of opaque struct/class/union types (if set before loading symbols)."), _("\
-Show resolution of opaque struct/class/union types (if set before loading symbols)."), NULL,
-                          NULL,
+                          &opaque_type_resolution,
+                          _("Set resolution of opaque struct/class/union"
+                            " types (if set before loading symbols)."),
+                          _("Show resolution of opaque struct/class/union"
+                            " types (if set before loading symbols)."),
+                          NULL, NULL,
                           show_opaque_type_resolution,
                           &setlist, &showlist);
 }
This page took 0.035024 seconds and 4 git commands to generate.