------- Additional Comments From jakub at gcc dot gnu dot org 2005-02-21 14:28 ------- This is a regression from GCC 3.4.x and earlier btw.
The problem seems to be that STRIP_USELESS_TYPE_CONVERSION strips E to E __attribute__ ((mode (__byte__))) conversion as useless, although it has different TYPE_MODE and TYPE_PRECISION. This is because both have the same TYPE_MAIN_VARIANT. I tried following patch which cures this for C, but unfortunately breaks C++ at the same time (C++ needs both enums to have the same main variant): --- gcc/c-common.c.jj 2005-02-14 09:25:46.000000000 +0100 +++ gcc/c-common.c 2005-02-21 14:43:53.000000000 +0100 @@ -4364,7 +4364,7 @@ handle_mode_attribute (tree *node, tree } if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE)) - type = build_variant_type_copy (type); + type = build_distinct_type_copy (type); /* We cannot use layout_type here, because that will attempt to re-layout all variants, corrupting our original. */ --- gcc/c-typeck.c.jj 2005-02-19 00:31:52.000000000 +0100 +++ gcc/c-typeck.c 2005-02-21 15:07:51.249019189 +0100 @@ -755,12 +755,19 @@ comptypes (tree type1, tree type2) if (c_dialect_objc () && objc_comptypes (t1, t2, 0) == 1) val = 1; - case ENUMERAL_TYPE: case UNION_TYPE: if (val != 1 && !same_translation_unit_p (t1, t2)) val = tagged_types_tu_compatible_p (t1, t2); break; + /* Don't consider enum E { A, B } and enum E __attribute__((mode (byte))) + to be compatible. */ + case ENUMERAL_TYPE: + if (val != 1 && TYPE_MODE (t1) == TYPE_MODE (t2) + && !same_translation_unit_p (t1, t2)) + val = tagged_types_tu_compatible_p (t1, t2); + break; + case VECTOR_TYPE: val = TYPE_VECTOR_SUBPARTS (t1) == TYPE_VECTOR_SUBPARTS (t2) && comptypes (TREE_TYPE (t1), TREE_TYPE (t2)); Alternative would be e.g. to change c_types_compatible_p to special case ENUMERAL_TYPEs and requiring there TYPE_MODE () to be compatible. -- What |Removed |Added ---------------------------------------------------------------------------- CC| |rth at gcc dot gnu dot org Target Milestone|--- |4.0.0 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19874