wide-int change introduced C++ templates in header file, like generic_wide_int<fixed_wide_int_storage<int_traits<T1>::precision>>
create_user_defined_type in gengtype.c calls 1. strtok (arg, ",>"). 2. resolve_typedef (field_name, pos), which calls create_user_defined_type, which calls strtok (arg, ",>") again. 3. strtok (0, ",>"), which uses the wrong saved pointer. On Linux/x32, I got build/gengtype \ -S /export/gnu/import/git/gcc/gcc -I gtyp-input.list -w tmp-gtype.state /bin/sh /export/gnu/import/git/gcc/gcc/../move-if-change tmp-gtype.state gtype.state build/gengtype \ -r gtype.state gengtype: gtype.state:22372: Invalid state file; Lexical error... make: *** [s-gtype] Error 1 [hjl@gnu-mic-2 gcc]$ grep xfff gtype.state (!type undefined 1481 nil gc_unused "qQ\x02\xffffff98\x01" (!pair "qQ\x02\xffffff98\x01" (!type undefined 1486 nil gc_unused "qQ\x02\xffffff87\x01" (!pair "qQ\x02\xffffff87\x01" (!pair "qQ\x02\xffffff98\x01" (!pair "qQ\x02\xffffff87\x01" [hjl@gnu-mic-2 gcc]$ It is a pure luck that it doesn't fail on other platforms. This patch replaces strtok with strtoken. OK for trunk after bootstrap + testsuite? H.J. --- 2014-07-28 H.J. Lu <hongjiu...@intel.com> PR bootstrap/61914 * gengtype.c (strtoken): New function. (create_user_defined_type): Replace strtok with strtoken. diff --git a/gcc/gengtype.c b/gcc/gengtype.c index ffe3f94..e66941b 100644 --- a/gcc/gengtype.c +++ b/gcc/gengtype.c @@ -569,6 +569,40 @@ do_scalar_typedef (const char *s, struct fileloc *pos) do_typedef (s, &scalar_nonchar, pos); } +/* Similar to strtok_r. */ + +static char * +strtoken (char *str, const char *delim, char **next) +{ + char *p; + + if (str == NULL) + str = *next; + + /* Skip the leading delimiters. */ + str += strspn (str, delim); + if (*str == '\0') + /* This is an empty token. */ + return NULL; + + /* The current token. */ + p = str; + + /* Find the next delimiter. */ + str += strcspn (str, delim); + if (*str == '\0') + /* This is the last token. */ + *next = str; + else + { + /* Terminate the current token. */ + *str = '\0'; + /* Advance to the next token. */ + *next = str + 1; + } + + return p; +} /* Define TYPE_NAME to be a user defined type at location POS. */ @@ -599,7 +633,8 @@ create_user_defined_type (const char *type_name, struct fileloc *pos) comma-separated list of strings, implicitly assumed to be type names, potentially with "*" characters. */ char *arg = open_bracket + 1; - char *type_id = strtok (arg, ",>"); + char *next; + char *type_id = strtoken (arg, ",>", &next); pair_p fields = 0; while (type_id) { @@ -628,7 +663,7 @@ create_user_defined_type (const char *type_name, struct fileloc *pos) arg_type = resolve_typedef (field_name, pos); fields = create_field_at (fields, arg_type, field_name, 0, pos); - type_id = strtok (0, ",>"); + type_id = strtoken (0, ",>", &next); } /* Associate the field list to TY. */