On Sat, Jul 10 2021, Ævar Arnfjörð Bjarmason wrote: So this: > [...] > For strbuf_addftime() let's add a strftime() format checker. Our > function understands the non-portable %z and %Z, see > c3fbf81a853 (strbuf: let strbuf_addftime handle %z and %Z itself, > 2017-06-15). > > That might be an issue in theory, but in practice we have existing > codepath that supplies a fixed string to strbuf_addftime(). We're > unlikely to run into the "%z" and "%Z" case at all, since it's used by > date.c and passed via e.g. "git log --date=<format>". > [...] > /** > @@ -425,6 +426,7 @@ void strbuf_vaddf(struct strbuf *sb, const char *fmt, va_list ap); > * `suppress_tz_name`, when set, expands %Z internally to the empty > * string rather than passing it to `strftime`. > */ > +__attribute__((format (strftime, 2, 0))) > void strbuf_addftime(struct strbuf *sb, const char *fmt, > const struct tm *tm, int tz_offset, > int suppress_tz_name); Fails with compat/mingw.[ch] doing: [...] compat/mingw.c:#undef strftime compat/mingw.c-size_t mingw_strftime(char *s, size_t max, compat/mingw.c- const char *format, const struct tm *tm) [...] compat/mingw.h:#define strftime mingw_strftime [...] What's a good macro idiom to dig oneself out of that hole? The only similar thing I could find was NORETURN in git-compat-util.h being defined differently on various platforms, and then things like: +#if !defined(__MINGW32__) && !defined(_MSC_VER) __attribute__((format (strftime, 2, 0))) +#endif Which seems to work, and may be the simplest workaround...