Paul Eggert wrote:
> > Why not
> > 
> >     #ifdef __cplusplus
> >     # define _LIBGETTEXT_FUNCAST(type, expr) static_cast<type> (expr)
> 
> Sounds good, thanks. I installed the attached to do that, and to try to 
> simplify the code a bit.

With an extended test case, I see compilation errors:

   ================================ foo.c ================================
   #include <stdio.h>
   #include "gettext.h"
   extern const char *some_computed_string (void);

   void foo (int n)
   {
     textdomain ("pkg");
     bindtextdomain ("pkg", "/usr/share/locale");
     bind_textdomain_codeset ("pkg", "UTF-8");

     printf (gettext ("foo %d"), n);
     printf (dgettext ("toto", "foo %d"), n);
     printf (dcgettext ("toto", "foo %d", LC_MESSAGES), n);
     printf (ngettext ("foo %d", "bar %d", n), n);
     printf (dngettext ("toto", "foo %d", "bar %d", n), n);
     printf (dcngettext ("toto", "foo %d", "bar %d", n, LC_MESSAGES), n);

     printf ("%s", gettext ("between 7% & 19%."));
     printf ("%s", dgettext ("toto", "between 7% & 19%."));
     printf ("%s", dcgettext ("toto", "between 7% & 19%.", LC_MESSAGES));

     printf (gettext (some_computed_string ()));
     printf (dgettext ("toto", some_computed_string ()));
     printf (dcgettext ("toto", some_computed_string (), LC_MESSAGES));
   }
   =======================================================================

$ gcc -Wall -Wformat=2 -S foo.c
In file included from foo.c:2:
foo.c: In function ‘foo’:
/GNULIB/gnulib-git/lib/gettext.h:68:44: warning: value computed is not used 
[-Wunused-value]
   68 | #   define _LIBGETTEXT_FUNCAST(type, expr) (type) {(expr)}
      |                                            ^
/GNULIB/gnulib-git/lib/gettext.h:212:33: note: in expansion of macro 
‘_LIBGETTEXT_FUNCAST’
  212 | # define textdomain(Domainname) _LIBGETTEXT_FUNCAST (const char *, 
Domainname)
      |                                 ^~~~~~~~~~~~~~~~~~~
foo.c:7:6: note: in expansion of macro ‘textdomain’
    7 |      textdomain ("pkg");
      |      ^~~~~~~~~~
/GNULIB/gnulib-git/lib/gettext.h:219:13: error: implicit declaration of 
function ‘_LIBGETTEXT_FUNCAT’ [-Wimplicit-function-declaration]
  219 |     ((void) _LIBGETTEXT_FUNCAT (const char *, Domainname), \
      |             ^~~~~~~~~~~~~~~~~~
foo.c:9:6: note: in expansion of macro ‘bind_textdomain_codeset’
    9 |      bind_textdomain_codeset ("pkg", "UTF-8");
      |      ^~~~~~~~~~~~~~~~~~~~~~~

$ clang -Wall -Wformat=2 -S foo.c
foo.c:9:6: error: call to undeclared function '_LIBGETTEXT_FUNCAT'; ISO C99 and 
later do not support implicit function declarations 
[-Wimplicit-function-declaration]
    9 |      bind_textdomain_codeset ("pkg", "UTF-8");
      |      ^
/GNULIB/gnulib-git/lib/gettext.h:219:13: note: expanded from macro 
'bind_textdomain_codeset'
  219 |     ((void) _LIBGETTEXT_FUNCAT (const char *, Domainname), \
      |             ^

Let me fix that.


2026-08-26  Bruno Haible  <[email protected]>

        gettext-h: Fix compilation error (regression 2026-08-24).
        * lib/gettext.h: Update old comments.
        (_LIBGETTEXT_FUNCAST): Correct indentation.
        (bind_textdomain_codeset): Fix typo.

diff --git a/lib/gettext.h b/lib/gettext.h
index 521d69e6b0..68826302c3 100644
--- a/lib/gettext.h
+++ b/lib/gettext.h
@@ -42,9 +42,7 @@
 /* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which
    chokes if dcgettext is defined as a macro.  So include it now, to make
    later inclusions of <locale.h> a NOP.  We don't include <libintl.h>
-   as well because people using "gettext.h" will not include <libintl.h>,
-   and also including <libintl.h> would fail on SunOS 4, whereas <locale.h>
-   is OK.  */
+   as well because people using "gettext.h" will not include <libintl.h>.  */
 # if defined(__sun)
 #  include <locale.h>
 # endif
@@ -62,11 +60,11 @@
 /* Like the C cast ((type) (expr)), but do only conversions that an
    ordinary assignment would do.  This can diagnose invalid arguments
    better than a cast would.  */
-#  ifdef __cplusplus
-#   define _LIBGETTEXT_FUNCAST(type, expr) static_cast <type> (expr)
-#  else
-#   define _LIBGETTEXT_FUNCAST(type, expr) (type) {(expr)}
-#  endif
+# ifdef __cplusplus
+#  define _LIBGETTEXT_FUNCAST(type, expr) static_cast <type> (expr)
+# else
+#  define _LIBGETTEXT_FUNCAST(type, expr) (type) {(expr)}
+# endif
 
 /* Disabled NLS.  */
 /* When gcc is used with option -Wformat=2, we need to silence
@@ -84,17 +82,32 @@
    ================================ foo.c ================================
    #include <stdio.h>
    #include "gettext.h"
+   extern const char *some_computed_string (void);
+
    void foo (int n)
    {
+     textdomain ("pkg");
+     bindtextdomain ("pkg", "/usr/share/locale");
+     bind_textdomain_codeset ("pkg", "UTF-8");
+
      printf (gettext ("foo %d"), n);
      printf (dgettext ("toto", "foo %d"), n);
      printf (dcgettext ("toto", "foo %d", LC_MESSAGES), n);
      printf (ngettext ("foo %d", "bar %d", n), n);
      printf (dngettext ("toto", "foo %d", "bar %d", n), n);
      printf (dcngettext ("toto", "foo %d", "bar %d", n, LC_MESSAGES), n);
+
+     printf ("%s", gettext ("between 7% & 19%."));
+     printf ("%s", dgettext ("toto", "between 7% & 19%."));
+     printf ("%s", dcgettext ("toto", "between 7% & 19%.", LC_MESSAGES));
+
+     printf (gettext (some_computed_string ()));
+     printf (dgettext ("toto", some_computed_string ()));
+     printf (dcgettext ("toto", some_computed_string (), LC_MESSAGES));
    }
    =======================================================================
    $CC -Wformat=2 -S foo.c
+   $CC -Wformat=2 -S -x c++ foo.c
  */
 # if defined __GNUC__ && !defined __clang__ && !defined __cplusplus
 /* The return type 'const char *' serves the purpose of producing warnings
@@ -216,8 +229,8 @@ dcgettext (const char *domain, const char *msgid, int 
category)
      _LIBGETTEXT_FUNCAST (const char *, Dirname))
 # undef bind_textdomain_codeset
 # define bind_textdomain_codeset(Domainname, Codeset) \
-    ((void) _LIBGETTEXT_FUNCAT (const char *, Domainname), \
-     _LIBGETTEXT_FUNCAT (const char *, Codeset))
+    ((void) _LIBGETTEXT_FUNCAST (const char *, Domainname), \
+     _LIBGETTEXT_FUNCAST (const char *, Codeset))
 #endif
 
 




Reply via email to