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
This commit is contained in:
parent
158960ba7e
commit
bca6332881
8 changed files with 62 additions and 9 deletions
|
@ -1,3 +1,11 @@
|
|||
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
|
||||
|
|
|
@ -474,12 +474,13 @@ comptypes (tree type1, tree type2, int flags)
|
|||
&& 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)
|
||||
|
|
|
@ -5265,8 +5265,10 @@ similarity. Consequently, @code{short *} is not similar to
|
|||
@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
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
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
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* 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.
|
||||
|
||||
|
@ -228,7 +228,7 @@ void ffecom_finish_decl (tree decl, tree init, bool is_top_level);
|
|||
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);
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
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
|
||||
|
|
|
@ -19,7 +19,6 @@ int main (void)
|
|||
&& __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 @@ int main (void)
|
|||
|| __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 ();
|
||||
|
|
32
gcc/testsuite/gcc.dg/enum-compat-1.c
Normal file
32
gcc/testsuite/gcc.dg/enum-compat-1.c
Normal file
|
@ -0,0 +1,32 @@
|
|||
/* 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);
|
Loading…
Add table
Reference in a new issue