Hi,

while waiting for my copyright assignment, I continued compiling gcc
with a C++ compiler. Most problems are minor, but now I encountered one
where I am unsure what to do:

The basic tree codes are defined by the enum tree_code, that basically
looks like this:

enum tree_code {
   <lot of codes>
   LAST_AND_UNUSED_TREE_CODE
}

The C front end apparently needs additional tree codes, and defines them
like this:

enum c_tree_code {
  C_DUMMY_TREE_CODE = LAST_AND_UNUSED_TREE_CODE,
  <currently one C code>
}

So far ok, but then C front end passes its private tree code to
functions expecting tree_code values. This is not accepted by the C++
compiler, as tree_code and c_tree_code are distinct types.
In fact I think the code is undefined even in C unless something like
MAXIMUM_TREE_CODE = 65535 is added to tree_code and MINIMUM_TREE_CODE=0
is added to c_tree_code. (At least if the C++ standard paragraph 7.2.6
is similar to its C counterpart)

Now I have multiple options to fix this issue:

1) I could just explicitly cast from c_tree_code to tree_code. Avoids
the error, and is only needed about two or three times in the whole code
as there is only one C tree_code currently. But more tree code might be
added in the future and other front end might use more tree codes.

2) I could use an integer data type instead of an enum to hold the tree
code values. This avoids all problems, but is massively invasive: grep
"enum tree_code" returns 530 hits, changing all of these into tree_code
(as an integer typedef would not be in the enum namespace) would touch
many files. Probably not a good idea.

3) use preprocessor magic to add the front end tree codes into the tree
code enum, somewhat like this (just a rough sketch):

enum tree_code {
   <lot of codes>
   LAST_AND_UNUSED_TREE_CODE,
   FIRST_C_CODE = LAST_AND_UNUSED_TREE_CODE,
#include "c-common.def"
   FIRST_FOOLANG_CODE = LAST_AND_UNUSED_TREE_CODE,
#include "foolang-common.def"
}

This gets the enum reasonable, but has to know the front ends somehow.
Or perhaps it is enough to include the tree codes of the _current_ front
end, whatever it is. The preprocessor magic is probably not trivial, but
otherwise the rest of the code should not be affected.


I tend to just go for 1) and add the casts, but this is not very future
proof. Any suggestions?

Thomas

Reply via email to