* c-typeck.c (comptypes): Only treat enumerated types in the same
translation unit as compatible with each other when they are the
same type.
* doc/extend.texi: Update.
f:
* com.h (ffecom_gfrt_basictype): Correct return type.
testsuite:
* gcc.dg/enum-compat-1.c: New test.
* gcc.c-torture/execute/builtin-types-compatible-p.c: Update.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@75521
138bc75d-0d04-0410-961f-
82ee72b054a4
+2004-01-07 Joseph S. Myers <jsm@polyomino.org.uk>
+
+ PR c/6024
+ * c-typeck.c (comptypes): Only treat enumerated types in the same
+ translation unit as compatible with each other when they are the
+ same type.
+ * doc/extend.texi: Update.
+
2004-01-07 Joseph S. Myers <jsm@polyomino.org.uk>
PR c/12165
&& 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)
@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
+2004-01-07 Joseph S. Myers <jsm@polyomino.org.uk>
+
+ * com.h (ffecom_gfrt_basictype): Correct return type.
+
2003-12-29 Roger Sayle <roger@eyesopen.com>
PR fortran/12632
/* com.h -- Public #include File (module.h template V1.0)
- Copyright (C) 1995, 1996, 1997, 2000, 2003
+ Copyright (C) 1995, 1996, 1997, 2000, 2003, 2004
Free Software Foundation, Inc.
Contributed by James Craig Burley.
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);
+2004-01-07 Joseph S. Myers <jsm@polyomino.org.uk>
+
+ PR c/6024
+ * gcc.dg/enum-compat-1.c: New test.
+ * gcc.c-torture/execute/builtin-types-compatible-p.c: Update.
+
2004-01-07 Joseph S. Myers <jsm@polyomino.org.uk>
PR c/12165
&& __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 ();
|| __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 ();
--- /dev/null
+/* Test that enumerated types are only considered compatible when they
+ are the same type. PR c/6024. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk>, based on
+ PR c/6024 from Richard Earnshaw <rearnsha@arm.com> */
+/* { 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);