mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-19 08:30:28 +08:00
intl.h (open_quote, [...]): New.
* intl.h (open_quote, close_quote): New. * intl.c (open_quote, close_quote): New. (gcc_init_libintl): Set them. * pretty-print.c: Include "intl.h". (pp_base_format_text): Support 'q' format flag and %` and %' formats. Use ' instead of ` in comments. * c-format.c (gcc_diag_flag_specs, gcc_cxxdiag_flag_specs, gcc_diag_char_table, gcc_cdiag_char_table, gcc_cxxdiag_char_table, foramt_types_orig): Describe these new formats. (decode_format_attr, check_function_format, check_format_info_main): Use these new formats. (status_warning): Use ATTRIBUTE_GCC_DIAG. * toplev.c (ATTRIBUTE_GCC_DIAG): Increase required GCC version to check these formats to 3.5. From-SVN: r82215
This commit is contained in:
parent
1bfc8f675b
commit
a668adb2f3
@ -1,3 +1,20 @@
|
||||
2004-05-24 Joseph S. Myers <jsm@polyomino.org.uk>
|
||||
|
||||
* intl.h (open_quote, close_quote): New.
|
||||
* intl.c (open_quote, close_quote): New.
|
||||
(gcc_init_libintl): Set them.
|
||||
* pretty-print.c: Include "intl.h".
|
||||
(pp_base_format_text): Support 'q' format flag and %` and %'
|
||||
formats. Use ' instead of ` in comments.
|
||||
* c-format.c (gcc_diag_flag_specs, gcc_cxxdiag_flag_specs,
|
||||
gcc_diag_char_table, gcc_cdiag_char_table, gcc_cxxdiag_char_table,
|
||||
foramt_types_orig): Describe these new formats.
|
||||
(decode_format_attr, check_function_format,
|
||||
check_format_info_main): Use these new formats.
|
||||
(status_warning): Use ATTRIBUTE_GCC_DIAG.
|
||||
* toplev.c (ATTRIBUTE_GCC_DIAG): Increase required GCC version to
|
||||
check these formats to 3.5.
|
||||
|
||||
2004-05-24 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
|
||||
|
||||
* Makefile.in (CPPLIBS): Renamed to CPPLIB.
|
||||
|
104
gcc/c-format.c
104
gcc/c-format.c
@ -200,7 +200,7 @@ decode_format_attr (tree args, function_format_info *info, int validated_p)
|
||||
{
|
||||
if (validated_p)
|
||||
abort ();
|
||||
warning ("`%s' is an unrecognized format function type", p);
|
||||
warning ("%qs is an unrecognized format function type", p);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -615,6 +615,7 @@ static const format_flag_pair gcc_diag_flag_pairs[] =
|
||||
|
||||
static const format_flag_spec gcc_diag_flag_specs[] =
|
||||
{
|
||||
{ 'q', 0, 0, N_("`q' flag"), N_("the `q' diagnostic flag"), STD_C89 },
|
||||
{ 'p', 0, 0, N_("precision"), N_("precision in printf format"), STD_C89 },
|
||||
{ 'L', 0, 0, N_("length modifier"), N_("length modifier in printf format"), STD_C89 },
|
||||
{ 0, 0, 0, NULL, NULL, 0 }
|
||||
@ -626,6 +627,7 @@ static const format_flag_spec gcc_cxxdiag_flag_specs[] =
|
||||
{
|
||||
{ '+', 0, 0, N_("`+' flag"), N_("the `+' printf flag"), STD_C89 },
|
||||
{ '#', 0, 0, N_("`#' flag"), N_("the `#' printf flag"), STD_C89 },
|
||||
{ 'q', 0, 0, N_("`q' flag"), N_("the `q' diagnostic flag"), STD_C89 },
|
||||
{ 'p', 0, 0, N_("precision"), N_("precision in printf format"), STD_C89 },
|
||||
{ 'L', 0, 0, N_("length modifier"), N_("length modifier in printf format"), STD_C89 },
|
||||
{ 0, 0, 0, NULL, NULL, 0 }
|
||||
@ -798,69 +800,75 @@ static const format_char_info asm_fprintf_char_table[] =
|
||||
static const format_char_info gcc_diag_char_table[] =
|
||||
{
|
||||
/* C89 conversion specifiers. */
|
||||
{ "di", 0, STD_C89, { T89_I, BADLEN, BADLEN, T89_L, T9L_LL, BADLEN, BADLEN, BADLEN, BADLEN }, "", "" },
|
||||
{ "ox", 0, STD_C89, { T89_UI, BADLEN, BADLEN, T89_UL, T9L_ULL, BADLEN, BADLEN, BADLEN, BADLEN }, "", "" },
|
||||
{ "u", 0, STD_C89, { T89_UI, BADLEN, BADLEN, T89_UL, T9L_ULL, BADLEN, BADLEN, BADLEN, BADLEN }, "", "" },
|
||||
{ "c", 0, STD_C89, { T89_I, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "" },
|
||||
{ "s", 1, STD_C89, { T89_C, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "p", "cR" },
|
||||
{ "p", 1, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "c" },
|
||||
{ "di", 0, STD_C89, { T89_I, BADLEN, BADLEN, T89_L, T9L_LL, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "" },
|
||||
{ "ox", 0, STD_C89, { T89_UI, BADLEN, BADLEN, T89_UL, T9L_ULL, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "" },
|
||||
{ "u", 0, STD_C89, { T89_UI, BADLEN, BADLEN, T89_UL, T9L_ULL, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "" },
|
||||
{ "c", 0, STD_C89, { T89_I, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "" },
|
||||
{ "s", 1, STD_C89, { T89_C, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "pq", "cR" },
|
||||
{ "p", 1, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "c" },
|
||||
|
||||
/* Custom conversion specifiers. */
|
||||
|
||||
/* %H will require "location_t" at runtime. */
|
||||
{ "H", 0, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "" },
|
||||
{ "H", 0, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "" },
|
||||
|
||||
/* These will require a "tree" at runtime. */
|
||||
{ "J", 0, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "" },
|
||||
{ "J", 0, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "" },
|
||||
|
||||
{ "m", 0, STD_C89, NOARGUMENTS, "", "" },
|
||||
{ "`", 0, STD_C89, NOARGUMENTS, "", "" },
|
||||
{ "'", 0, STD_C89, NOARGUMENTS, "", "" },
|
||||
{ "m", 0, STD_C89, NOARGUMENTS, "q", "" },
|
||||
{ NULL, 0, 0, NOLENGTHS, NULL, NULL }
|
||||
};
|
||||
|
||||
static const format_char_info gcc_cdiag_char_table[] =
|
||||
{
|
||||
/* C89 conversion specifiers. */
|
||||
{ "di", 0, STD_C89, { T89_I, BADLEN, BADLEN, T89_L, T9L_LL, BADLEN, BADLEN, BADLEN, BADLEN }, "", "" },
|
||||
{ "ox", 0, STD_C89, { T89_UI, BADLEN, BADLEN, T89_UL, T9L_ULL, BADLEN, BADLEN, BADLEN, BADLEN }, "", "" },
|
||||
{ "u", 0, STD_C89, { T89_UI, BADLEN, BADLEN, T89_UL, T9L_ULL, BADLEN, BADLEN, BADLEN, BADLEN }, "", "" },
|
||||
{ "c", 0, STD_C89, { T89_I, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "" },
|
||||
{ "s", 1, STD_C89, { T89_C, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "p", "cR" },
|
||||
{ "p", 1, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "c" },
|
||||
{ "di", 0, STD_C89, { T89_I, BADLEN, BADLEN, T89_L, T9L_LL, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "" },
|
||||
{ "ox", 0, STD_C89, { T89_UI, BADLEN, BADLEN, T89_UL, T9L_ULL, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "" },
|
||||
{ "u", 0, STD_C89, { T89_UI, BADLEN, BADLEN, T89_UL, T9L_ULL, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "" },
|
||||
{ "c", 0, STD_C89, { T89_I, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "" },
|
||||
{ "s", 1, STD_C89, { T89_C, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "pq", "cR" },
|
||||
{ "p", 1, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "c" },
|
||||
|
||||
/* Custom conversion specifiers. */
|
||||
|
||||
/* %H will require "location_t" at runtime. */
|
||||
{ "H", 0, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "" },
|
||||
{ "H", 0, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "" },
|
||||
|
||||
/* These will require a "tree" at runtime. */
|
||||
{ "DEFJT", 0, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "" },
|
||||
{ "DEFJT", 0, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "" },
|
||||
|
||||
{ "m", 0, STD_C89, NOARGUMENTS, "", "" },
|
||||
{ "`", 0, STD_C89, NOARGUMENTS, "", "" },
|
||||
{ "'", 0, STD_C89, NOARGUMENTS, "", "" },
|
||||
{ "m", 0, STD_C89, NOARGUMENTS, "q", "" },
|
||||
{ NULL, 0, 0, NOLENGTHS, NULL, NULL }
|
||||
};
|
||||
|
||||
static const format_char_info gcc_cxxdiag_char_table[] =
|
||||
{
|
||||
/* C89 conversion specifiers. */
|
||||
{ "di", 0, STD_C89, { T89_I, BADLEN, BADLEN, T89_L, T9L_LL, BADLEN, BADLEN, BADLEN, BADLEN }, "", "" },
|
||||
{ "ox", 0, STD_C89, { T89_UI, BADLEN, BADLEN, T89_UL, T9L_ULL, BADLEN, BADLEN, BADLEN, BADLEN }, "", "" },
|
||||
{ "u", 0, STD_C89, { T89_UI, BADLEN, BADLEN, T89_UL, T9L_ULL, BADLEN, BADLEN, BADLEN, BADLEN }, "", "" },
|
||||
{ "c", 0, STD_C89, { T89_I, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "" },
|
||||
{ "s", 1, STD_C89, { T89_C, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "p", "cR" },
|
||||
{ "p", 1, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "c" },
|
||||
{ "di", 0, STD_C89, { T89_I, BADLEN, BADLEN, T89_L, T9L_LL, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "" },
|
||||
{ "ox", 0, STD_C89, { T89_UI, BADLEN, BADLEN, T89_UL, T9L_ULL, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "" },
|
||||
{ "u", 0, STD_C89, { T89_UI, BADLEN, BADLEN, T89_UL, T9L_ULL, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "" },
|
||||
{ "c", 0, STD_C89, { T89_I, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "" },
|
||||
{ "s", 1, STD_C89, { T89_C, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "pq", "cR" },
|
||||
{ "p", 1, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "c" },
|
||||
|
||||
/* Custom conversion specifiers. */
|
||||
|
||||
/* %H will require "location_t" at runtime. */
|
||||
{ "H", 0, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "" },
|
||||
{ "H", 0, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "" },
|
||||
|
||||
/* These will require a "tree" at runtime. */
|
||||
{ "ADEFJTV",0,STD_C89,{ T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "+#", "" },
|
||||
{ "ADEFJTV",0,STD_C89,{ T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q+#", "" },
|
||||
|
||||
/* These accept either an `int' or an `enum tree_code' (which is handled as an `int'.) */
|
||||
{ "CLOPQ",0,STD_C89, { T89_I, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "" },
|
||||
{ "CLOPQ",0,STD_C89, { T89_I, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "" },
|
||||
|
||||
{ "m", 0, STD_C89, NOARGUMENTS, "", "" },
|
||||
{ "`", 0, STD_C89, NOARGUMENTS, "", "" },
|
||||
{ "'", 0, STD_C89, NOARGUMENTS, "", "" },
|
||||
{ "m", 0, STD_C89, NOARGUMENTS, "q", "" },
|
||||
{ NULL, 0, 0, NOLENGTHS, NULL, NULL }
|
||||
};
|
||||
|
||||
@ -933,19 +941,19 @@ static const format_kind_info format_types_orig[] =
|
||||
'w', 0, 'p', 0, 'L',
|
||||
NULL, NULL
|
||||
},
|
||||
{ "gcc_diag", gcc_diag_length_specs, gcc_diag_char_table, "", NULL,
|
||||
{ "gcc_diag", gcc_diag_length_specs, gcc_diag_char_table, "q", NULL,
|
||||
gcc_diag_flag_specs, gcc_diag_flag_pairs,
|
||||
FMT_FLAG_ARG_CONVERT,
|
||||
0, 0, 'p', 0, 'L',
|
||||
NULL, &integer_type_node
|
||||
},
|
||||
{ "gcc_cdiag", gcc_cdiag_length_specs, gcc_cdiag_char_table, "", NULL,
|
||||
{ "gcc_cdiag", gcc_cdiag_length_specs, gcc_cdiag_char_table, "q", NULL,
|
||||
gcc_cdiag_flag_specs, gcc_cdiag_flag_pairs,
|
||||
FMT_FLAG_ARG_CONVERT,
|
||||
0, 0, 'p', 0, 'L',
|
||||
NULL, &integer_type_node
|
||||
},
|
||||
{ "gcc_cxxdiag", gcc_cxxdiag_length_specs, gcc_cxxdiag_char_table, "+#", NULL,
|
||||
{ "gcc_cxxdiag", gcc_cxxdiag_length_specs, gcc_cxxdiag_char_table, "q+#", NULL,
|
||||
gcc_cxxdiag_flag_specs, gcc_cxxdiag_flag_pairs,
|
||||
FMT_FLAG_ARG_CONVERT,
|
||||
0, 0, 'p', 0, 'L',
|
||||
@ -1018,7 +1026,7 @@ static void check_format_info_main (int *, format_check_results *,
|
||||
const char *, int, tree,
|
||||
unsigned HOST_WIDE_INT);
|
||||
static void status_warning (int *, const char *, ...)
|
||||
ATTRIBUTE_PRINTF_2;
|
||||
ATTRIBUTE_GCC_DIAG(2, 3);
|
||||
|
||||
static void init_dollar_format_checking (int, tree);
|
||||
static int maybe_read_dollar_number (int *, const char **, int,
|
||||
@ -1105,7 +1113,7 @@ check_function_format (int *status, tree attrs, tree params)
|
||||
break;
|
||||
}
|
||||
if (args != 0)
|
||||
warning ("function might be possible candidate for `%s' format attribute",
|
||||
warning ("function might be possible candidate for %qs format attribute",
|
||||
format_types[info.format_type].name);
|
||||
}
|
||||
}
|
||||
@ -1699,7 +1707,7 @@ check_format_info_main (int *status, format_check_results *res,
|
||||
if (*format_chars == 0)
|
||||
{
|
||||
if (format_chars - orig_format_chars != format_length)
|
||||
status_warning (status, "embedded `\\0' in format");
|
||||
status_warning (status, "embedded %`\\0%' in format");
|
||||
if (info->first_arg_num != 0 && params != 0
|
||||
&& has_operand_number <= 0)
|
||||
{
|
||||
@ -1714,7 +1722,7 @@ check_format_info_main (int *status, format_check_results *res,
|
||||
continue;
|
||||
if (*format_chars == 0)
|
||||
{
|
||||
status_warning (status, "spurious trailing `%%' in format");
|
||||
status_warning (status, "spurious trailing %`%%%' in format");
|
||||
continue;
|
||||
}
|
||||
if (*format_chars == '%')
|
||||
@ -1989,7 +1997,7 @@ check_format_info_main (int *status, format_check_results *res,
|
||||
{
|
||||
/* Warn if the length modifier is non-standard. */
|
||||
if (ADJ_STD (length_chars_std) > C_STD_VER)
|
||||
status_warning (status, "%s does not support the `%s' %s length modifier",
|
||||
status_warning (status, "%s does not support the %qs %s length modifier",
|
||||
C_STD_NAME (length_chars_std), length_chars,
|
||||
fki->name);
|
||||
}
|
||||
@ -2050,7 +2058,7 @@ check_format_info_main (int *status, format_check_results *res,
|
||||
if (fci->format_chars == 0)
|
||||
{
|
||||
if (ISGRAPH(format_char))
|
||||
status_warning (status, "unknown conversion type character `%c' in format",
|
||||
status_warning (status, "unknown conversion type character %qc in format",
|
||||
format_char);
|
||||
else
|
||||
status_warning (status, "unknown conversion type character 0x%x in format",
|
||||
@ -2060,7 +2068,7 @@ check_format_info_main (int *status, format_check_results *res,
|
||||
if (pedantic)
|
||||
{
|
||||
if (ADJ_STD (fci->std) > C_STD_VER)
|
||||
status_warning (status, "%s does not support the `%%%c' %s format",
|
||||
status_warning (status, "%s does not support the %`%%%c%' %s format",
|
||||
C_STD_NAME (fci->std), format_char, fki->name);
|
||||
}
|
||||
|
||||
@ -2076,7 +2084,7 @@ check_format_info_main (int *status, format_check_results *res,
|
||||
continue;
|
||||
if (strchr (fci->flag_chars, flag_chars[i]) == 0)
|
||||
{
|
||||
status_warning (status, "%s used with `%%%c' %s format",
|
||||
status_warning (status, "%s used with %`%%%c%' %s format",
|
||||
_(s->name), format_char, fki->name);
|
||||
d++;
|
||||
continue;
|
||||
@ -2094,7 +2102,7 @@ check_format_info_main (int *status, format_check_results *res,
|
||||
? t->long_name
|
||||
: s->long_name);
|
||||
if (ADJ_STD (t->std) > C_STD_VER)
|
||||
status_warning (status, "%s does not support %s with the `%%%c' %s format",
|
||||
status_warning (status, "%s does not support %s with the %`%%%c%' %s format",
|
||||
C_STD_NAME (t->std), _(long_name),
|
||||
format_char, fki->name);
|
||||
}
|
||||
@ -2127,7 +2135,7 @@ check_format_info_main (int *status, format_check_results *res,
|
||||
if (bad_flag_pairs[i].ignored)
|
||||
{
|
||||
if (bad_flag_pairs[i].predicate != 0)
|
||||
status_warning (status, "%s ignored with %s and `%%%c' %s format",
|
||||
status_warning (status, "%s ignored with %s and %`%%%c%' %s format",
|
||||
_(s->name), _(t->name), format_char,
|
||||
fki->name);
|
||||
else
|
||||
@ -2137,7 +2145,7 @@ check_format_info_main (int *status, format_check_results *res,
|
||||
else
|
||||
{
|
||||
if (bad_flag_pairs[i].predicate != 0)
|
||||
status_warning (status, "use of %s and %s together with `%%%c' %s format",
|
||||
status_warning (status, "use of %s and %s together with %`%%%c%' %s format",
|
||||
_(s->name), _(t->name), format_char,
|
||||
fki->name);
|
||||
else
|
||||
@ -2160,10 +2168,10 @@ check_format_info_main (int *status, format_check_results *res,
|
||||
else if (strchr (fci->flags2, '2') != 0)
|
||||
y2k_level = 2;
|
||||
if (y2k_level == 3)
|
||||
status_warning (status, "`%%%c' yields only last 2 digits of year in some locales",
|
||||
status_warning (status, "%`%%%c%' yields only last 2 digits of year in some locales",
|
||||
format_char);
|
||||
else if (y2k_level == 2)
|
||||
status_warning (status, "`%%%c' yields only last 2 digits of year", format_char);
|
||||
status_warning (status, "%`%%%c%' yields only last 2 digits of year", format_char);
|
||||
}
|
||||
|
||||
if (strchr (fci->flags2, '[') != 0)
|
||||
@ -2179,7 +2187,7 @@ check_format_info_main (int *status, format_check_results *res,
|
||||
++format_chars;
|
||||
if (*format_chars != ']')
|
||||
/* The end of the format string was reached. */
|
||||
status_warning (status, "no closing `]' for `%%[' format");
|
||||
status_warning (status, "no closing %`]%' for %`%%[%' format");
|
||||
}
|
||||
|
||||
wanted_type = 0;
|
||||
@ -2192,7 +2200,7 @@ check_format_info_main (int *status, format_check_results *res,
|
||||
wanted_type_std = fci->types[length_chars_val].std;
|
||||
if (wanted_type == 0)
|
||||
{
|
||||
status_warning (status, "use of `%s' length modifier with `%c' type character",
|
||||
status_warning (status, "use of %qs length modifier with %qc type character",
|
||||
length_chars, format_char);
|
||||
/* Heuristic: skip one argument when an invalid length/type
|
||||
combination is encountered. */
|
||||
@ -2213,7 +2221,7 @@ check_format_info_main (int *status, format_check_results *res,
|
||||
&& ADJ_STD (wanted_type_std) > ADJ_STD (fci->std))
|
||||
{
|
||||
if (ADJ_STD (wanted_type_std) > C_STD_VER)
|
||||
status_warning (status, "%s does not support the `%%%s%c' %s format",
|
||||
status_warning (status, "%s does not support the %`%%%s%c%' %s format",
|
||||
C_STD_NAME (wanted_type_std), length_chars,
|
||||
format_char, fki->name);
|
||||
}
|
||||
|
39
gcc/intl.c
39
gcc/intl.c
@ -1,5 +1,5 @@
|
||||
/* Message translation utilities.
|
||||
Copyright (C) 2001, 2003 Free Software Foundation, Inc.
|
||||
Copyright (C) 2001, 2003, 2004 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC.
|
||||
|
||||
@ -24,6 +24,16 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||
#include "tm.h"
|
||||
#include "intl.h"
|
||||
|
||||
#ifdef HAVE_LANGINFO_CODESET
|
||||
#include <langinfo.h>
|
||||
#endif
|
||||
|
||||
/* Opening quotation mark for diagnostics. */
|
||||
const char *open_quote = "'";
|
||||
|
||||
/* Closing quotation mark for diagnostics. */
|
||||
const char *close_quote = "'";
|
||||
|
||||
#ifdef ENABLE_NLS
|
||||
|
||||
/* Initialize the translation library for GCC. This performs the
|
||||
@ -43,6 +53,33 @@ gcc_init_libintl (void)
|
||||
|
||||
(void) bindtextdomain ("gcc", LOCALEDIR);
|
||||
(void) textdomain ("gcc");
|
||||
|
||||
/* Opening quotation mark. */
|
||||
open_quote = _("`");
|
||||
|
||||
/* Closing quotation mark. */
|
||||
close_quote = _("'");
|
||||
|
||||
if (!strcmp (open_quote, "`") && !strcmp (close_quote, "'"))
|
||||
{
|
||||
#if defined HAVE_LANGINFO_CODESET
|
||||
const char *encoding;
|
||||
#endif
|
||||
/* Untranslated quotes that it may be possible to replace with
|
||||
U+2018 and U+2019; but otherwise use "'" instead of "`" as
|
||||
opening quote. */
|
||||
open_quote = "'";
|
||||
#if defined HAVE_LANGINFO_CODESET
|
||||
encoding = nl_langinfo (CODESET);
|
||||
if (encoding != NULL
|
||||
&& (!strcasecmp (encoding, "utf-8")
|
||||
|| !strcasecmp (encoding, "utf8")))
|
||||
{
|
||||
open_quote = "\xe2\x80\x98";
|
||||
close_quote = "\xe2\x80\x99";
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
#if defined HAVE_WCHAR_H && defined HAVE_WORKING_MBSTOWCS && defined HAVE_WCSWIDTH
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* intl.h - internationalization
|
||||
Copyright 1998, 2001, 2003 Free Software Foundation, Inc.
|
||||
Copyright 1998, 2001, 2003, 2004 Free Software Foundation, Inc.
|
||||
|
||||
GCC is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@ -51,4 +51,7 @@ extern size_t gcc_gettext_width (const char *);
|
||||
# define N_(msgid) msgid
|
||||
#endif
|
||||
|
||||
extern const char *open_quote;
|
||||
extern const char *close_quote;
|
||||
|
||||
#endif /* intl.h */
|
||||
|
@ -24,6 +24,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||
#undef FFS /* Some systems define this in param.h. */
|
||||
#include "system.h"
|
||||
#include "coretypes.h"
|
||||
#include "intl.h"
|
||||
#include "pretty-print.h"
|
||||
|
||||
#define obstack_chunk_alloc xmalloc
|
||||
@ -177,9 +178,12 @@ pp_base_indent (pretty_printer *pp)
|
||||
%s: string.
|
||||
%p: pointer.
|
||||
%m: strerror(text->err_no) - does not consume a value from args_ptr.
|
||||
%%: `%'.
|
||||
%%: '%'.
|
||||
%`: opening quote.
|
||||
%': closing quote.
|
||||
%.*s: a substring the length of which is specified by an integer.
|
||||
%H: location_t. */
|
||||
%H: location_t.
|
||||
Flag 'q': quote formatted text (must come immediately after '%'). */
|
||||
void
|
||||
pp_base_format_text (pretty_printer *pp, text_info *text)
|
||||
{
|
||||
@ -187,6 +191,7 @@ pp_base_format_text (pretty_printer *pp, text_info *text)
|
||||
{
|
||||
int precision = 0;
|
||||
bool wide = false;
|
||||
bool quoted = false;
|
||||
|
||||
/* Ignore text. */
|
||||
{
|
||||
@ -200,8 +205,14 @@ pp_base_format_text (pretty_printer *pp, text_info *text)
|
||||
if (*text->format_spec == '\0')
|
||||
break;
|
||||
|
||||
/* We got a '%'. Parse precision modifiers, if any. */
|
||||
switch (*++text->format_spec)
|
||||
/* We got a '%'. Check for 'q', then parse precision modifiers,
|
||||
if any. */
|
||||
if (*++text->format_spec == 'q')
|
||||
{
|
||||
quoted = true;
|
||||
++text->format_spec;
|
||||
}
|
||||
switch (*text->format_spec)
|
||||
{
|
||||
case 'w':
|
||||
wide = true;
|
||||
@ -221,6 +232,8 @@ pp_base_format_text (pretty_printer *pp, text_info *text)
|
||||
if (precision > 2)
|
||||
abort();
|
||||
|
||||
if (quoted)
|
||||
pp_string (pp, open_quote);
|
||||
switch (*text->format_spec)
|
||||
{
|
||||
case 'c':
|
||||
@ -279,6 +292,14 @@ pp_base_format_text (pretty_printer *pp, text_info *text)
|
||||
pp_character (pp, '%');
|
||||
break;
|
||||
|
||||
case '`':
|
||||
pp_string (pp, open_quote);
|
||||
break;
|
||||
|
||||
case '\'':
|
||||
pp_string (pp, close_quote);
|
||||
break;
|
||||
|
||||
case 'H':
|
||||
{
|
||||
const location_t *locus = va_arg (*text->args_ptr, location_t *);
|
||||
@ -293,7 +314,7 @@ pp_base_format_text (pretty_printer *pp, text_info *text)
|
||||
{
|
||||
int n;
|
||||
const char *s;
|
||||
/* We handle no precision specifier but `%.*s'. */
|
||||
/* We handle no precision specifier but '%.*s'. */
|
||||
if (*++text->format_spec != '*')
|
||||
abort ();
|
||||
else if (*++text->format_spec != 's')
|
||||
@ -314,6 +335,8 @@ pp_base_format_text (pretty_printer *pp, text_info *text)
|
||||
abort ();
|
||||
}
|
||||
}
|
||||
if (quoted)
|
||||
pp_string (pp, close_quote);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -49,7 +49,7 @@ extern void _fatal_insn (const char *, rtx, const char *, int, const char *)
|
||||
/* None of these functions are suitable for ATTRIBUTE_PRINTF, because
|
||||
each language front end can extend them with its own set of format
|
||||
specifiers. We must use custom format checks. */
|
||||
#if GCC_VERSION >= 3004
|
||||
#if GCC_VERSION >= 3005
|
||||
#define ATTRIBUTE_GCC_DIAG(m, n) __attribute__ ((__format__ (GCC_DIAG_STYLE, m, n))) ATTRIBUTE_NONNULL(m)
|
||||
#else
|
||||
#define ATTRIBUTE_GCC_DIAG(m, n) ATTRIBUTE_NONNULL(m)
|
||||
|
Loading…
x
Reference in New Issue
Block a user