--- gcc-3.3.4/gcc/c-typeck.c.orig 2004-04-01 11:20:12.000000000 -0500 +++ gcc-3.3.4/gcc/c-typeck.c 2004-09-16 13:42:39.000000000 -0400 @@ -483,12 +483,13 @@ && TYPE_DOMAIN (t2) != 0) t2 = TYPE_DOMAIN (t2); - /* Treat an enum type as the integer type of the same width and - signedness. */ + /* Enumerated types are compatible with integer types, but this is + not transitive: two enumerated types in the same translation unit + are compatible with each other only if they are the same type. */ - if (TREE_CODE (t1) == ENUMERAL_TYPE) + if (TREE_CODE (t1) == ENUMERAL_TYPE && TREE_CODE (t2) != ENUMERAL_TYPE) t1 = c_common_type_for_size (TYPE_PRECISION (t1), TREE_UNSIGNED (t1)); - if (TREE_CODE (t2) == ENUMERAL_TYPE) + else if (TREE_CODE (t2) == ENUMERAL_TYPE && TREE_CODE (t1) != ENUMERAL_TYPE) t2 = c_common_type_for_size (TYPE_PRECISION (t2), TREE_UNSIGNED (t2)); if (t1 == t2) --- gcc-3.3.4/gcc/doc/extend.texi.orig 2004-03-17 15:13:19.000000000 -0500 +++ gcc-3.3.4/gcc/doc/extend.texi 2004-09-16 13:42:41.000000000 -0400 @@ -4793,8 +4793,10 @@ @code{short **}. Furthermore, two types that are typedefed are considered compatible if their underlying types are compatible. -An @code{enum} type is considered to be compatible with another -@code{enum} type. For example, @code{enum @{foo, bar@}} is similar to +An @code{enum} type is not considered to be compatible with another +@code{enum} type even if both are compatible with the same integer +type; this is what the C standard specifies. +For example, @code{enum @{foo, bar@}} is not similar to @code{enum @{hot, dog@}}. You would typically use this function in code whose execution varies --- gcc-3.3.4/gcc/f/com.h.orig 2003-03-22 10:24:51.000000000 -0500 +++ gcc-3.3.4/gcc/f/com.h 2004-09-16 13:42:41.000000000 -0400 @@ -233,7 +233,7 @@ void ffecom_finish_progunit (void); tree ffecom_get_invented_identifier (const char *pattern, ...) ATTRIBUTE_PRINTF_1; -ffeinfoKindtype ffecom_gfrt_basictype (ffecomGfrt ix); +ffeinfoBasictype ffecom_gfrt_basictype (ffecomGfrt ix); ffeinfoKindtype ffecom_gfrt_kindtype (ffecomGfrt ix); void ffecom_init_0 (void); void ffecom_init_2 (void); --- gcc-3.3.4/gcc/testsuite/gcc.dg/enum-compat-1.c.orig 2004-09-16 13:42:41.000000000 -0400 +++ gcc-3.3.4/gcc/testsuite/gcc.dg/enum-compat-1.c 2004-09-16 13:42:41.000000000 -0400 @@ -0,0 +1,32 @@ +/* Test that enumerated types are only considered compatible when they + are the same type. PR c/6024. */ +/* Origin: Joseph Myers , based on + PR c/6024 from Richard Earnshaw */ +/* { dg-do compile } */ +/* { dg-options "" } */ + +/* Original test from PR c/6024. */ +enum e1 {a, b}; +enum e2 {c, d}; + +void f(enum e1); /* { dg-error "prototype" "error at decl" } */ + +void f(x) + enum e2 x; +{ /* { dg-error "doesn't match prototype" "error at defn" } */ + return; +} + +/* Other compatibility tests. */ +enum e3 { A }; +enum e4 { B }; + +enum e3 v3; +enum e4 *p = &v3; /* { dg-warning "incompatible" "incompatible pointer" } */ +enum e3 *q = &v3; + +void g(enum e3); /* { dg-error "declaration" "error at first decl" } */ +void g(enum e4); /* { dg-error "conflicting types" "error at second decl" } */ + +void h(enum e3); +void h(enum e3); --- gcc-3.3.4/gcc/testsuite/gcc.c-torture/execute/builtin-types-compatible-p.c.orig 2001-12-08 17:29:03.000000000 -0500 +++ gcc-3.3.4/gcc/testsuite/gcc.c-torture/execute/builtin-types-compatible-p.c 2004-09-16 13:42:41.000000000 -0400 @@ -19,7 +19,6 @@ && __builtin_types_compatible_p (typeof (hot), int) && __builtin_types_compatible_p (typeof (hot), typeof (laura)) && __builtin_types_compatible_p (int[5], int[]) - && __builtin_types_compatible_p (typeof (dingos), typeof (cranberry)) && __builtin_types_compatible_p (same1, same2))) abort (); @@ -28,6 +27,7 @@ || __builtin_types_compatible_p (char *, const char *) || __builtin_types_compatible_p (long double, double) || __builtin_types_compatible_p (typeof (i), typeof (d)) + || __builtin_types_compatible_p (typeof (dingos), typeof (cranberry)) || __builtin_types_compatible_p (char, int) || __builtin_types_compatible_p (char *, char **)) abort ();