add format argument attributes to gettext function prototypes

their absence completely breaks format string warnings in programs
with gettext message translations: -Wformat gives no results, and
-Wformat-nonliteral produces spurious warnings.

with gcc, the problem manifests only in standards-conforming profiles;
otherwise gcc sets these attributes by default for the gettext family.
with clang, the problem always manifests; clang has no such defaults.
This commit is contained in:
Khem Raj 2015-09-13 06:29:04 +00:00 committed by Rich Felker
parent 64b6684ddd
commit ccc71e0ea8
1 changed files with 14 additions and 6 deletions

View File

@ -8,16 +8,24 @@ extern "C" {
#define __USE_GNU_GETTEXT 1 #define __USE_GNU_GETTEXT 1
#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 1 : -1) #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 1 : -1)
char *gettext(const char *); #if __GNUC__ >= 3
char *dgettext(const char *, const char *); #define __fa(n) __attribute__ ((__format_arg__ (n)))
char *dcgettext(const char *, const char *, int); #else
char *ngettext(const char *, const char *, unsigned long); #define __fa(n)
char *dngettext(const char *, const char *, const char *, unsigned long); #endif
char *dcngettext(const char *, const char *, const char *, unsigned long, int);
char *gettext(const char *) __fa(1);
char *dgettext(const char *, const char *) __fa(2);
char *dcgettext(const char *, const char *, int) __fa(2);
char *ngettext(const char *, const char *, unsigned long) __fa(1) __fa(2);
char *dngettext(const char *, const char *, const char *, unsigned long) __fa(2) __fa(3);
char *dcngettext(const char *, const char *, const char *, unsigned long, int) __fa(2) __fa(3);
char *textdomain(const char *); char *textdomain(const char *);
char *bindtextdomain (const char *, const char *); char *bindtextdomain (const char *, const char *);
char *bind_textdomain_codeset(const char *, const char *); char *bind_textdomain_codeset(const char *, const char *);
#undef __fa
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif