summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/c-family/ChangeLog23
-rw-r--r--gcc/c-family/c-common.c9
-rw-r--r--gcc/c-family/c-common.h7
-rw-r--r--gcc/c-family/c-format.c109
-rw-r--r--gcc/c-family/c-opts.c9
-rw-r--r--gcc/c-family/c.opt29
-rw-r--r--gcc/doc/invoke.texi46
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/warn-nsstring.c2
10 files changed, 122 insertions, 122 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 88f9bb92e24..38b0de87e4f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,10 @@
2012-11-07 Manuel López-Ibáñez <manu@gcc.gnu.org>
+ PR c/53063
+ * doc/invoke.texi (Wformat): Update.
+
+2012-11-07 Manuel López-Ibáñez <manu@gcc.gnu.org>
+
* optc-gen.awk: Factor code out to...
* opt-functions.awk (lang_enabled_by): ... this new function.
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog
index 9a5943b3318..937fd6d1e28 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -1,6 +1,29 @@
2012-11-07 Manuel López-Ibáñez <manu@gcc.gnu.org>
PR c/53063
+ * c.opt (Wformat): Make it Alias Wformat=1.
+ (Wformat-contains-nul,Wformat-extra-args,Wformat-nonliteral,
+ Wformat-security,Wformat-y2k,Wformat-zero-length): Use
+ LangEnabledBy.
+ (Wformat=): RejectNegative. Use LangEnabledBy.
+ (Wnonnull): Use LangEnabledBy.
+ * c-opts.c (c_common_handle_option): Do not handle Wformat here.
+ * c-format.c (set_Wformat): Delete.
+ (decode_format_attr): Replace OPT_Wformat with OPT_Wformat_.
+ (maybe_read_dollar_number): Likewise.
+ (avoid_dollar_number): Likewise.
+ (finish_dollar_format_checking): Likewise.
+ (check_format_info): Likewise.
+ (check_format_info_main): Likewise.
+ (check_format_types): Likewise.
+ (format_type_warning): Likewise.
+ * c-common.c (int): Likewise.
+ (check_function_sentinel): Likewise.
+ * c-common.h (warn_format,set_Wformat): Do not declare here.
+
+2012-11-07 Manuel López-Ibáñez <manu@gcc.gnu.org>
+
+ PR c/53063
* c.opt(Warray-bounds,Wdelete-non-virtual-dtor,Wenum-compare,
Wmain,Woverlength-strings, Wunknown-pragmas,Wunused-macros):
Use LangEnabledBy.
diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c
index f15b1d82706..c3a64653471 100644
--- a/gcc/c-family/c-common.c
+++ b/gcc/c-family/c-common.c
@@ -193,11 +193,6 @@ const char *pch_file;
user's namespace. */
int flag_iso;
-/* Warn about format/argument anomalies in calls to formatted I/O functions
- (*printf, *scanf, strftime, strfmon, etc.). */
-
-int warn_format;
-
/* C/ObjC language option variables. */
@@ -8495,7 +8490,7 @@ check_function_sentinel (const_tree fntype, int nargs, tree *argarray)
in position >= the number of fixed arguments. */
if ((nargs - 1 - pos) < len)
{
- warning (OPT_Wformat,
+ warning (OPT_Wformat_,
"not enough variable arguments to fit a sentinel");
return;
}
@@ -8510,7 +8505,7 @@ check_function_sentinel (const_tree fntype, int nargs, tree *argarray)
users to cast the NULL they have written there.
We warn with -Wstrict-null-sentinel, though. */
&& (warn_strict_null_sentinel || null_node != sentinel))
- warning (OPT_Wformat, "missing sentinel in function call");
+ warning (OPT_Wformat_, "missing sentinel in function call");
}
}
diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h
index 85ec10fbdc2..5c545f2950f 100644
--- a/gcc/c-family/c-common.h
+++ b/gcc/c-family/c-common.h
@@ -585,12 +585,6 @@ extern const char *pch_file;
extern int flag_iso;
-/* Warn about format/argument anomalies in calls to formatted I/O functions
- (*printf, *scanf, strftime, strfmon, etc.). */
-
-extern int warn_format;
-
-
/* C/ObjC language option variables. */
@@ -732,7 +726,6 @@ extern void check_function_arguments_recurse (void (*)
unsigned HOST_WIDE_INT);
extern bool check_builtin_function_arguments (tree, int, tree *);
extern void check_function_format (tree, int, tree *);
-extern void set_Wformat (int);
extern tree handle_format_attribute (tree *, tree, tree, int, bool *);
extern tree handle_format_arg_attribute (tree *, tree, tree, int, bool *);
extern bool attribute_takes_identifier_p (const_tree);
diff --git a/gcc/c-family/c-format.c b/gcc/c-family/c-format.c
index 2d1ed8176f4..7809c7ffc51 100644
--- a/gcc/c-family/c-format.c
+++ b/gcc/c-family/c-format.c
@@ -33,28 +33,7 @@ along with GCC; see the file COPYING3. If not see
#include "c-format.h"
#include "alloc-pool.h"
#include "c-target.h"
-
-/* Set format warning options according to a -Wformat=n option. */
-
-void
-set_Wformat (int setting)
-{
- warn_format = setting;
- warn_format_extra_args = setting;
- warn_format_zero_length = setting;
- warn_format_contains_nul = setting;
- if (setting != 1)
- {
- warn_format_nonliteral = setting;
- warn_format_security = setting;
- warn_format_y2k = setting;
- }
- /* Make sure not to disable -Wnonnull if -Wformat=0 is specified. */
- if (setting)
- warn_nonnull = setting;
-}
-
/* Handle attributes associated with format checking. */
/* This must be in the same order as format_types, except for
@@ -293,7 +272,7 @@ decode_format_attr (tree args, function_format_info *info, int validated_p)
&& info->format_type == gcc_objc_string_format_type)
{
gcc_assert (!validated_p);
- warning (OPT_Wformat, "%qE is only allowed in Objective-C dialects",
+ warning (OPT_Wformat_, "%qE is only allowed in Objective-C dialects",
format_type_id);
info->format_type = format_type_error;
return false;
@@ -302,7 +281,7 @@ decode_format_attr (tree args, function_format_info *info, int validated_p)
if (info->format_type == format_type_error)
{
gcc_assert (!validated_p);
- warning (OPT_Wformat, "%qE is an unrecognized format function type",
+ warning (OPT_Wformat_, "%qE is an unrecognized format function type",
format_type_id);
return false;
}
@@ -1153,7 +1132,7 @@ maybe_read_dollar_number (const char **format,
{
if (dollar_needed)
{
- warning (OPT_Wformat, "missing $ operand number in format");
+ warning (OPT_Wformat_, "missing $ operand number in format");
return -1;
}
else
@@ -1174,7 +1153,7 @@ maybe_read_dollar_number (const char **format,
{
if (dollar_needed)
{
- warning (OPT_Wformat, "missing $ operand number in format");
+ warning (OPT_Wformat_, "missing $ operand number in format");
return -1;
}
else
@@ -1183,14 +1162,14 @@ maybe_read_dollar_number (const char **format,
*format = fcp + 1;
if (pedantic && !dollar_format_warned)
{
- warning (OPT_Wformat, "%s does not support %%n$ operand number formats",
+ warning (OPT_Wformat_, "%s does not support %%n$ operand number formats",
C_STD_NAME (STD_EXT));
dollar_format_warned = 1;
}
if (overflow_flag || argnum == 0
|| (dollar_first_arg_num && argnum > dollar_arguments_count))
{
- warning (OPT_Wformat, "operand number out of range in format");
+ warning (OPT_Wformat_, "operand number out of range in format");
return -1;
}
if (argnum > dollar_max_arg_used)
@@ -1213,7 +1192,7 @@ maybe_read_dollar_number (const char **format,
&& dollar_arguments_used[argnum - 1] == 1)
{
dollar_arguments_used[argnum - 1] = 2;
- warning (OPT_Wformat, "format argument %d used more than once in %s format",
+ warning (OPT_Wformat_, "format argument %d used more than once in %s format",
argnum, fki->name);
}
else
@@ -1245,7 +1224,7 @@ avoid_dollar_number (const char *format)
format++;
if (*format == '$')
{
- warning (OPT_Wformat, "$ operand number used after format without operand number");
+ warning (OPT_Wformat_, "$ operand number used after format without operand number");
return true;
}
return false;
@@ -1275,7 +1254,7 @@ finish_dollar_format_checking (format_check_results *res, int pointer_gap_ok)
|| dollar_arguments_pointer_p[i]))
found_pointer_gap = true;
else
- warning (OPT_Wformat,
+ warning (OPT_Wformat_,
"format argument %d unused before used argument %d in $-style format",
i + 1, dollar_max_arg_used);
}
@@ -1415,10 +1394,10 @@ check_format_info (function_format_info *info, tree params)
format_types[info->format_type].name);
if (res.number_wide > 0)
- warning (OPT_Wformat, "format is a wide character string");
+ warning (OPT_Wformat_, "format is a wide character string");
if (res.number_unterminated > 0)
- warning (OPT_Wformat, "unterminated format string");
+ warning (OPT_Wformat_, "unterminated format string");
}
/* Callback from check_function_arguments_recurse to check a
@@ -1662,7 +1641,7 @@ check_format_info_main (format_check_results *res,
continue;
if (*format_chars == 0)
{
- warning (OPT_Wformat, "spurious trailing %<%%%> in format");
+ warning (OPT_Wformat_, "spurious trailing %<%%%> in format");
continue;
}
if (*format_chars == '%')
@@ -1706,7 +1685,7 @@ check_format_info_main (format_check_results *res,
*format_chars, NULL);
if (strchr (flag_chars, *format_chars) != 0)
{
- warning (OPT_Wformat, "repeated %s in format", _(s->name));
+ warning (OPT_Wformat_, "repeated %s in format", _(s->name));
}
else
{
@@ -1719,7 +1698,7 @@ check_format_info_main (format_check_results *res,
++format_chars;
if (*format_chars == 0)
{
- warning (OPT_Wformat, "missing fill character at end of strfmon format");
+ warning (OPT_Wformat_, "missing fill character at end of strfmon format");
return;
}
}
@@ -1807,7 +1786,7 @@ check_format_info_main (format_check_results *res,
}
if (found_width && !non_zero_width_char &&
(fki->flags & (int) FMT_FLAG_ZERO_WIDTH_BAD))
- warning (OPT_Wformat, "zero width in %s format", fki->name);
+ warning (OPT_Wformat_, "zero width in %s format", fki->name);
if (found_width)
{
i = strlen (flag_chars);
@@ -1825,7 +1804,7 @@ check_format_info_main (format_check_results *res,
flag_chars[i++] = fki->left_precision_char;
flag_chars[i] = 0;
if (!ISDIGIT (*format_chars))
- warning (OPT_Wformat, "empty left precision in %s format", fki->name);
+ warning (OPT_Wformat_, "empty left precision in %s format", fki->name);
while (ISDIGIT (*format_chars))
++format_chars;
}
@@ -1901,7 +1880,7 @@ check_format_info_main (format_check_results *res,
{
if (!(fki->flags & (int) FMT_FLAG_EMPTY_PREC_OK)
&& !ISDIGIT (*format_chars))
- warning (OPT_Wformat, "empty precision in %s format", fki->name);
+ warning (OPT_Wformat_, "empty precision in %s format", fki->name);
while (ISDIGIT (*format_chars))
++format_chars;
}
@@ -1969,7 +1948,7 @@ check_format_info_main (format_check_results *res,
{
/* Warn if the length modifier is non-standard. */
if (ADJ_STD (length_chars_std) > C_STD_VER)
- warning (OPT_Wformat,
+ warning (OPT_Wformat_,
"%s does not support the %qs %s length modifier",
C_STD_NAME (length_chars_std), length_chars,
fki->name);
@@ -1986,7 +1965,7 @@ check_format_info_main (format_check_results *res,
{
const format_flag_spec *s = get_flag_spec (flag_specs,
*format_chars, NULL);
- warning (OPT_Wformat, "repeated %s in format", _(s->name));
+ warning (OPT_Wformat_, "repeated %s in format", _(s->name));
}
else
{
@@ -2003,7 +1982,7 @@ check_format_info_main (format_check_results *res,
|| (!(fki->flags & (int) FMT_FLAG_FANCY_PERCENT_OK)
&& format_char == '%'))
{
- warning (OPT_Wformat, "conversion lacks type at end of format");
+ warning (OPT_Wformat_, "conversion lacks type at end of format");
continue;
}
format_chars++;
@@ -2014,17 +1993,17 @@ check_format_info_main (format_check_results *res,
if (fci->format_chars == 0)
{
if (ISGRAPH (format_char))
- warning (OPT_Wformat, "unknown conversion type character %qc in format",
+ warning (OPT_Wformat_, "unknown conversion type character %qc in format",
format_char);
else
- warning (OPT_Wformat, "unknown conversion type character 0x%x in format",
+ warning (OPT_Wformat_, "unknown conversion type character 0x%x in format",
format_char);
continue;
}
if (pedantic)
{
if (ADJ_STD (fci->std) > C_STD_VER)
- warning (OPT_Wformat, "%s does not support the %<%%%c%> %s format",
+ warning (OPT_Wformat_, "%s does not support the %<%%%c%> %s format",
C_STD_NAME (fci->std), format_char, fki->name);
}
@@ -2040,7 +2019,7 @@ check_format_info_main (format_check_results *res,
continue;
if (strchr (fci->flag_chars, flag_chars[i]) == 0)
{
- warning (OPT_Wformat, "%s used with %<%%%c%> %s format",
+ warning (OPT_Wformat_, "%s used with %<%%%c%> %s format",
_(s->name), format_char, fki->name);
d++;
continue;
@@ -2049,7 +2028,7 @@ check_format_info_main (format_check_results *res,
{
const format_flag_spec *t;
if (ADJ_STD (s->std) > C_STD_VER)
- warning (OPT_Wformat, "%s does not support %s",
+ warning (OPT_Wformat_, "%s does not support %s",
C_STD_NAME (s->std), _(s->long_name));
t = get_flag_spec (flag_specs, flag_chars[i], fci->flags2);
if (t != NULL && ADJ_STD (t->std) > ADJ_STD (s->std))
@@ -2058,7 +2037,7 @@ check_format_info_main (format_check_results *res,
? t->long_name
: s->long_name);
if (ADJ_STD (t->std) > C_STD_VER)
- warning (OPT_Wformat,
+ warning (OPT_Wformat_,
"%s does not support %s with the %<%%%c%> %s format",
C_STD_NAME (t->std), _(long_name),
format_char, fki->name);
@@ -2094,23 +2073,23 @@ check_format_info_main (format_check_results *res,
if (bad_flag_pairs[i].ignored)
{
if (bad_flag_pairs[i].predicate != 0)
- warning (OPT_Wformat,
+ warning (OPT_Wformat_,
"%s ignored with %s and %<%%%c%> %s format",
_(s->name), _(t->name), format_char,
fki->name);
else
- warning (OPT_Wformat, "%s ignored with %s in %s format",
+ warning (OPT_Wformat_, "%s ignored with %s in %s format",
_(s->name), _(t->name), fki->name);
}
else
{
if (bad_flag_pairs[i].predicate != 0)
- warning (OPT_Wformat,
+ warning (OPT_Wformat_,
"use of %s and %s together with %<%%%c%> %s format",
_(s->name), _(t->name), format_char,
fki->name);
else
- warning (OPT_Wformat, "use of %s and %s together in %s format",
+ warning (OPT_Wformat_, "use of %s and %s together in %s format",
_(s->name), _(t->name), fki->name);
}
}
@@ -2149,7 +2128,7 @@ check_format_info_main (format_check_results *res,
++format_chars;
if (*format_chars != ']')
/* The end of the format string was reached. */
- warning (OPT_Wformat, "no closing %<]%> for %<%%[%> format");
+ warning (OPT_Wformat_, "no closing %<]%> for %<%%[%> format");
}
wanted_type = 0;
@@ -2162,7 +2141,7 @@ check_format_info_main (format_check_results *res,
wanted_type_std = fci->types[length_chars_val].std;
if (wanted_type == 0)
{
- warning (OPT_Wformat,
+ warning (OPT_Wformat_,
"use of %qs length modifier with %qc type character",
length_chars, format_char);
/* Heuristic: skip one argument when an invalid length/type
@@ -2180,7 +2159,7 @@ check_format_info_main (format_check_results *res,
&& ADJ_STD (wanted_type_std) > ADJ_STD (fci->std))
{
if (ADJ_STD (wanted_type_std) > C_STD_VER)
- warning (OPT_Wformat,
+ warning (OPT_Wformat_,
"%s does not support the %<%%%s%c%> %s format",
C_STD_NAME (wanted_type_std), length_chars,
format_char, fki->name);
@@ -2198,10 +2177,10 @@ check_format_info_main (format_check_results *res,
if (main_arg_num != 0)
{
if (suppressed)
- warning (OPT_Wformat, "operand number specified with "
+ warning (OPT_Wformat_, "operand number specified with "
"suppressed assignment");
else
- warning (OPT_Wformat, "operand number specified for format "
+ warning (OPT_Wformat_, "operand number specified for format "
"taking no argument");
}
}
@@ -2219,7 +2198,7 @@ check_format_info_main (format_check_results *res,
++arg_num;
if (has_operand_number > 0)
{
- warning (OPT_Wformat, "missing $ operand number in format");
+ warning (OPT_Wformat_, "missing $ operand number in format");
return;
}
else
@@ -2355,7 +2334,7 @@ check_format_types (format_wanted_type *types)
&& i == 0
&& cur_param != 0
&& integer_zerop (cur_param))
- warning (OPT_Wformat, "writing through null pointer "
+ warning (OPT_Wformat_, "writing through null pointer "
"(argument %d)", arg_num);
/* Check for reading through a NULL pointer. */
@@ -2363,7 +2342,7 @@ check_format_types (format_wanted_type *types)
&& i == 0
&& cur_param != 0
&& integer_zerop (cur_param))
- warning (OPT_Wformat, "reading through null pointer "
+ warning (OPT_Wformat_, "reading through null pointer "
"(argument %d)", arg_num);
if (cur_param != 0 && TREE_CODE (cur_param) == ADDR_EXPR)
@@ -2383,7 +2362,7 @@ check_format_types (format_wanted_type *types)
&& (CONSTANT_CLASS_P (cur_param)
|| (DECL_P (cur_param)
&& TREE_READONLY (cur_param))))))
- warning (OPT_Wformat, "writing into constant object "
+ warning (OPT_Wformat_, "writing into constant object "
"(argument %d)", arg_num);
/* If there are extra type qualifiers beyond the first
@@ -2394,7 +2373,7 @@ check_format_types (format_wanted_type *types)
&& (TYPE_READONLY (cur_type)
|| TYPE_VOLATILE (cur_type)
|| TYPE_RESTRICT (cur_type)))
- warning (OPT_Wformat, "extra type qualifiers in format "
+ warning (OPT_Wformat_, "extra type qualifiers in format "
"argument (argument %d)",
arg_num);
@@ -2510,14 +2489,14 @@ format_type_warning (format_wanted_type *type, tree wanted_type, tree arg_type)
if (wanted_type_name)
{
if (arg_type)
- warning (OPT_Wformat, "%s %<%s%.*s%> expects argument of type %<%s%s%>, "
+ warning (OPT_Wformat_, "%s %<%s%.*s%> expects argument of type %<%s%s%>, "
"but argument %d has type %qT",
gettext (kind_descriptions[kind]),
(kind == CF_KIND_FORMAT ? "%" : ""),
format_length, format_start,
wanted_type_name, p, arg_num, arg_type);
else
- warning (OPT_Wformat, "%s %<%s%.*s%> expects a matching %<%s%s%> argument",
+ warning (OPT_Wformat_, "%s %<%s%.*s%> expects a matching %<%s%s%> argument",
gettext (kind_descriptions[kind]),
(kind == CF_KIND_FORMAT ? "%" : ""),
format_length, format_start, wanted_type_name, p);
@@ -2525,14 +2504,14 @@ format_type_warning (format_wanted_type *type, tree wanted_type, tree arg_type)
else
{
if (arg_type)
- warning (OPT_Wformat, "%s %<%s%.*s%> expects argument of type %<%T%s%>, "
+ warning (OPT_Wformat_, "%s %<%s%.*s%> expects argument of type %<%T%s%>, "
"but argument %d has type %qT",
gettext (kind_descriptions[kind]),
(kind == CF_KIND_FORMAT ? "%" : ""),
format_length, format_start,
wanted_type, p, arg_num, arg_type);
else
- warning (OPT_Wformat, "%s %<%s%.*s%> expects a matching %<%T%s%> argument",
+ warning (OPT_Wformat_, "%s %<%s%.*s%> expects a matching %<%T%s%> argument",
gettext (kind_descriptions[kind]),
(kind == CF_KIND_FORMAT ? "%" : ""),
format_length, format_start, wanted_type, p);
diff --git a/gcc/c-family/c-opts.c b/gcc/c-family/c-opts.c
index 6fedd1e7502..eb6b2d9329d 100644
--- a/gcc/c-family/c-opts.c
+++ b/gcc/c-family/c-opts.c
@@ -358,7 +358,6 @@ c_common_handle_option (size_t scode, const char *arg, int value,
case OPT_Wall:
/* ??? Don't add new options here. Use LangEnabledBy in c.opt. */
- set_Wformat (value);
cpp_opts->warn_trigraphs = value;
cpp_opts->warn_comments = value;
@@ -385,14 +384,6 @@ c_common_handle_option (size_t scode, const char *arg, int value,
cpp_opts->warn_endif_labels = value;
break;
- case OPT_Wformat:
- set_Wformat (value);
- break;
-
- case OPT_Wformat_:
- set_Wformat (atoi (arg));
- break;
-
case OPT_Winvalid_pch:
cpp_opts->warn_invalid_pch = value;
break;
diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt
index 90082143ae1..e11aef7a365 100644
--- a/gcc/c-family/c.opt
+++ b/gcc/c-family/c.opt
@@ -381,35 +381,36 @@ C ObjC C++ ObjC++ Var(warn_float_equal) Warning
Warn if testing floating point numbers for equality
Wformat
-C ObjC C++ ObjC++ Warning
+C ObjC C++ ObjC++ Warning Alias(Wformat=, 1, 0)
Warn about printf/scanf/strftime/strfmon format string anomalies
+Wformat-contains-nul
+C ObjC C++ ObjC++ Var(warn_format_contains_nul) Warning LangEnabledBy(C ObjC C++ ObjC++,Wformat=, warn_format >= 1, 0)
+Warn about format strings that contain NUL bytes
+
Wformat-extra-args
-C ObjC C++ ObjC++ Var(warn_format_extra_args) Warning
+C ObjC C++ ObjC++ Var(warn_format_extra_args) Warning LangEnabledBy(C ObjC C++ ObjC++,Wformat=, warn_format >= 1, 0)
Warn if passing too many arguments to a function for its format string
Wformat-nonliteral
-C ObjC C++ ObjC++ Var(warn_format_nonliteral) Warning
+C ObjC C++ ObjC++ Var(warn_format_nonliteral) Warning LangEnabledBy(C ObjC C++ ObjC++,Wformat=, warn_format >= 2, 0)
Warn about format strings that are not literals
-Wformat-contains-nul
-C ObjC C++ ObjC++ Var(warn_format_contains_nul) Warning
-Warn about format strings that contain NUL bytes
-
Wformat-security
-C ObjC C++ ObjC++ Var(warn_format_security) Warning
+C ObjC C++ ObjC++ Var(warn_format_security) Warning LangEnabledBy(C ObjC C++ ObjC++,Wformat=, warn_format >= 2, 0)
Warn about possible security problems with format functions
Wformat-y2k
-C ObjC C++ ObjC++ Var(warn_format_y2k) Warning
+C ObjC C++ ObjC++ Var(warn_format_y2k) Warning LangEnabledBy(C ObjC C++ ObjC++,Wformat=,warn_format >= 2, 0)
Warn about strftime formats yielding 2-digit years
Wformat-zero-length
-C ObjC C++ ObjC++ Var(warn_format_zero_length) Warning
+C ObjC C++ ObjC++ Var(warn_format_zero_length) Warning LangEnabledBy(C ObjC C++ ObjC++,Wformat=,warn_format >= 1, 0)
Warn about zero-length formats
Wformat=
-C ObjC C++ ObjC++ Joined Warning
+C ObjC C++ ObjC++ Joined RejectNegative UInteger Var(warn_format) Warning LangEnabledBy(C ObjC C++ ObjC++,Wall, 1, 0)
+Warn about printf/scanf/strftime/strfmon format string anomalies
Wignored-qualifiers
C C++ Var(warn_ignored_qualifiers) Warning EnabledBy(Wextra)
@@ -558,9 +559,13 @@ C++ ObjC++ Var(warn_nonvdtor) Warning
Warn about non-virtual destructors
Wnonnull
-C ObjC C++ ObjC++ Var(warn_nonnull) Warning
+C ObjC C++ ObjC++ Var(warn_nonnull) Warning LangEnabledBy(C ObjC C++ ObjC++,Wformat=,warn_format >= 1,0)
Warn about NULL being passed to argument slots marked as requiring non-NULL
+Wnonnull
+C ObjC C++ ObjC++ LangEnabledBy(C ObjC C++ ObjC++,Wall)
+;
+
Wnormalized=
C ObjC C++ ObjC++ Joined Warning
-Wnormalized=<id|nfc|nfkc> Warn about non-normalised Unicode strings
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 55f72297ea0..31f16330245 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -3241,10 +3241,12 @@ the compiler performs the entire computation with @code{double}
because the floating-point literal is a @code{double}.
@item -Wformat
+@itemx -Wformat=@var{n}
@opindex Wformat
@opindex Wno-format
@opindex ffreestanding
@opindex fno-builtin
+@opindex Wformat=
Check calls to @code{printf} and @code{scanf}, etc., to make sure that
the arguments supplied have types appropriate to the format string
specified, and that the conversions specified in the format string make
@@ -3268,20 +3270,17 @@ in the selected standard version (but not for @code{strfmon} formats,
since those are not in any version of the C standard). @xref{C Dialect
Options,,Options Controlling C Dialect}.
-Since @option{-Wformat} also checks for null format arguments for
-several functions, @option{-Wformat} also implies @option{-Wnonnull}.
-
-@option{-Wformat} is included in @option{-Wall}. For more control over some
-aspects of format checking, the options @option{-Wformat-y2k},
-@option{-Wno-format-extra-args}, @option{-Wno-format-zero-length},
-@option{-Wformat-nonliteral}, @option{-Wformat-security}, and
-@option{-Wformat=2} are available, but are not included in @option{-Wall}.
-
-@item -Wformat-y2k
-@opindex Wformat-y2k
-@opindex Wno-format-y2k
-If @option{-Wformat} is specified, also warn about @code{strftime}
-formats that may yield only a two-digit year.
+@table @gcctabopt
+@item -Wformat=1
+@itemx -Wformat
+Option @option{-Wformat} is equivalent to @option{-Wformat=1}, and
+@option{-Wno-format} is equivalent to @option{-Wformat=0}. Since
+@option{-Wformat} also checks for null format arguments for several
+functions, @option{-Wformat} also implies @option{-Wnonnull}. Some
+aspects of this level of format checking can be disabled by the
+options: @option{-Wno-format-contains-nul},
+@option{-Wno-format-extra-args}, and @option{-Wno-format-zero-length}.
+@option{-Wformat} is enabled by @option{-Wall}.
@item -Wno-format-contains-nul
@opindex Wno-format-contains-nul
@@ -3310,6 +3309,12 @@ Unix Specification says that such unused arguments are allowed.
If @option{-Wformat} is specified, do not warn about zero-length formats.
The C standard specifies that zero-length formats are allowed.
+
+@item -Wformat=2
+Enable @option{-Wformat} plus additional format checks. Currently
+equivalent to @option{-Wformat -Wformat-nonliteral -Wformat-security
+-Wformat-y2k}.
+
@item -Wformat-nonliteral
@opindex Wformat-nonliteral
@opindex Wno-format-nonliteral
@@ -3330,12 +3335,12 @@ currently a subset of what @option{-Wformat-nonliteral} warns about, but
in future warnings may be added to @option{-Wformat-security} that are not
included in @option{-Wformat-nonliteral}.)
-@item -Wformat=2
-@opindex Wformat=2
-@opindex Wno-format=2
-Enable @option{-Wformat} plus format checks not included in
-@option{-Wformat}. Currently equivalent to @option{-Wformat
--Wformat-nonliteral -Wformat-security -Wformat-y2k}.
+@item -Wformat-y2k
+@opindex Wformat-y2k
+@opindex Wno-format-y2k
+If @option{-Wformat} is specified, also warn about @code{strftime}
+formats that may yield only a two-digit year.
+@end table
@item -Wnonnull
@opindex Wnonnull
@@ -3796,7 +3801,6 @@ It is equivalent to @option{-Wstrict-aliasing=3}
@item -Wstrict-aliasing=n
@opindex Wstrict-aliasing=n
-@opindex Wno-strict-aliasing=n
This option is only active when @option{-fstrict-aliasing} is active.
It warns about code that might break the strict aliasing rules that the
compiler is using for optimization.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7c2d5dfa39a..6a235e0568a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2012-11-07 Manuel López-Ibáñez <manu@gcc.gnu.org>
+ PR c/53063
+ * gcc.dg/warn-nsstring.c: Use -Wformat explicitly.
+
+2012-11-07 Manuel López-Ibáñez <manu@gcc.gnu.org>
+
PR c/51294
* c-c++-common/pr51294.c: New.
diff --git a/gcc/testsuite/gcc.dg/warn-nsstring.c b/gcc/testsuite/gcc.dg/warn-nsstring.c
index 3795fb7376b..600ff34d936 100644
--- a/gcc/testsuite/gcc.dg/warn-nsstring.c
+++ b/gcc/testsuite/gcc.dg/warn-nsstring.c
@@ -1,6 +1,6 @@
/* Check that the NSString format extension is rejected in c. */
/* { dg-do compile } */
-
+/* { dg-options "-Wformat" } */
extern void NSLog (void *fmt, ...) __attribute__((format(__NSString__, 1, 2))); /* { dg-warning "is only allowed in Objective-C dialects" } */
extern void NSLog1 (void *fmt, ...) __attribute__((format(NSString, 1, 2))); /* { dg-warning "is only allowed in Objective-C dialects" } */