Fix PR gdb/872.
authorDaniel Jacobowitz <drow@false.org>
Mon, 13 Jan 2003 20:08:58 +0000 (20:08 +0000)
committerDaniel Jacobowitz <drow@false.org>
Mon, 13 Jan 2003 20:08:58 +0000 (20:08 +0000)
* gdbtypes.c (init_type): Mark "char" as TYPE_FLAG_NOSIGN.
(integer_types_same_name_p): New function.
(rank_one_type): Use it.
* stabsread.c (read_range_type): Mark "char" as TYPE_FLAG_NOSIGN.

gdb/ChangeLog
gdb/gdbtypes.c
gdb/stabsread.c

index 21ad8bcfb4075f7527bcb12bd18cadd1e5544045..de950fe68155ca48e42203068b476125fa14460c 100644 (file)
@@ -1,3 +1,11 @@
+2003-01-13  Daniel Jacobowitz  <drow@mvista.com>
+
+       Fix PR gdb/872.
+       * gdbtypes.c (init_type): Mark "char" as TYPE_FLAG_NOSIGN.
+       (integer_types_same_name_p): New function.
+       (rank_one_type): Use it.
+       * stabsread.c (read_range_type): Mark "char" as TYPE_FLAG_NOSIGN.
+
 2003-01-13  Daniel Jacobowitz  <drow@mvista.com>
 
        * Makefile.in (TARGET_SYSTEM_ROOT, TARGET_SYSTEM_ROOT_DEFINE): New
index 2a8817d600360324f523c57041aa00d97811dd80..dc1e48a5adfca497ddd9cb2bb150b02671d14c2c 100644 (file)
@@ -1874,6 +1874,9 @@ init_type (enum type_code code, int length, int flags, char *name,
 
   /* C++ fancies.  */
 
+  if (name && strcmp (name, "char") == 0)
+    TYPE_FLAGS (type) |= TYPE_FLAG_NOSIGN;
+
   if (code == TYPE_CODE_STRUCT || code == TYPE_CODE_UNION)
     {
       INIT_CPLUS_SPECIFIC (type);
@@ -2441,6 +2444,43 @@ rank_function (struct type **parms, int nparms, struct type **args, int nargs)
   return bv;
 }
 
+/* Compare the names of two integer types, assuming that any sign
+   qualifiers have been checked already.  We do it this way because
+   there may be an "int" in the name of one of the types.  */
+
+static int
+integer_types_same_name_p (const char *first, const char *second)
+{
+  int first_p, second_p;
+
+  /* If both are shorts, return 1; if neither is a short, keep checking.  */
+  first_p = (strstr (first, "short") != NULL);
+  second_p = (strstr (second, "short") != NULL);
+  if (first_p && second_p)
+    return 1;
+  if (first_p || second_p)
+    return 0;
+
+  /* Likewise for long.  */
+  first_p = (strstr (first, "long") != NULL);
+  second_p = (strstr (second, "long") != NULL);
+  if (first_p && second_p)
+    return 1;
+  if (first_p || second_p)
+    return 0;
+
+  /* Likewise for char.  */
+  first_p = (strstr (first, "char") != NULL);
+  second_p = (strstr (second, "char") != NULL);
+  if (first_p && second_p)
+    return 1;
+  if (first_p || second_p)
+    return 0;
+
+  /* They must both be ints.  */
+  return 1;
+}
+
 /* Compare one type (PARM) for compatibility with another (ARG).
  * PARM is intended to be the parameter type of a function; and
  * ARG is the supplied argument's type.  This function tests if
@@ -2557,16 +2597,19 @@ rank_one_type (struct type *parm, struct type *arg)
                {
                  if (TYPE_UNSIGNED (arg))
                    {
-                     if (!strcmp_iw (TYPE_NAME (parm), TYPE_NAME (arg)))
-                       return 0;       /* unsigned int -> unsigned int, or unsigned long -> unsigned long */
-                     else if (!strcmp_iw (TYPE_NAME (arg), "int") && !strcmp_iw (TYPE_NAME (parm), "long"))
+                     /* unsigned int -> unsigned int, or unsigned long -> unsigned long */
+                     if (integer_types_same_name_p (TYPE_NAME (parm), TYPE_NAME (arg)))
+                       return 0;
+                     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 */
                      else
                        return INTEGER_COERCION_BADNESS;        /* unsigned long -> unsigned int */
                    }
                  else
                    {
-                     if (!strcmp_iw (TYPE_NAME (arg), "long") && !strcmp_iw (TYPE_NAME (parm), "int"))
+                     if (integer_types_same_name_p (TYPE_NAME (arg), "long")
+                         && integer_types_same_name_p (TYPE_NAME (parm), "int"))
                        return INTEGER_COERCION_BADNESS;        /* signed long -> unsigned int */
                      else
                        return INTEGER_CONVERSION_BADNESS;      /* signed int/long -> unsigned int/long */
@@ -2574,9 +2617,10 @@ rank_one_type (struct type *parm, struct type *arg)
                }
              else if (!TYPE_NOSIGN (arg) && !TYPE_UNSIGNED (arg))
                {
-                 if (!strcmp_iw (TYPE_NAME (parm), TYPE_NAME (arg)))
+                 if (integer_types_same_name_p (TYPE_NAME (parm), TYPE_NAME (arg)))
                    return 0;
-                 else if (!strcmp_iw (TYPE_NAME (arg), "int") && !strcmp_iw (TYPE_NAME (parm), "long"))
+                 else if (integer_types_same_name_p (TYPE_NAME (arg), "int")
+                          && integer_types_same_name_p (TYPE_NAME (parm), "long"))
                    return INTEGER_PROMOTION_BADNESS;
                  else
                    return INTEGER_COERCION_BADNESS;
index 7d4459e4139460c24b8ffde11269dae4c51a4b53..135ff83468c27a175daa75454bdf5e7ba9e98a6d 100644 (file)
@@ -4930,7 +4930,7 @@ read_range_type (char **pp, int typenums[2], struct objfile *objfile)
   /* Special case: char is defined (Who knows why) as a subrange of
      itself with range 0-127.  */
   else if (self_subrange && n2 == 0 && n3 == 127)
-    return init_type (TYPE_CODE_INT, 1, 0, NULL, objfile);
+    return init_type (TYPE_CODE_INT, 1, TYPE_FLAG_NOSIGN, NULL, objfile);
 
   /* We used to do this only for subrange of self or subrange of int.  */
   else if (n2 == 0)