We're out of tree codes; now what?

Doug Gregor doug.gregor@gmail.com
Wed Mar 14 14:09:00 GMT 2007


On 3/14/07, Richard Guenther <richard.guenther@gmail.com> wrote:
> #define LANG_TYPE_CODE (t) (TREE_CODE (t) == LANG_TYPE ?
> LANG_TYPE_SUBCODE (t) : INVALID_SUBCODE)
>
> and then INVALID_SUBCODE will fall through to the default case as well.

But that doesn't put the subcodes and the codes into the same
"namespace". We want to be able to write:

  switch (TREE_CODE (t))
  {
    case FUNCTION_TYPE:
      /* do something with function types. */
     break;

    case TYPEOF_TYPE_SUBCODED:
      /* do something with TYPEOF_TYPE. */
     break;
  }

even though FUNCTION_TYPE is (and will always be) a top-level tree
code, whereas TYPEOF_TYPE should be subcoded and stashed away in a
LANG_TYPE.

Of course, one could use TREE_CODE to see through the difference
between these two, e.g.,

  #define TREE_CODE(NODE)
    ((enum tree_code) (NODE)->base.code == LANG_TYPE?
        (enum tree_code)((TYPE_LANG_SPECIFIC (NODE)->base.subcode +
LAST_AND_UNUSED_TREE_CODE))
        : (enum tree_code) (NODE)->base.code)

Then, the opposite for TREE_SET_CODE:
  #define TREE_SET_CODE(NODE, VALUE)
     ((VALUE) >= LAST_AND_USED_TREE_CODE)?
        ((NODE)->base.code = LANG_TYPE, get_type_lang_specific
(NODE)->base.subcode = (VALUE) - LAST_AND_USED_TREE_CODE)
     : ((NODE)->base.code = (VALUE))

Yuck.

  Cheers,
  Doug



More information about the Gcc mailing list