This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

-Wtraditional patch: augment union init warnings


This patch augments in two ways the detection of union initialization
with -Wtraditional.

The first change is to bypass warning on initialization with floating
point zero (as is already done with integer zero.)

The second change is to handle (i.e. not crash on) unions which
contains structs.  We currently choke on this because the containing
function process_init_element() receives a NULL `value' parameter
instead of a tree in this case and NULL can't be passed to
integer_zerop().  So if the `value' of a union init is NULL I made it
warn.

A minor nit is that we can't detect unions substructures which are all
zeros and bypass warning on those too.  However warning in this
obscure case is better than crashing IMO. :-)

The patch below handles these two cases and adds testsuite entries for
both.  I added cases where the union contains a struct which is
explicitly zero filled and made that xfail in case someone wants to
try and fix it someday.

Bootstrapped on solaris2.7, okay to install?

		--Kaveh


2000-09-11  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.

testsuite:
	* gcc.dg/wtr-union-init-2.c, gcc.dg/wtr-union-init-3.c: New tests.

diff -rup orig/egcs-CVS20000910/gcc/c-typeck.c egcs-CVS20000910/gcc/c-typeck.c
--- orig/egcs-CVS20000910/gcc/c-typeck.c	Sun Sep 10 23:17:03 2000
+++ egcs-CVS20000910/gcc/c-typeck.c	Mon Sep 11 11:59:20 2000
@@ -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 -rup orig/egcs-CVS20000910/gcc/testsuite/gcc.dg/wtr-union-init-2.c egcs-CVS20000910/gcc/testsuite/gcc.dg/wtr-union-init-2.c
--- orig/egcs-CVS20000910/gcc/testsuite/gcc.dg/wtr-union-init-2.c	Mon Sep 11 12:13:15 2000
+++ egcs-CVS20000910/gcc/testsuite/gcc.dg/wtr-union-init-2.c	Mon Sep 11 12:53:19 2000
@@ -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 -rup orig/egcs-CVS20000910/gcc/testsuite/gcc.dg/wtr-union-init-3.c egcs-CVS20000910/gcc/testsuite/gcc.dg/wtr-union-init-3.c
--- orig/egcs-CVS20000910/gcc/testsuite/gcc.dg/wtr-union-init-3.c	Mon Sep 11 12:54:57 2000
+++ egcs-CVS20000910/gcc/testsuite/gcc.dg/wtr-union-init-3.c	Mon Sep 11 12:51:22 2000
@@ -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} };
+}

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]