Hi,

  I've been pushing, locally, the compilation of GCC sources with g++.
So far, I've gotten past libiberty, fixincludes, libcpp, the C
front-end specific files, RTL files with no much pain.  However, the
files tree-* and associated headers seem to be the most resolutely C++
unfriendly (I guess I would have to change that judgment when I come
to some files in cp/ ;-)).

  My first attempt this morning met:

/home/gdr/redhat/libcpp.gcc/gcc/tree-cfg.c: In function 'void
bsi_insert_before(block_stmt_iterator*, tree_node*, bsi_iterator_update)':
/home/gdr/redhat/libcpp.gcc/gcc/tree-cfg.c:2935: error: cannot convert
'bsi_iterator_update' to 'tsi_iterator_update' for argument '3' to
'void tsi_link_before(tree_stmt_iterator*, tree_node*, tsi_iterator_update)'

The fragment in question is:

void
bsi_insert_before (block_stmt_iterator *i, tree t, enum bsi_iterator_update m)
{
  set_bb_for_stmt (t, i->bb);
  update_modified_stmts (t);
  tsi_link_before (&i->tsi, t, m);      // <=== HERE
}

Now, tsi_link_before() is declared to take "enum tsi_iterator_update" as
its third argument, so this is really a type violation or at least
looks very suspicious.  Chasing the definitions of both enums, I found

/* (from tree-flow.h)  */
enum bsi_iterator_update
{
  /* Note that these are intentionally in the same order as TSI_FOO. They
     mean exactly the same as their TSI_* counterparts.  */
  BSI_NEW_STMT,
  BSI_SAME_STMT,
  BSI_CHAIN_START,
  BSI_CHAIN_END,
  BSI_CONTINUE_LINKING
};

/* from tree-iterator.h */
enum tsi_iterator_update
{
  TSI_NEW_STMT,         /* Leave the iterator at the same statement. */
  TSI_SAME_STMT,        /* Only valid when single statement is added, move
                           iterator to it.  */
  TSI_CHAIN_START,      /* Only valid when chain of statements is added, move
                           iterator to the first statement in the chain.  */
  TSI_CHAIN_END,        /* Only valid when chain of statements is added, move
                           iterator to the last statement in the chain.  */
  TSI_CONTINUE_LINKING  /* Move iterator to whatever position is suitable for
                           linking other statements/chains of statements in
                           the same direction.  */
};


So, both enums are pretty similar, except for the names (of the type
and constants).  

Is there any particular reason why we cannot have just *one*
"iterator_update" enum, instead of two, and we have to cheat?
This duplication does not look to me like good thing we want to
have.  What am I overlooking?

-- Gaby

Reply via email to