wide-int, gengtype
Richard Sandiford
rsandifo@linux.vnet.ibm.com
Mon Nov 25 15:49:00 GMT 2013
Mike Stump <mikestump@comcast.net> writes:
> diff --git a/gcc/gengtype-parse.c b/gcc/gengtype-parse.c
> index 8328e3a..0a58822 100644
> --- a/gcc/gengtype-parse.c
> +++ b/gcc/gengtype-parse.c
> @@ -197,6 +197,23 @@ require2 (int t1, int t2)
> return v;
> }
>
> +/* If the next token does not have one of the codes T1, T2 or T3, report a
> + parse error; otherwise return the token's value. */
> +static const char *
> +require3 (int t1, int t2, int t3)
> +{
> + int u = token ();
> + const char *v = advance ();
> + if (u != t1 && u != t2 && u != t3)
> + {
> + parse_error ("expected %s, %s or %s, have %s",
> + print_token (t1, 0), print_token (t2, 0),
> + print_token (t3, 0), print_token (u, v));
> + return 0;
> + }
> + return v;
> +}
> +
> /* Near-terminals. */
>
> /* C-style string constant concatenation: STRING+
> @@ -243,18 +260,45 @@ require_template_declaration (const char *tmpl_name)
> str = concat (tmpl_name, "<", (char *) 0);
>
> /* Read the comma-separated list of identifiers. */
> - while (token () != '>')
> + int depth = 1;
> + while (depth > 0)
> {
> - const char *id = require2 (ID, ',');
> + if (token () == ENUM)
> + {
> + advance ();
> + str = concat (str, "enum ", (char *) 0);
> + continue;
> + }
> + if (token () == NUM)
> + {
> + str = concat (str, advance (), (char *) 0);
> + continue;
> + }
> + if (token () == ':')
> + {
> + advance ();
> + str = concat (str, ":", (char *) 0);
> + continue;
> + }
> + if (token () == '<')
> + {
> + advance ();
> + str = concat (str, "<", (char *) 0);
> + depth += 1;
> + continue;
> + }
> + if (token () == '>')
> + {
> + advance ();
> + str = concat (str, ">", (char *) 0);
> + depth -= 1;
> + continue;
> + }
> + const char *id = require3 (SCALAR, ID, ',');
> if (id == NULL)
> id = ",";
> str = concat (str, id, (char *) 0);
> }
> -
> - /* Recognize the closing '>'. */
> - require ('>');
> - str = concat (str, ">", (char *) 0);
> -
> return str;
> }
Just for a bit of extra context: this is extending the template support
to handle:
- integer template arguments like foo <2> (used for offset_int and
widest_int)
- enum template arguments like foo <ENUM_VALUE> (used for the int_traits)
- nested templates
- namespaces
Thanks,
Richard
More information about the Gcc-patches
mailing list