Commit bca63328 by Joseph Myers Committed by Joseph Myers

re PR c/6024 (GCC fails to diagnose mismatch of enum types in prototype/function)

	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.

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.

From-SVN: r75521
parent 158960ba
2004-01-07 Joseph S. Myers <jsm@polyomino.org.uk> 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 PR c/12165
* c-decl.c (grokdeclarator): Take type qualifiers of typedefed * c-decl.c (grokdeclarator): Take type qualifiers of typedefed
array type from the array element type. array type from the array element type.
......
...@@ -474,12 +474,13 @@ comptypes (tree type1, tree type2, int flags) ...@@ -474,12 +474,13 @@ comptypes (tree type1, tree type2, int flags)
&& TYPE_DOMAIN (t2) != 0) && TYPE_DOMAIN (t2) != 0)
t2 = TYPE_DOMAIN (t2); t2 = TYPE_DOMAIN (t2);
/* Treat an enum type as the integer type of the same width and /* Enumerated types are compatible with integer types, but this is
signedness. */ 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)); 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)); t2 = c_common_type_for_size (TYPE_PRECISION (t2), TREE_UNSIGNED (t2));
if (t1 == t2) if (t1 == t2)
......
...@@ -5265,8 +5265,10 @@ similarity. Consequently, @code{short *} is not similar to ...@@ -5265,8 +5265,10 @@ similarity. Consequently, @code{short *} is not similar to
@code{short **}. Furthermore, two types that are typedefed are @code{short **}. Furthermore, two types that are typedefed are
considered compatible if their underlying types are compatible. considered compatible if their underlying types are compatible.
An @code{enum} type is considered to be compatible with another An @code{enum} type is not considered to be compatible with another
@code{enum} type. For example, @code{enum @{foo, bar@}} is similar to @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@}}. @code{enum @{hot, dog@}}.
You would typically use this function in code whose execution varies 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> 2003-12-29 Roger Sayle <roger@eyesopen.com>
PR fortran/12632 PR fortran/12632
......
/* com.h -- Public #include File (module.h template V1.0) /* 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. Free Software Foundation, Inc.
Contributed by James Craig Burley. Contributed by James Craig Burley.
...@@ -228,7 +228,7 @@ void ffecom_finish_decl (tree decl, tree init, bool is_top_level); ...@@ -228,7 +228,7 @@ void ffecom_finish_decl (tree decl, tree init, bool is_top_level);
void ffecom_finish_progunit (void); void ffecom_finish_progunit (void);
tree ffecom_get_invented_identifier (const char *pattern, ...) tree ffecom_get_invented_identifier (const char *pattern, ...)
ATTRIBUTE_PRINTF_1; ATTRIBUTE_PRINTF_1;
ffeinfoKindtype ffecom_gfrt_basictype (ffecomGfrt ix); ffeinfoBasictype ffecom_gfrt_basictype (ffecomGfrt ix);
ffeinfoKindtype ffecom_gfrt_kindtype (ffecomGfrt ix); ffeinfoKindtype ffecom_gfrt_kindtype (ffecomGfrt ix);
void ffecom_init_0 (void); void ffecom_init_0 (void);
void ffecom_init_2 (void); void ffecom_init_2 (void);
......
2004-01-07 Joseph S. Myers <jsm@polyomino.org.uk> 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 PR c/12165
* gcc.dg/array-quals-1.c, gcc.dg/c90-idem-qual-3.c, * gcc.dg/array-quals-1.c, gcc.dg/c90-idem-qual-3.c,
gcc.dg/c99-idem-qual-3.c: New tests. gcc.dg/c99-idem-qual-3.c: New tests.
......
...@@ -19,7 +19,6 @@ int main (void) ...@@ -19,7 +19,6 @@ int main (void)
&& __builtin_types_compatible_p (typeof (hot), int) && __builtin_types_compatible_p (typeof (hot), int)
&& __builtin_types_compatible_p (typeof (hot), typeof (laura)) && __builtin_types_compatible_p (typeof (hot), typeof (laura))
&& __builtin_types_compatible_p (int[5], int[]) && __builtin_types_compatible_p (int[5], int[])
&& __builtin_types_compatible_p (typeof (dingos), typeof (cranberry))
&& __builtin_types_compatible_p (same1, same2))) && __builtin_types_compatible_p (same1, same2)))
abort (); abort ();
...@@ -28,6 +27,7 @@ int main (void) ...@@ -28,6 +27,7 @@ int main (void)
|| __builtin_types_compatible_p (char *, const char *) || __builtin_types_compatible_p (char *, const char *)
|| __builtin_types_compatible_p (long double, double) || __builtin_types_compatible_p (long double, double)
|| __builtin_types_compatible_p (typeof (i), typeof (d)) || __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, int)
|| __builtin_types_compatible_p (char *, char **)) || __builtin_types_compatible_p (char *, char **))
abort (); abort ();
......
/* 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);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment