Excerpts from Alan Modra's message of September 4, 2020 3:34 pm:
> So this one is on top of the previously posted patch.
>
> * d-demangle.c (string_need): Take a size_t n arg, and use size_t tem.
> (string_append): Use size_t n.
> (string_appendn, string_prependn): Take a size_t n arg.
> (TEMPLATE_LENGTH_UNKNOWN): Define as -1UL.
> * d-demangle.c (dlang_number): Make "ret" an unsigned long*.
> Only succeed for result of [0,4294967295UL].
> (dlang_decode_backref): Only succeed for result [1,MAX_LONG].
> (dlang_backref): Remove now unnecessary range check.
> (dlang_symbol_name_p): Likewise.
> (dlang_lname, dlang_parse_template): Take an unsigned long len
> arg.
> (dlang_symbol_backref, dlang_identifier, dlang_parse_integer),
> (dlang_parse_integer, dlang_parse_string),
> (dlang_parse_arrayliteral, dlang_parse_assocarray),
> (dlang_parse_structlit, dlang_parse_tuple),
> (dlang_template_symbol_param, dlang_template_args): Use
> unsigned long variables.
> * testsuite/d-demangle-expected: Add new tests.
>
> diff --git a/libiberty/d-demangle.c b/libiberty/d-demangle.c
> index 59e6ae007a..152f620abf 100644
> --- a/libiberty/d-demangle.c
> +++ b/libiberty/d-demangle.c
> @@ -62,9 +62,9 @@ typedef struct string /* Beware: these aren't
> required to be */
> } string;
>
> static void
> -string_need (string *s, int n)
> +string_need (string *s, size_t n)
> {
> - int tem;
> + size_t tem;
>
> if (s->b == NULL)
> {
> @@ -75,7 +75,7 @@ string_need (string *s, int n)
> s->p = s->b = XNEWVEC (char, n);
> s->e = s->b + n;
> }
> - else if (s->e - s->p < n)
> + else if ((size_t) (s->e - s->p) < n)
> {
> tem = s->p - s->b;
> n += tem;
> @@ -124,14 +124,14 @@ string_setlength (string *s, int n)
> static void
> string_append (string *p, const char *s)
> {
> - int n = strlen (s);
> + size_t n = strlen (s);
> string_need (p, n);
> memcpy (p->p, s, n);
> p->p += n;
> }
>
> static void
> -string_appendn (string *p, const char *s, int n)
> +string_appendn (string *p, const char *s, size_t n)
> {
> if (n != 0)
> {
> @@ -142,7 +142,7 @@ string_appendn (string *p, const char *s, int n)
> }
>
> static void
> -string_prependn (string *p, const char *s, int n)
> +string_prependn (string *p, const char *s, size_t n)
> {
> char *q;
>
> @@ -177,7 +177,7 @@ struct dlang_info
> };
>
> /* Pass as the LEN to dlang_parse_template if symbol length is not known. */
> -enum { TEMPLATE_LENGTH_UNKNOWN = -1 };
> +#define TEMPLATE_LENGTH_UNKNOWN (-1UL)
>
> /* Prototypes for forward referenced functions */
> static const char *dlang_function_type (string *, const char *,
> @@ -200,15 +200,16 @@ static const char *dlang_parse_tuple (string *, const
> char *,
> struct dlang_info *);
>
> static const char *dlang_parse_template (string *, const char *,
> - struct dlang_info *, long);
> + struct dlang_info *, unsigned long);
>
> -static const char *dlang_lname (string *, const char *, long);
> +static const char *dlang_lname (string *, const char *, unsigned long);
>
>
> /* Extract the number from MANGLED, and assign the result to RET.
> - Return the remaining string on success or NULL on failure. */
> + Return the remaining string on success or NULL on failure.
> + A result larger than 4294967295UL is considered a failure. */
If we're already using limits.h, I guess it should be fine to also add
#define UINT_MAX ((unsigned) ~0U)
I'll leave it to your judgement on that though.
Other than that, OK from me.
Iain.