aboutsummaryrefslogtreecommitdiff
path: root/gcc/c-format.c
diff options
context:
space:
mode:
authorJoseph Myers <jsm@polyomino.org.uk>2004-05-15 01:44:02 +0100
committerJoseph Myers <jsm28@gcc.gnu.org>2004-05-15 01:44:02 +0100
commite9a757769b395ef082be82777e68bfe8a8a79f90 (patch)
tree5a17c82d4a869e1134d2e5c2dbe9cf8ab06adb7d /gcc/c-format.c
parent5c3be6fdb01517c31d6a64e675bc9b52d3d7633b (diff)
downloadgcc-e9a757769b395ef082be82777e68bfe8a8a79f90.zip
gcc-e9a757769b395ef082be82777e68bfe8a8a79f90.tar.gz
gcc-e9a757769b395ef082be82777e68bfe8a8a79f90.tar.bz2
re PR c/15444 (Bad warning message in printf format checking)
PR c/15444 * c-format.c (avoid_dollar_number): New function. (check_format_info_main): Call avoid_dollar_number when operand numbers might occur but has_operand_number == 0. testsuite: * gcc.dg/format/xopen-1.c: Adjust expected message. * gcc.dg/format/xopen-3.c: New test. From-SVN: r81871
Diffstat (limited to 'gcc/c-format.c')
-rw-r--r--gcc/c-format.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/gcc/c-format.c b/gcc/c-format.c
index 17ef68a..c4a6ece 100644
--- a/gcc/c-format.c
+++ b/gcc/c-format.c
@@ -1023,6 +1023,7 @@ static void status_warning (int *, const char *, ...)
static void init_dollar_format_checking (int, tree);
static int maybe_read_dollar_number (int *, const char **, int,
tree, tree *, const format_kind_info *);
+static bool avoid_dollar_number (int *, const char *);
static void finish_dollar_format_checking (int *, format_check_results *, int);
static const format_flag_spec *get_flag_spec (const format_flag_spec *,
@@ -1304,6 +1305,26 @@ maybe_read_dollar_number (int *status, const char **format,
return argnum;
}
+/* Ensure that FORMAT does not start with a decimal number followed by
+ a $; give a diagnostic and return true if it does, false otherwise. */
+
+static bool
+avoid_dollar_number (int *status, const char *format)
+{
+ if (!ISDIGIT (*format))
+ return false;
+ while (ISDIGIT (*format))
+ format++;
+ if (*format == '$')
+ {
+ status_warning (status,
+ "$ operand number used after format"
+ " without operand number");
+ return true;
+ }
+ return false;
+}
+
/* Finish the checking for a format string that used $ operand number formats
instead of non-$ formats. We check for unused operands before used ones
@@ -1721,6 +1742,11 @@ check_format_info_main (int *status, format_check_results *res,
main_arg_num = opnum + info->first_arg_num - 1;
}
}
+ else if (fki->flags & FMT_FLAG_USE_DOLLAR)
+ {
+ if (avoid_dollar_number (status, format_chars))
+ return;
+ }
/* Read any format flags, but do not yet validate them beyond removing
duplicates, since in general validation depends on the rest of
@@ -1780,6 +1806,11 @@ check_format_info_main (int *status, format_check_results *res,
else
has_operand_number = 0;
}
+ else
+ {
+ if (avoid_dollar_number (status, format_chars))
+ return;
+ }
if (info->first_arg_num != 0)
{
if (params == 0)
@@ -1879,6 +1910,11 @@ check_format_info_main (int *status, format_check_results *res,
else
has_operand_number = 0;
}
+ else
+ {
+ if (avoid_dollar_number (status, format_chars))
+ return;
+ }
if (info->first_arg_num != 0)
{
if (params == 0)