OSDN Git Service

* c-typeck.c (process_init_element): Avoid union init warnings on
authorghazi <ghazi@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 12 Sep 2000 14:22:45 +0000 (14:22 +0000)
committerghazi <ghazi@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 12 Sep 2000 14:22:45 +0000 (14:22 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@36358 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/c-typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/wtr-union-init-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/wtr-union-init-3.c [new file with mode: 0644]

index 1b43f55..2e7d3cc 100644 (file)
@@ -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
index 49227ff..002d4e7 100644 (file)
@@ -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.  */
index d654aff..ab9be1b 100644 (file)
@@ -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 (file)
index 0000000..3c2aad7
--- /dev/null
@@ -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 (file)
index 0000000..3eec29e
--- /dev/null
@@ -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} };
+}