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.
This commit is contained in:
Daniel Jacobowitz 2003-01-13 20:08:58 +00:00
parent a1fb14a2c2
commit 973ccf8b55
3 changed files with 59 additions and 7 deletions

View 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

View 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;

View 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)