aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2006-09-30 20:46:06 +0100
committerJoseph Myers <jsm28@gcc.gnu.org>2006-09-30 20:46:06 +0100
commit7ed322d7b5f0b66806d3c3185511a93d8a98e969 (patch)
treee7f9e9ef9055bb20c3907865efd402c942dc4871
parent19add4f7e416da5706eb0e0a0cbbd980a74f4b86 (diff)
downloadgcc-7ed322d7b5f0b66806d3c3185511a93d8a98e969.zip
gcc-7ed322d7b5f0b66806d3c3185511a93d8a98e969.tar.gz
gcc-7ed322d7b5f0b66806d3c3185511a93d8a98e969.tar.bz2
re PR c/24010 (Duplicate C99 dot initializer warning missing)
PR c/24010 * c.opt (Woverride-init): New. * c-opts.c (c_common_post_options): Default warn_override_init to extra_warnings. * c-typeck.c (add_pending_init, output_init_element): Warn for overriding initializers without side effects. * doc/invoke.texi (-Woverride-init): Document. (-Wextra): Update. testsuite: * gcc.dg/Woverride-init-1.c, gcc.dg/Woverride-init-2.c, gcc.dg/Woverride-init-3.c: New tests. From-SVN: r117334
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/c-opts.c6
-rw-r--r--gcc/c-typeck.c6
-rw-r--r--gcc/c.opt4
-rw-r--r--gcc/doc/invoke.texi18
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/Woverride-init-1.c28
-rw-r--r--gcc/testsuite/gcc.dg/Woverride-init-2.c28
-rw-r--r--gcc/testsuite/gcc.dg/Woverride-init-3.c29
9 files changed, 134 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7a0e026..e7fc16f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,14 @@
+2006-09-30 Joseph S. Myers <joseph@codesourcery.com>
+
+ PR c/24010
+ * c.opt (Woverride-init): New.
+ * c-opts.c (c_common_post_options): Default warn_override_init to
+ extra_warnings.
+ * c-typeck.c (add_pending_init, output_init_element): Warn for
+ overriding initializers without side effects.
+ * doc/invoke.texi (-Woverride-init): Document.
+ (-Wextra): Update.
+
2006-09-30 Eric Botcazou <ebotcazou@libertysurf.fr>
PR rtl-optimization/28096
diff --git a/gcc/c-opts.c b/gcc/c-opts.c
index 5821dea..b74ce77 100644
--- a/gcc/c-opts.c
+++ b/gcc/c-opts.c
@@ -1016,12 +1016,14 @@ c_common_post_options (const char **pfilename)
if (flag_objc_exceptions && !flag_objc_sjlj_exceptions)
flag_exceptions = 1;
- /* -Wextra implies -Wsign-compare and -Wmissing-field-initializers,
- but not if explicitly overridden. */
+ /* -Wextra implies -Wsign-compare, -Wmissing-field-initializers and
+ -Woverride-init, but not if explicitly overridden. */
if (warn_sign_compare == -1)
warn_sign_compare = extra_warnings;
if (warn_missing_field_initializers == -1)
warn_missing_field_initializers = extra_warnings;
+ if (warn_override_init == -1)
+ warn_override_init = extra_warnings;
/* -Wpointer_sign is disabled by default, but it is enabled if any
of -Wall or -pedantic are given. */
diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c
index 00537ac..89bfed1 100644
--- a/gcc/c-typeck.c
+++ b/gcc/c-typeck.c
@@ -5737,6 +5737,8 @@ add_pending_init (tree purpose, tree value)
{
if (TREE_SIDE_EFFECTS (p->value))
warning_init ("initialized field with side-effects overwritten");
+ else if (warn_override_init)
+ warning_init ("initialized field overwritten");
p->value = value;
return;
}
@@ -5758,6 +5760,8 @@ add_pending_init (tree purpose, tree value)
{
if (TREE_SIDE_EFFECTS (p->value))
warning_init ("initialized field with side-effects overwritten");
+ else if (warn_override_init)
+ warning_init ("initialized field overwritten");
p->value = value;
return;
}
@@ -6230,6 +6234,8 @@ output_init_element (tree value, bool strict_string, tree type, tree field,
if (TREE_SIDE_EFFECTS (VEC_last (constructor_elt,
constructor_elements)->value))
warning_init ("initialized field with side-effects overwritten");
+ else if (warn_override_init)
+ warning_init ("initialized field overwritten");
/* We can have just one union field set. */
constructor_elements = 0;
diff --git a/gcc/c.opt b/gcc/c.opt
index 12510d9..0aa0a3a 100644
--- a/gcc/c.opt
+++ b/gcc/c.opt
@@ -319,6 +319,10 @@ Woverloaded-virtual
C++ ObjC++ Var(warn_overloaded_virtual)
Warn about overloaded virtual function names
+Woverride-init
+C ObjC Var(warn_override_init) Init(-1)
+Warn about overriding initializers without side effects
+
Wparentheses
C ObjC C++ ObjC++ Var(warn_parentheses)
Warn about possibly missing parentheses
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index d5a3b6b..6d7bc1e 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -2876,6 +2876,12 @@ This warning can be independently controlled by
@option{-Wmissing-field-initializers}.
@item
+An initialized field without side effects is overridden when using
+designated initializers (@pxref{Designated Inits, , Designated
+Initializers}). This warning can be independently controlled by
+@option{-Woverride-init}.
+
+@item
A function parameter is declared without a type specifier in K&R-style
functions:
@@ -3302,6 +3308,18 @@ attribute.
@opindex Wno-overflow
Do not warn about compile-time overflow in constant expressions.
+@item -Woverride-init
+@opindex Woverride-init
+@opindex W
+@opindex Wextra
+Warn if an initialized field without side effects is overridden when
+using designated initializers (@pxref{Designated Inits, , Designated
+Initializers}).
+
+This warning is included in @option{-Wextra}. To get other
+@option{-Wextra} warnings without this one, use @samp{-Wextra
+-Wno-override-init}.
+
@item -Wpacked
@opindex Wpacked
Warn if a structure is given the packed attribute, but the packed
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c5c774a..51599a7 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2006-09-30 Joseph S. Myers <joseph@codesourcery.com>
+
+ PR c/24010
+ * gcc.dg/Woverride-init-1.c, gcc.dg/Woverride-init-2.c,
+ gcc.dg/Woverride-init-3.c: New tests.
+
2006-09-30 Eric Botcazou <ebotcazou@libertysurf.fr>
* gcc.c-torture/execute/20060930-1.c: New test.
diff --git a/gcc/testsuite/gcc.dg/Woverride-init-1.c b/gcc/testsuite/gcc.dg/Woverride-init-1.c
new file mode 100644
index 0000000..29eca30
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/Woverride-init-1.c
@@ -0,0 +1,28 @@
+/* Test for warnings for overriding designated initializers:
+ -Woverride-init. Bug 24010. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-Woverride-init" } */
+
+struct s { int a; int b; int c; };
+union u { char a; long long b; };
+
+struct s s0 = {
+ .a = 1,
+ .b = 2,
+ .a = 3, /* { dg-warning "initialized field overwritten|near init" } */
+ 4, /* { dg-warning "initialized field overwritten|near init" } */
+ 5
+};
+
+union u u0 = {
+ .a = 1,
+ .b = 2, /* { dg-warning "initialized field overwritten|near init" } */
+ .a = 3 }; /* { dg-warning "initialized field overwritten|near init" } */
+
+int a[5] = {
+ [0] = 1,
+ [1] = 2,
+ [0] = 3, /* { dg-warning "initialized field overwritten|near init" } */
+ [2] = 4
+};
diff --git a/gcc/testsuite/gcc.dg/Woverride-init-2.c b/gcc/testsuite/gcc.dg/Woverride-init-2.c
new file mode 100644
index 0000000..c5490b5
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/Woverride-init-2.c
@@ -0,0 +1,28 @@
+/* Test for warnings for overriding designated initializers:
+ -Wextra. Bug 24010. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-Wextra" } */
+
+struct s { int a; int b; int c; };
+union u { char a; long long b; };
+
+struct s s0 = {
+ .a = 1,
+ .b = 2,
+ .a = 3, /* { dg-warning "initialized field overwritten|near init" } */
+ 4, /* { dg-warning "initialized field overwritten|near init" } */
+ 5
+};
+
+union u u0 = {
+ .a = 1,
+ .b = 2, /* { dg-warning "initialized field overwritten|near init" } */
+ .a = 3 }; /* { dg-warning "initialized field overwritten|near init" } */
+
+int a[5] = {
+ [0] = 1,
+ [1] = 2,
+ [0] = 3, /* { dg-warning "initialized field overwritten|near init" } */
+ [2] = 4
+};
diff --git a/gcc/testsuite/gcc.dg/Woverride-init-3.c b/gcc/testsuite/gcc.dg/Woverride-init-3.c
new file mode 100644
index 0000000..3fec738
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/Woverride-init-3.c
@@ -0,0 +1,29 @@
+/* Test for warnings for overriding designated initializers: not
+ warned for with -Wextra -Wno-override-init. Bug 24010. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-Wextra -Wno-override-init" } */
+
+struct s { int a; int b; int c; };
+union u { char a; long long b; };
+
+struct s s0 = {
+ .a = 1,
+ .b = 2,
+ .a = 3,
+ 4,
+ 5
+};
+
+union u u0 = {
+ .a = 1,
+ .b = 2,
+ .a = 3
+};
+
+int a[5] = {
+ [0] = 1,
+ [1] = 2,
+ [0] = 3,
+ [2] = 4
+};