GTY: Repair 'enum gty_token', 'token_names' desynchronization
commitda5f6d9c88c3b6fd505fed06359e344b2892528d
authorThomas Schwinge <thomas@codesourcery.com>
Wed, 5 Jul 2023 09:10:55 +0000 (5 11:10 +0200)
committerThomas Schwinge <thomas@codesourcery.com>
Thu, 6 Jul 2023 09:59:08 +0000 (6 11:59 +0200)
tree8e3d954b0540f3306fca5a12f82e26dab39ed9a1
parent62db795a8fdec8b618a61e40a9e2716768d50d90
GTY: Repair 'enum gty_token', 'token_names' desynchronization

For example, for the following (made-up) changes:

    --- gcc/ggc-tests.cc
    +++ gcc/ggc-tests.cc
    @@ -258 +258 @@ class GTY((tag("1"))) some_subclass : public example_base
    -class GTY((tag("2"))) some_other_subclass : public example_base
    +class GTY((tag(user))) some_other_subclass : public example_base
    @@ -384 +384 @@ test_chain_next ()
    -struct GTY((user)) user_struct
    +struct GTY((user user)) user_struct

..., we get unexpected "have a param<N>_is option" diagnostics:

    [...]
    build/gengtype  \
                        -S [...]/source-gcc/gcc -I gtyp-input.list -w tmp-gtype.state
    [...]/source-gcc/gcc/ggc-tests.cc:258: parse error: expected a string constant, have a param<N>_is option
    [...]/source-gcc/gcc/ggc-tests.cc:384: parse error: expected ')', have a param<N>_is option
    make[2]: *** [Makefile:2888: s-gtype] Error 1
    [...]

This traces back to 2012 "Support garbage-collected C++ templates", which got
incorporated in commit 0823efedd0fb8669b7e840954bc54c3b2cf08d67
(Subversion r190402), which did add 'USER_GTY' to what nowadays is known as
'enum gty_token', but didn't accordingly update
'gcc/gengtype-parse.c:token_names', leaving those out of sync.  Updating
'gcc/gengtype-parse.c:token_value_format' wasn't necessary, as:

    /* print_token assumes that any token >= FIRST_TOKEN_WITH_VALUE may have
       a meaningful value to be printed.  */
    FIRST_TOKEN_WITH_VALUE = PARAM_IS

This, in turn, got further confused -- or "fixed" -- by later changes:
2014 commit 63f5d5b818319129217e41bcb23db53f99ff11b0 (Subversion r218558)
"remove gengtype support for param_is use_param, if_marked and splay tree allocators",
which reciprocally missed corresponding clean-up.

With that addressed via adding the missing '"user"' to 'token_names', and,
until that is properly fixed, a temporary 'UNUSED_PARAM_IS' (re-)added for use
with 'FIRST_TOKEN_WITH_VALUE', we then get the expected:

    [...]/source-gcc/gcc/ggc-tests.cc:258: parse error: expected a string constant, have 'user'
    [...]/source-gcc/gcc/ggc-tests.cc:384: parse error: expected ')', have 'user'

gcc/
* gengtype-parse.cc (token_names): Add '"user"'.
* gengtype.h (gty_token): Add 'UNUSED_PARAM_IS' for use with
'FIRST_TOKEN_WITH_VALUE'.
gcc/gengtype-parse.cc
gcc/gengtype.h