Thanks for reporting the problem. I reproduced it on Solaris 10 with Sun C 5.12
and fixed it with the attached patch.
>From 00507e1c9650ded0cf3f76a3f7d069e10e0310af Mon Sep 17 00:00:00 2001
From: Paul Eggert <[email protected]>
Date: Mon, 5 Jan 2015 20:07:34 -0800
Subject: [PATCH] tar: port wordsplit attribute to Sun C
Reported by Ted Carr in:
http://lists.gnu.org/archive/html/bug-tar/2015-01/msg00002.html
* lib/wordsplit.h (__WORDSPLIT_ATTRIBUTE_FORMAT):
New macro, taken from Gnulib.
(struct wordsplit): Use it.
* lib/wordsplit.c (_wsplt_error): Use it.
---
lib/wordsplit.c | 2 +-
lib/wordsplit.h | 10 ++++++++--
2 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/lib/wordsplit.c b/lib/wordsplit.c
index 21807cd..bda64d3 100644
--- a/lib/wordsplit.c
+++ b/lib/wordsplit.c
@@ -61,7 +61,7 @@ _wsplt_alloc_die (struct wordsplit *wsp)
abort ();
}
-static void __attribute__ ((__format__ (__printf__, 1, 2)))
+static void __WORDSPLIT_ATTRIBUTE_FORMAT ((__printf__, 1, 2))
_wsplt_error (const char *fmt, ...)
{
va_list ap;
diff --git a/lib/wordsplit.h b/lib/wordsplit.h
index d64cf2f..25d556d 100644
--- a/lib/wordsplit.h
+++ b/lib/wordsplit.h
@@ -22,6 +22,12 @@
#include <stddef.h>
+#if 2 < __GNUC__ + (7 <= __GNUC_MINOR__)
+# define __WORDSPLIT_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
+#else
+# define __WORDSPLIT_ATTRIBUTE_FORMAT(spec) /* empty */
+#endif
+
struct wordsplit
{
size_t ws_wordc;
@@ -34,9 +40,9 @@ struct wordsplit
const char *ws_escape;
void (*ws_alloc_die) (struct wordsplit * wsp);
void (*ws_error) (const char *, ...)
- __attribute__ ((__format__ (__printf__, 1, 2)));
+ __WORDSPLIT_ATTRIBUTE_FORMAT ((__printf__, 1, 2));
void (*ws_debug) (const char *, ...)
- __attribute__ ((__format__ (__printf__, 1, 2)));
+ __WORDSPLIT_ATTRIBUTE_FORMAT ((__printf__, 1, 2));
const char **ws_env;
const char *(*ws_getvar) (const char *, size_t, void *);
--
2.1.0