2009-10-15 Jim Blandy <jimb@red-bean.com>
authorTristan Gingold <gingold@adacore.com>
Thu, 15 Oct 2009 09:41:35 +0000 (09:41 +0000)
committerTristan Gingold <gingold@adacore.com>
Thu, 15 Oct 2009 09:41:35 +0000 (09:41 +0000)
* libgnuintl.h (_INTL_MAY_RETURN_STRING_ARG, gettext, dgettext)
(dcgettext, ngettext, dngettext, dcngettext): Backport changes
from current gettext to provide GCC format_arg attributes.

intl/ChangeLog
intl/libgnuintl.h

index 83a74febece51a00af75cc1ef22cd944b9ec7342..20aaed376b0777e396f6fc03873993e8a93c93eb 100644 (file)
@@ -1,3 +1,9 @@
+2009-10-15  Jim Blandy  <jimb@red-bean.com>
+
+       * libgnuintl.h (_INTL_MAY_RETURN_STRING_ARG, gettext, dgettext)
+       (dcgettext, ngettext, dngettext, dcngettext): Backport changes
+       from current gettext to provide GCC format_arg attributes.
+
 2009-08-24  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>
 
        * configure.ac (AC_PREREQ): Bump to 2.64.
index f6138affb5918fa9ab980b7bcf58ed22c3a41f13..acc9093a9de968cd4d77aa7dd3ae7a3fb163e695 100644 (file)
@@ -112,11 +112,21 @@ extern "C" {
 # define _INTL_ASM(cname)
 #endif
 
+/* _INTL_MAY_RETURN_STRING_ARG(n) declares that the given function may return
+   its n-th argument literally.  This enables GCC to warn for example about
+   printf (gettext ("foo %y")).  */
+#if __GNUC__ >= 3 && !(__APPLE_CC__ > 1 && defined __cplusplus)
+# define _INTL_MAY_RETURN_STRING_ARG(n) __attribute__ ((__format_arg__ (n)))
+#else
+# define _INTL_MAY_RETURN_STRING_ARG(n)
+#endif
+
 /* Look up MSGID in the current default message catalog for the current
    LC_MESSAGES locale.  If not found, returns MSGID itself (the default
    text).  */
 #ifdef _INTL_REDIRECT_INLINE
-extern char *libintl_gettext (const char *__msgid);
+extern char *libintl_gettext (const char *__msgid)
+       _INTL_MAY_RETURN_STRING_ARG (1);
 static inline char *gettext (const char *__msgid)
 {
   return libintl_gettext (__msgid);
@@ -126,13 +136,15 @@ static inline char *gettext (const char *__msgid)
 # define gettext libintl_gettext
 #endif
 extern char *gettext _INTL_PARAMS ((const char *__msgid))
-       _INTL_ASM (libintl_gettext);
+       _INTL_ASM (libintl_gettext)
+       _INTL_MAY_RETURN_STRING_ARG (1);
 #endif
 
 /* Look up MSGID in the DOMAINNAME message catalog for the current
    LC_MESSAGES locale.  */
 #ifdef _INTL_REDIRECT_INLINE
-extern char *libintl_dgettext (const char *__domainname, const char *__msgid);
+extern char *libintl_dgettext (const char *__domainname, const char *__msgid)
+       _INTL_MAY_RETURN_STRING_ARG (2);
 static inline char *dgettext (const char *__domainname, const char *__msgid)
 {
   return libintl_dgettext (__domainname, __msgid);
@@ -143,14 +155,16 @@ static inline char *dgettext (const char *__domainname, const char *__msgid)
 #endif
 extern char *dgettext _INTL_PARAMS ((const char *__domainname,
                                     const char *__msgid))
-       _INTL_ASM (libintl_dgettext);
+       _INTL_ASM (libintl_dgettext)
+       _INTL_MAY_RETURN_STRING_ARG (2);
 #endif
 
 /* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
    locale.  */
 #ifdef _INTL_REDIRECT_INLINE
 extern char *libintl_dcgettext (const char *__domainname, const char *__msgid,
-                               int __category);
+                               int __category)
+       _INTL_MAY_RETURN_STRING_ARG (2);
 static inline char *dcgettext (const char *__domainname, const char *__msgid,
                               int __category)
 {
@@ -163,7 +177,8 @@ static inline char *dcgettext (const char *__domainname, const char *__msgid,
 extern char *dcgettext _INTL_PARAMS ((const char *__domainname,
                                      const char *__msgid,
                                      int __category))
-       _INTL_ASM (libintl_dcgettext);
+       _INTL_ASM (libintl_dcgettext)
+       _INTL_MAY_RETURN_STRING_ARG (2);
 #endif
 
 
@@ -171,7 +186,8 @@ extern char *dcgettext _INTL_PARAMS ((const char *__domainname,
    number N.  */
 #ifdef _INTL_REDIRECT_INLINE
 extern char *libintl_ngettext (const char *__msgid1, const char *__msgid2,
-                              unsigned long int __n);
+                              unsigned long int __n)
+       _INTL_MAY_RETURN_STRING_ARG (1) _INTL_MAY_RETURN_STRING_ARG (2);
 static inline char *ngettext (const char *__msgid1, const char *__msgid2,
                              unsigned long int __n)
 {
@@ -184,14 +200,16 @@ static inline char *ngettext (const char *__msgid1, const char *__msgid2,
 extern char *ngettext _INTL_PARAMS ((const char *__msgid1,
                                     const char *__msgid2,
                                     unsigned long int __n))
-       _INTL_ASM (libintl_ngettext);
+       _INTL_ASM (libintl_ngettext)
+       _INTL_MAY_RETURN_STRING_ARG (1) _INTL_MAY_RETURN_STRING_ARG (2);
 #endif
 
 /* Similar to `dgettext' but select the plural form corresponding to the
    number N.  */
 #ifdef _INTL_REDIRECT_INLINE
 extern char *libintl_dngettext (const char *__domainname, const char *__msgid1,
-                               const char *__msgid2, unsigned long int __n);
+                               const char *__msgid2, unsigned long int __n)
+       _INTL_MAY_RETURN_STRING_ARG (2) _INTL_MAY_RETURN_STRING_ARG (3);
 static inline char *dngettext (const char *__domainname, const char *__msgid1,
                               const char *__msgid2, unsigned long int __n)
 {
@@ -205,7 +223,8 @@ extern char *dngettext _INTL_PARAMS ((const char *__domainname,
                                      const char *__msgid1,
                                      const char *__msgid2,
                                      unsigned long int __n))
-       _INTL_ASM (libintl_dngettext);
+       _INTL_ASM (libintl_dngettext)
+       _INTL_MAY_RETURN_STRING_ARG (2) _INTL_MAY_RETURN_STRING_ARG (3);
 #endif
 
 /* Similar to `dcgettext' but select the plural form corresponding to the
@@ -213,7 +232,8 @@ extern char *dngettext _INTL_PARAMS ((const char *__domainname,
 #ifdef _INTL_REDIRECT_INLINE
 extern char *libintl_dcngettext (const char *__domainname,
                                 const char *__msgid1, const char *__msgid2,
-                                unsigned long int __n, int __category);
+                                unsigned long int __n, int __category)
+       _INTL_MAY_RETURN_STRING_ARG (2) _INTL_MAY_RETURN_STRING_ARG (3);
 static inline char *dcngettext (const char *__domainname,
                                const char *__msgid1, const char *__msgid2,
                                unsigned long int __n, int __category)
@@ -229,7 +249,8 @@ extern char *dcngettext _INTL_PARAMS ((const char *__domainname,
                                       const char *__msgid2,
                                       unsigned long int __n,
                                       int __category))
-       _INTL_ASM (libintl_dcngettext);
+       _INTL_ASM (libintl_dcngettext)
+       _INTL_MAY_RETURN_STRING_ARG (2) _INTL_MAY_RETURN_STRING_ARG (3);
 #endif