diff options
author | Kaveh R. Ghazi <ghazi@caip.rutgers.edu> | 2000-09-12 14:22:45 +0000 |
---|---|---|
committer | Kaveh Ghazi <ghazi@gcc.gnu.org> | 2000-09-12 14:22:45 +0000 |
commit | 32892c52e4674485c40311bd82d64f5adb025905 (patch) | |
tree | 6aaa48ffc7686f85463cf81cf5f0dc0142e4c76f /gcc | |
parent | ae0a1c23b769ac9d8fa1b572b5effcb7a275a494 (diff) | |
download | gcc-32892c52e4674485c40311bd82d64f5adb025905.zip gcc-32892c52e4674485c40311bd82d64f5adb025905.tar.gz gcc-32892c52e4674485c40311bd82d64f5adb025905.tar.bz2 |
c-typeck.c (process_init_element): Avoid union init warnings on floating point zero.
* c-typeck.c (process_init_element): Avoid union init warnings on
floating point zero. Don't crash on unions containing structs.
testsuite:
* gcc.dg/wtr-union-init-2.c, gcc.dg/wtr-union-init-3.c: New tests.
From-SVN: r36358
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/c-typeck.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/wtr-union-init-2.c | 45 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/wtr-union-init-3.c | 64 |
5 files changed, 120 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1b43f55..2e7d3cc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2000-09-12 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> + + * c-typeck.c (process_init_element): Avoid union init warnings on + floating point zero. Don't crash on unions containing structs. + 2000-09-12 Alexandre Oliva <aoliva@redhat.com> * config/sh/sh.h (PREDICATE_CODES): Add CONST_DOUBLE to diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index 49227ff..002d4e7 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -6394,7 +6394,8 @@ process_init_element (value) code appears conditioned on e.g. __STDC__ to avoid "missing initializer" warnings and relies on default initialization to zero in the traditional C case. */ - if (warn_traditional && !in_system_header && !integer_zerop (value)) + if (warn_traditional && !in_system_header + && !(value && (integer_zerop (value) || real_zerop (value)))) warning ("traditional C rejects initialization of unions"); /* Accept a string constant to initialize a subarray. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d654aff..ab9be1b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2000-09-12 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> + + * gcc.dg/wtr-union-init-2.c, gcc.dg/wtr-union-init-3.c: New tests. + 2000-09-11 Zack Weinberg <zack@wolery.cumb.org> * gcc.dg/cpp/backslash.c: New test. diff --git a/gcc/testsuite/gcc.dg/wtr-union-init-2.c b/gcc/testsuite/gcc.dg/wtr-union-init-2.c new file mode 100644 index 0000000..3c2aad7 --- /dev/null +++ b/gcc/testsuite/gcc.dg/wtr-union-init-2.c @@ -0,0 +1,45 @@ +/* Test for -Wtraditional warnings on union initialization. + Note, gcc should omit these warnings in system header files. + By Kaveh R. Ghazi <ghazi@caip.rutgers.edu> 9/11/2000. */ +/* { dg-do compile } */ +/* { dg-options "-Wtraditional" } */ + +union foo1 +{ + float f; + int i; + long l; +}; + +union foo2 +{ + int i; + float f; + long l; +}; + +void +testfunc (void) +{ + /* Note we only warn for non-zero initializers. */ + static union foo1 f1 = {0}; + static union foo2 f2 = {0}; + static union foo1 f3 = {1}; /* { dg-warning "traditional C rejects initialization of unions" "initialization of unions" } */ + static union foo2 f4 = {1}; /* { dg-warning "traditional C rejects initialization of unions" "initialization of unions" } */ + static union foo1 f5 = {0.0}; + static union foo2 f6 = {0.0}; + static union foo1 f7 = {1.0}; /* { dg-warning "traditional C rejects initialization of unions" "initialization of unions" } */ + static union foo2 f8 = {1.0}; /* { dg-warning "traditional C rejects initialization of unions" "initialization of unions" } */ + +#line 35 "sys-header.h" 3 +/* We are in system headers now, no -Wtraditional warnings should issue. */ + + static union foo1 b1 = {0}; + static union foo2 b2 = {0}; + static union foo1 b3 = {1}; + static union foo2 b4 = {1}; + static union foo1 b5 = {0.0}; + static union foo2 b6 = {0.0}; + static union foo1 b7 = {1.0}; + static union foo2 b8 = {1.0}; +} diff --git a/gcc/testsuite/gcc.dg/wtr-union-init-3.c b/gcc/testsuite/gcc.dg/wtr-union-init-3.c new file mode 100644 index 0000000..3eec29e --- /dev/null +++ b/gcc/testsuite/gcc.dg/wtr-union-init-3.c @@ -0,0 +1,64 @@ +/* Test for -Wtraditional warnings on union initialization. + Note, gcc should omit these warnings in system header files. + By Kaveh R. Ghazi <ghazi@caip.rutgers.edu> 9/11/2000. */ +/* { dg-do compile } */ +/* { dg-options "-Wtraditional" } */ + +struct bar +{ + int i; + long j; +}; + +union foo +{ + struct bar b; + int i; + long l; +}; + +union foo2 +{ + int i; + long l; +}; + +struct baz +{ + int a; + double b; + union foo c; +}; + +struct baz2 +{ + int a; + double b; + union foo2 c; +}; + +void +testfunc (void) +{ + /* Note we only warn for non-zero initializers. Xfail on substructures. */ + static union foo f1 = {{0,0}}; /* { dg-bogus "traditional C rejects initialization of unions" "initialization of unions" { xfail *-*-* } } */ + static union foo f2 = {{1,1}}; /* { dg-warning "traditional C rejects initialization of unions" "initialization of unions" } */ + + static struct baz f3 = { 1, 2, {{0,0}} }; /* { dg-bogus "traditional C rejects initialization of unions" "initialization of unions" { xfail *-*-* } } */ + static struct baz f4 = { 1, 2, {{1,1}} }; /* { dg-warning "traditional C rejects initialization of unions" "initialization of unions" } */ + + static struct baz2 f5 = { 1, 2, {0} }; + static struct baz2 f6 = { 1, 2, {1} }; /* { dg-warning "traditional C rejects initialization of unions" "initialization of unions" } */ + +#line 54 "sys-header.h" 3 +/* We are in system headers now, no -Wtraditional warnings should issue. */ + + static union foo b1 = {{0,0}}; + static union foo b2 = {{1,1}}; + + static struct baz b3 = { 1, 2, {{0,0}} }; + static struct baz b4 = { 1, 2, {{1,1}} }; + + static struct baz2 b5 = { 1, 2, {0} }; + static struct baz2 b6 = { 1, 2, {1} }; +} |