diff options
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/c-typeck.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/Wconversion.c | 20 |
3 files changed, 28 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3fa7077..6e4d58d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2001-10-26 Neil Booth <neil@daikokuya.demon.co.uk> + + * c-typeck.c (convert_arguments): When comparing for enumeral + type equality, use TYPE_MAIN_VARIANT. + * gcc.dg/Wconversion.c: New tests. + 2001-10-26 Kazu Hirata <kazu@hxi.com> * s390/s390.c: Fix comment typos. diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index aa7e89f..62e7898 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -1651,7 +1651,8 @@ convert_arguments (typelist, values, name, fundecl) tree type1 = TREE_TYPE (would_have_been); if (TREE_CODE (type) == ENUMERAL_TYPE - && type == TREE_TYPE (val)) + && (TYPE_MAIN_VARIANT (type) + == TYPE_MAIN_VARIANT (TREE_TYPE (val)))) /* No warning if function asks for enum and the actual arg is that enum type. */ ; diff --git a/gcc/testsuite/gcc.dg/Wconversion.c b/gcc/testsuite/gcc.dg/Wconversion.c new file mode 100644 index 0000000..7cbcb6a --- /dev/null +++ b/gcc/testsuite/gcc.dg/Wconversion.c @@ -0,0 +1,20 @@ +/* Source: PR 137. + + We would not warn about passing an enum, but would warn about + passing a enum that was part of an array. TYPE_MAIN_VARIANT was + not used in the appropriate place in the warning code. */ + +/* { dg-do compile } */ +/* { dg-options -Wconversion } */ + +typedef enum { a } __attribute__((packed)) t; +void f(t x) {} + +int main(void) +{ + t x[2], y; + f(x[0]); /* { dg-bogus "different width" } */ + f(y); /* { dg-bogus "different width" } */ + return 0; +} + |