From 32892c52e4674485c40311bd82d64f5adb025905 Mon Sep 17 00:00:00 2001 From: "Kaveh R. Ghazi" Date: Tue, 12 Sep 2000 14:22:45 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 5 ++ gcc/c-typeck.c | 3 +- gcc/testsuite/ChangeLog | 4 ++ gcc/testsuite/gcc.dg/wtr-union-init-2.c | 45 +++++++++++++++++ gcc/testsuite/gcc.dg/wtr-union-init-3.c | 64 +++++++++++++++++++++++++ 5 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/wtr-union-init-2.c create mode 100644 gcc/testsuite/gcc.dg/wtr-union-init-3.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1b43f5578ba..2e7d3cc2599 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2000-09-12 Kaveh R. Ghazi + + * 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 * config/sh/sh.h (PREDICATE_CODES): Add CONST_DOUBLE to diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index 49227ff82c5..002d4e704fe 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 d654affba1c..ab9be1b1c41 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2000-09-12 Kaveh R. Ghazi + + * gcc.dg/wtr-union-init-2.c, gcc.dg/wtr-union-init-3.c: New tests. + 2000-09-11 Zack Weinberg * 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 00000000000..3c2aad71111 --- /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 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 00000000000..3eec29e0c74 --- /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 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} }; +} -- 2.30.2