Hi!

The cb.error hook is called in the case we are looking for with
_("conversion from %s to %s not supported by iconv")
where _(msgid) is dgettext ("cpplib", msgid), so if performing -fself-test
on iconv that doesn't support ebcdic in a locale that has translations
for this string, gcc ICEs.

The following patch uses the same translation as libcpp to avoid that.

I've bootstrapped/regtested this on x86_64-linux and i686-linux, but there
iconv doesn't fail, plus simulated in the debugger iconv error (both in
LC_ALL=en_US.UTF-8 and LC_ALL=de_DE.UTF-8).  Ok for trunk?

2017-01-03  Jakub Jelinek  <ja...@redhat.com>

        PR bootstrap/77569
        * input.c (ebcdic_execution_charset::on_error): Don't use strstr for
        a substring of the message, but strcmp with the whole message.  Ifdef
        ENABLE_NLS, translate the message first using dgettext.

--- gcc/input.c.jj      2017-01-01 12:45:37.000000000 +0100
+++ gcc/input.c 2017-01-03 13:40:46.827595040 +0100
@@ -2026,9 +2026,14 @@ class ebcdic_execution_charset : public
     ATTRIBUTE_FPTR_PRINTF(5,0)
   {
     gcc_assert (s_singleton);
+    /* Avoid exgettext from picking this up, it is translated in libcpp.  */
+    const char *msg = "conversion from %s to %s not supported by iconv";
+#ifdef ENABLE_NLS
+    msg = dgettext ("cpplib", msg);
+#endif
     /* Detect and record errors emitted by libcpp/charset.c:init_iconv_desc
        when the local iconv build doesn't support the conversion.  */
-    if (strstr (msgid, "not supported by iconv"))
+    if (strcmp (msgid, msg) == 0)
       {
        s_singleton->m_num_iconv_errors++;
        return true;

        Jakub

Reply via email to