------- Comment #9 from rguenth at gcc dot gnu dot org  2009-10-11 15:13 -------
Ok, so the issue here is that we have

  typedef struct VEC_constructor_elt_gc { } VEC_constructor_elt_gc;

vs.

  typedef struct VEC_constructor_elt_gcx { } VEC_constructor_elt_gc;

which causes us to not merge the two union tree_node types which are

  typedef union tree_node *tree;
  union tree_node {
    tree * use;
    VEC_constructor_elt_gc *elts;
  };

And in the end because we look through typedefs here:

  static hashval_t
  iterative_hash_type_name (tree type, hashval_t v)
  {
    tree name = TYPE_NAME (TYPE_MAIN_VARIANT (type));

Now this is necessary - we'd want to merge

  union tree_node {
    tree * use;
    struct VEC_constructor_elt_gc *elts;
  };

as well.

So - this cannot be fixed by type merging, but instead together with what
we need to fix TBAA issues for non-merged types we have to try to cover
these issues as well.

Now - a C language lawyer could chime in here and tell us if the above
invokes undefined behavior.  Short:

 typedef struct A {} T;
 typedef struct B {} T;

is this valid cross translation-unit if T is used across units?


-- 

rguenth at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
     Ever Confirmed|0                           |1
   Last reconfirmed|0000-00-00 00:00:00         |2009-10-11 15:13:42
               date|                            |


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41598

Reply via email to