aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorKaveh R. Ghazi <ghazi@caip.rutgers.edu>2000-09-12 14:22:45 +0000
committerKaveh Ghazi <ghazi@gcc.gnu.org>2000-09-12 14:22:45 +0000
commit32892c52e4674485c40311bd82d64f5adb025905 (patch)
tree6aaa48ffc7686f85463cf81cf5f0dc0142e4c76f /gcc
parentae0a1c23b769ac9d8fa1b572b5effcb7a275a494 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/c-typeck.c3
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/wtr-union-init-2.c45
-rw-r--r--gcc/testsuite/gcc.dg/wtr-union-init-3.c64
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} };
+}