Commit eaac4679 by Richard Sandiford Committed by Richard Sandiford

re PR c/13282 (A "-Wno..." switch to turn off "missing initializer" warnings)

	PR c/13282
	* c.opt (Wmissing-field-initializers): New option.
	* c-opts.c (c_common_post_options): Make -Wextra turn it on by default.
	* c-typeck.c (pop_init_level): Guard the missing field warning with
	warn_missing_field_initializers rather than extra_warnings.
	* doc/invoke.texi (-Wmissing-field-initializers): Document, moving
	some of the explanation from...
	(-Wextra): ...here.  Say that the missing field warning can be
	seperately controlled by -Wmissing-field-initializers.

cp/
	* typeck2.c (process_init_constructor): Guard the missing field warning
	with warn_missing_field_initializers rather than extra_warnings.

testsuite/
	* gcc.dg/missing-field-init-[12].c: New tests.
	* g++.dg/warn/missing-field-init-[12].C: New tests.

From-SVN: r85638
parent 155cb616
2004-08-06 Richard Sandiford <rsandifo@redhat.com>
PR c/13282
* c.opt (Wmissing-field-initializers): New option.
* c-opts.c (c_common_post_options): Make -Wextra turn it on by default.
* c-typeck.c (pop_init_level): Guard the missing field warning with
warn_missing_field_initializers rather than extra_warnings.
* doc/invoke.texi (-Wmissing-field-initializers): Document, moving
some of the explanation from...
(-Wextra): ...here. Say that the missing field warning can be
seperately controlled by -Wmissing-field-initializers.
2004-08-06 Paolo Bonzini <bonzini@gnu.org> 2004-08-06 Paolo Bonzini <bonzini@gnu.org>
* expr.c (expand_expr_real_1) <ENTRY_VALUE_EXPR>: Remove. * expr.c (expand_expr_real_1) <ENTRY_VALUE_EXPR>: Remove.
......
...@@ -958,10 +958,12 @@ c_common_post_options (const char **pfilename) ...@@ -958,10 +958,12 @@ c_common_post_options (const char **pfilename)
if (flag_objc_exceptions && !flag_objc_sjlj_exceptions) if (flag_objc_exceptions && !flag_objc_sjlj_exceptions)
flag_exceptions = 1; flag_exceptions = 1;
/* -Wextra implies -Wsign-compare, but not if explicitly /* -Wextra implies -Wsign-compare and -Wmissing-field-initializers,
overridden. */ but not if explicitly overridden. */
if (warn_sign_compare == -1) if (warn_sign_compare == -1)
warn_sign_compare = extra_warnings; warn_sign_compare = extra_warnings;
if (warn_missing_field_initializers == -1)
warn_missing_field_initializers = extra_warnings;
/* Special format checking options don't work without -Wformat; warn if /* Special format checking options don't work without -Wformat; warn if
they are used. */ they are used. */
......
...@@ -4763,7 +4763,7 @@ pop_init_level (int implicit) ...@@ -4763,7 +4763,7 @@ pop_init_level (int implicit)
} }
/* Warn when some struct elements are implicitly initialized to zero. */ /* Warn when some struct elements are implicitly initialized to zero. */
if (extra_warnings if (warn_missing_field_initializers
&& constructor_type && constructor_type
&& TREE_CODE (constructor_type) == RECORD_TYPE && TREE_CODE (constructor_type) == RECORD_TYPE
&& constructor_unfilled_fields) && constructor_unfilled_fields)
......
...@@ -294,6 +294,10 @@ Wmissing-declarations ...@@ -294,6 +294,10 @@ Wmissing-declarations
C ObjC Var(warn_missing_declarations) C ObjC Var(warn_missing_declarations)
Warn about global functions without previous declarations Warn about global functions without previous declarations
Wmissing-field-initializers
C ObjC C++ ObjC++ Var(warn_missing_field_initializers) Init(-1)
Warn about missing fields in struct initializers
Wmissing-format-attribute Wmissing-format-attribute
C ObjC C++ ObjC++ Var(warn_missing_format_attribute) C ObjC C++ ObjC++ Var(warn_missing_format_attribute)
Warn about functions which might be candidates for format attributes Warn about functions which might be candidates for format attributes
......
2004-08-06 Richard Sandiford <rsandifo@redhat.com>
* typeck2.c (process_init_constructor): Guard the missing field warning
with warn_missing_field_initializers rather than extra_warnings.
2004-08-06 Paolo Bonzini <bonzini@gnu.org> 2004-08-06 Paolo Bonzini <bonzini@gnu.org>
* class.c (instantiate_type) <ENTRY_VALUE_EXPR>: Do not handle. * class.c (instantiate_type) <ENTRY_VALUE_EXPR>: Do not handle.
......
...@@ -1022,7 +1022,7 @@ process_init_constructor (tree type, tree init, tree* elts) ...@@ -1022,7 +1022,7 @@ process_init_constructor (tree type, tree init, tree* elts)
next1 = digest_init (TREE_TYPE (field), next1, 0); next1 = digest_init (TREE_TYPE (field), next1, 0);
/* Warn when some struct elements are implicitly initialized. */ /* Warn when some struct elements are implicitly initialized. */
if (extra_warnings if (warn_missing_field_initializers
&& (!init || BRACE_ENCLOSED_INITIALIZER_P (init))) && (!init || BRACE_ENCLOSED_INITIALIZER_P (init)))
warning ("missing initializer for member `%D'", field); warning ("missing initializer for member `%D'", field);
} }
...@@ -1038,7 +1038,7 @@ process_init_constructor (tree type, tree init, tree* elts) ...@@ -1038,7 +1038,7 @@ process_init_constructor (tree type, tree init, tree* elts)
/* Warn when some struct elements are implicitly initialized /* Warn when some struct elements are implicitly initialized
to zero. */ to zero. */
if (extra_warnings if (warn_missing_field_initializers
&& (!init || BRACE_ENCLOSED_INITIALIZER_P (init))) && (!init || BRACE_ENCLOSED_INITIALIZER_P (init)))
warning ("missing initializer for member `%D'", field); warning ("missing initializer for member `%D'", field);
......
...@@ -222,7 +222,7 @@ in the following sections. ...@@ -222,7 +222,7 @@ in the following sections.
-Wimport -Wno-import -Winit-self -Winline @gol -Wimport -Wno-import -Winit-self -Winline @gol
-Wno-invalid-offsetof -Winvalid-pch @gol -Wno-invalid-offsetof -Winvalid-pch @gol
-Wlarger-than-@var{len} -Wlong-long @gol -Wlarger-than-@var{len} -Wlong-long @gol
-Wmain -Wmissing-braces @gol -Wmain -Wmissing-braces -Wmissing-field-initializers @gol
-Wmissing-format-attribute -Wmissing-include-dirs @gol -Wmissing-format-attribute -Wmissing-include-dirs @gol
-Wmissing-noreturn @gol -Wmissing-noreturn @gol
-Wno-multichar -Wnonnull -Wpacked -Wpadded @gol -Wno-multichar -Wnonnull -Wpacked -Wpadded @gol
...@@ -2612,13 +2612,8 @@ incorrect result when the signed value is converted to unsigned. ...@@ -2612,13 +2612,8 @@ incorrect result when the signed value is converted to unsigned.
@item @item
An aggregate has an initializer which does not initialize all members. An aggregate has an initializer which does not initialize all members.
For example, the following code would cause such a warning, because This warning can be independently controlled by
@code{x.h} would be implicitly initialized to zero: @option{-Wmissing-field-initializers}.
@smallexample
struct s @{ int f, g, h; @};
struct s x = @{ 3, 4 @};
@end smallexample
@item @item
A function parameter is declared without a type specifier in K&R-style A function parameter is declared without a type specifier in K&R-style
...@@ -2902,6 +2897,30 @@ Do so even if the definition itself provides a prototype. ...@@ -2902,6 +2897,30 @@ Do so even if the definition itself provides a prototype.
Use this option to detect global functions that are not declared in Use this option to detect global functions that are not declared in
header files. header files.
@item -Wmissing-field-initializers
@opindex Wmissing-field-initializers
@opindex W
@opindex Wextra
Warn if a structure's initializer has some fields missing. For
example, the following code would cause such a warning, because
@code{x.h} is implicitly zero:
@smallexample
struct s @{ int f, g, h; @};
struct s x = @{ 3, 4 @};
@end smallexample
This option does not warn about designated initializers, so the following
modification would not trigger a warning:
@smallexample
struct s @{ int f, g, h; @};
struct s x = @{ .f = 3, .g = 4 @};
@end smallexample
This warning is included in @option{-Wextra}. To get other @option{-Wextra}
warnings without this one, use @samp{-Wextra -Wno-missing-field-initializers}.
@item -Wmissing-noreturn @item -Wmissing-noreturn
@opindex Wmissing-noreturn @opindex Wmissing-noreturn
Warn about functions which might be candidates for attribute @code{noreturn}. Warn about functions which might be candidates for attribute @code{noreturn}.
......
2004-08-06 Richard Sandiford <rsandifo@redhat.com>
* gcc.dg/missing-field-init-[12].c: New tests.
* g++.dg/warn/missing-field-init-[12].C: New tests.
2004-08-06 Mark Mitchell <mark@codesourcery.com> 2004-08-06 Mark Mitchell <mark@codesourcery.com>
* gcc.dg/enum2.c: New test. * gcc.dg/enum2.c: New test.
......
/* { dg-do compile } */
/* { dg-options "-Wextra -Wno-missing-field-initializers" } */
struct s { int a, b, c; };
struct s s1 = { 1, 2, 3 };
struct s s2 = { 1, 2 }; /* { dg-bogus "missing initializer" } */
struct s s3[] = { { 1, 2 }, { 4, 5 } }; /* { dg-bogus "missing initializer" } */
struct s s4[] = { 1, 2, 3, 4, 5 }; /* { dg-bogus "missing initializer" } */
struct s s5[] = { 1, 2, 3, 4, 5, 6 };
/* { dg-do compile } */
/* { dg-options "-Wmissing-field-initializers" } */
struct s { int a, b, c; };
struct s s1 = { 1, 2, 3 };
struct s s2 = { 1, 2 }; /* { dg-warning "(missing initializer)|(near initialization)" } */
struct s s3[] = { { 1, 2 }, { 4, 5 } }; /* { dg-warning "(missing initializer)|(near initialization)" } */
struct s s4[] = { 1, 2, 3, 4, 5 }; /* { dg-warning "(missing initializer)|(near initialization)" } */
struct s s5[] = { 1, 2, 3, 4, 5, 6 };
/* { dg-do compile } */
/* { dg-options "-Wextra -Wno-missing-field-initializers -std=c99" } */
struct s { int a, b, c; };
struct s s1 = { 1, 2, 3 };
struct s s2 = { 1, 2 }; /* { dg-bogus "missing initializer" } */
struct s s3[] = { { 1, 2 }, { 4, 5 } }; /* { dg-bogus "missing initializer" } */
struct s s4[] = { 1, 2, 3, 4, 5 }; /* { dg-bogus "missing initializer" } */
struct s s5[] = { 1, 2, 3, 4, 5, 6 };
struct s s6 = { .a = 1 }; /* { dg-bogus "missing initializer" } */
/* { dg-do compile } */
/* { dg-options "-Wmissing-field-initializers -std=c99" } */
struct s { int a, b, c; };
struct s s1 = { 1, 2, 3 };
struct s s2 = { 1, 2 }; /* { dg-warning "(missing initializer)|(near initialization)" } */
struct s s3[] = { { 1, 2 }, { 4, 5 } }; /* { dg-warning "(missing initializer)|(near initialization)" } */
struct s s4[] = { 1, 2, 3, 4, 5 }; /* { dg-warning "(missing initializer)|(near initialization)" } */
struct s s5[] = { 1, 2, 3, 4, 5, 6 };
/* Designated initializers produce no warning. */
struct s s6 = { .a = 1 }; /* { dg-bogus "missing initializer" } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment