[PATCH] check_format fixes
Jakub Jelinek
jakub@redhat.com
Tue Jun 11 10:49:00 GMT 2019
On Tue, Jun 11, 2019 at 11:50:40AM +0200, Jakub Jelinek wrote:
> The rest is just a general comment on the preexisting code.
> Using a bunch of const char *whatever = _("...");
> at the start of function is undesirable, it means any time this function is
> called, even in the likely case there is no error, all those strings need to
> be translated. It would be better to e.g. replace all _("...") in that
> function with G_("...") (i.e. mark for translation, but don't translate),
> and only when actually using that translate:
> if (error == unexpected_element)
> gfc_error (error, error_element, &format_locus);
> else
> gfc_error ("%s in format string at %L", error, &format_locus);
> The first case is translated already by gfc_error, the second one would need
> _(error) instead of error (but is generally wrong anyway, because you are
> constructing a diagnostics from two pieces which might not be ok for
> translations. So, likely you want to append " in format string at %L" to
> all the error string literals inside of G_("...") and just pass error as
> first argument to gfc_error.
It is actually even worse. On:
write (10, 100)
write (10, 200)
100 format (*)
200 format (DT(124:))
end
gfortran reports:
Error: Left parenthesis required after %<*%> in format string at (1)
and
Error: Right parenthesis expected at %C in format string at (1)
With the following patch which implements the above (but not the -fdec*
addition Mark has been posting), it reports:
Error: Left parenthesis required after â*â in format string at (1)
and
Error: Right parenthesis expected at (1) in format string at (2)
instead.
Tested on x86_64-linux with check-gfortran, ok for trunk if full bootstrap/regtest
passes?
2019-06-11 Jakub Jelinek <jakub@redhat.com>
* io.c (check_format): Use G_(...) instead of _(...) for error values,
append " in format string at %L" to all strings but unexpected_element,
use error as gfc_error formating string instead of
"%s in format string at %L". Formatting fixes.
--- gcc/fortran/io.c.jj 2019-05-23 12:57:17.762475649 +0200
+++ gcc/fortran/io.c 2019-06-11 12:24:23.155712025 +0200
@@ -596,12 +596,16 @@ token_to_string (format_token t)
static bool
check_format (bool is_input)
{
- const char *posint_required = _("Positive width required");
- const char *nonneg_required = _("Nonnegative width required");
- const char *unexpected_element = _("Unexpected element %qc in format "
- "string at %L");
- const char *unexpected_end = _("Unexpected end of format string");
- const char *zero_width = _("Zero width in format descriptor");
+ const char *posint_required
+ = G_("Positive width required in format string at %L");
+ const char *nonneg_required
+ = G_("Nonnegative width required in format string at %L");
+ const char *unexpected_element
+ = G_("Unexpected element %qc in format string at %L");
+ const char *unexpected_end
+ = G_("Unexpected end of format string in format string at %L");
+ const char *zero_width
+ = G_("Zero width in format descriptor in format string at %L");
const char *error = NULL;
format_token t, u;
@@ -621,7 +625,7 @@ check_format (bool is_input)
goto fail;
if (t != FMT_LPAREN)
{
- error = _("Missing leading left parenthesis");
+ error = G_("Missing leading left parenthesis in format string at %L");
goto syntax;
}
@@ -650,7 +654,8 @@ format_item_1:
level++;
goto format_item;
}
- error = _("Left parenthesis required after %<*%>");
+ error = G_("Left parenthesis required after %<*%> in format string "
+ "at %L");
goto syntax;
case FMT_POSINT:
@@ -681,7 +686,7 @@ format_item_1:
goto fail;
if (t != FMT_P)
{
- error = _("Expected P edit descriptor");
+ error = G_("Expected P edit descriptor in format string at %L");
goto syntax;
}
@@ -689,7 +694,8 @@ format_item_1:
case FMT_P:
/* P requires a prior number. */
- error = _("P descriptor requires leading scale factor");
+ error = G_("P descriptor requires leading scale factor in format "
+ "string at %L");
goto syntax;
case FMT_X:
@@ -783,7 +789,8 @@ data_desc:
&& t != FMT_F && t != FMT_E && t != FMT_EN && t != FMT_ES
&& t != FMT_D && t != FMT_G && t != FMT_RPAREN && t != FMT_SLASH)
{
- error = _("Comma required after P descriptor");
+ error = G_("Comma required after P descriptor in format string "
+ "at %L");
goto syntax;
}
if (t != FMT_COMMA)
@@ -794,10 +801,11 @@ data_desc:
if (t == FMT_ERROR)
goto fail;
}
- if (t != FMT_F && t != FMT_E && t != FMT_EN && t != FMT_ES && t != FMT_D
- && t != FMT_G && t != FMT_RPAREN && t != FMT_SLASH)
+ if (t != FMT_F && t != FMT_E && t != FMT_EN && t != FMT_ES
+ && t != FMT_D && t != FMT_G && t != FMT_RPAREN && t != FMT_SLASH)
{
- error = _("Comma required after P descriptor");
+ error = G_("Comma required after P descriptor in format string "
+ "at %L");
goto syntax;
}
}
@@ -811,7 +819,8 @@ data_desc:
t = format_lex ();
if (t != FMT_POSINT)
{
- error = _("Positive width required with T descriptor");
+ error = G_("Positive width required with T descriptor in format "
+ "string at %L");
goto syntax;
}
break;
@@ -894,7 +903,8 @@ data_desc:
u = format_lex ();
if (u == FMT_E)
{
- error = _("E specifier not allowed with g0 descriptor");
+ error = G_("E specifier not allowed with g0 descriptor in "
+ "format string at %L");
goto syntax;
}
saved_token = u;
@@ -961,9 +971,7 @@ data_desc:
if (u == FMT_ERROR)
goto fail;
if (u != FMT_E)
- {
- saved_token = u;
- }
+ saved_token = u;
else
{
u = format_lex ();
@@ -971,7 +979,8 @@ data_desc:
goto fail;
if (u != FMT_POSINT)
{
- error = _("Positive exponent width required");
+ error = G_("Positive exponent width required in format string "
+ "at %L");
goto syntax;
}
}
@@ -1017,7 +1026,8 @@ data_desc:
goto dtio_vlist;
if (t != FMT_RPAREN)
{
- error = _("Right parenthesis expected at %C");
+ error = G_("Right parenthesis expected at %C in format string "
+ "at %L");
goto syntax;
}
goto between_desc;
@@ -1058,7 +1068,8 @@ data_desc:
/* Warn if -std=legacy, otherwise error. */
if (gfc_option.warn_std != 0)
{
- error = _("Period required in format specifier");
+ error = G_("Period required in format specifier in format "
+ "string at %L");
goto syntax;
}
if (mode != MODE_FORMAT)
@@ -1132,9 +1143,7 @@ data_desc:
if (t == FMT_ERROR)
goto fail;
if (t != FMT_PERIOD)
- {
- saved_token = t;
- }
+ saved_token = t;
else
{
t = format_lex ();
@@ -1262,7 +1271,7 @@ syntax:
if (error == unexpected_element)
gfc_error (error, error_element, &format_locus);
else
- gfc_error ("%s in format string at %L", error, &format_locus);
+ gfc_error (error, &format_locus);
fail:
rv = false;
Jakub
More information about the Gcc-patches
mailing list