git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 1/3] Revert "make error()'s constant return value more visible"

From
Jeff King <peff@peff.net>
Date
May 5, 2014, 05:49 UTC
Message-ID
<20140505054901.GA19331@sigill.intra.peff.net>
In-Reply-To
<1399183975-2346-2-git-send-email-felipe.contreras@gmail.com>
On Sun, May 04, 2014 at 01:12:53AM -0500, Felipe Contreras wrote:
> So it looks like gcc is smarter now, and in trying to fix a few warnings
> we generated hundreds more.
> 
> This reverts commit e208f9cc7574f5980faba498d0aa30b4defeb34f.

And now we've gone the other way, and re-enabled the initial warnings. Can we come up with a solution that helps both cases?

I could not find a way to annotate a value as "maybe unused", but we can hide it inside a function, like:

-- >8 --
Subject: inline error() function

The error() function does two things: it prints an error, and it returns "-1" as a convenience to allow:

  return error("foo");

Commit e208f9c converted this to a macro to make the constant return value more visible to the compiler. However, recent versions of gcc complain when error is used in a void context, as the constant "-1" ends up unused.

Instead, let's convert error() to a static inline, which should accomplish the same thing without the extra warnings (because gcc will not warn about unused return values unless warn_unused_result is specified for the particular function).

Signed-off-by: Jeff King <peff@peff.net>
---
 git-compat-util.h | 20 ++++++++++++--------
 usage.c           |  8 +-------
 2 files changed, 13 insertions(+), 15 deletions(-)
diff --git a/git-compat-util.h b/git-compat-util.h
index f6d3a46..3aef0d3 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -310,7 +310,6 @@ extern NORETURN void usage(const char *err);
 extern NORETURN void usagef(const char *err, ...) __attribute__((format (printf, 1, 2)));
 extern NORETURN void die(const char *err, ...) __attribute__((format (printf, 1, 2)));
 extern NORETURN void die_errno(const char *err, ...) __attribute__((format (printf, 1, 2)));
-extern int error(const char *err, ...) __attribute__((format (printf, 1, 2)));
 extern void warning(const char *err, ...) __attribute__((format (printf, 1, 2)));
 
 #ifndef NO_OPENSSL
@@ -325,14 +324,19 @@ extern void warning(const char *err, ...) __attribute__((format (printf, 1, 2)))
 
 /*
  * Let callers be aware of the constant return value; this can help
- * gcc with -Wuninitialized analysis. We restrict this trick to gcc, though,
- * because some compilers may not support variadic macros. Since we're only
- * trying to help gcc, anyway, it's OK; other compilers will fall back to
- * using the function as usual.
+ * gcc with -Wuninitialized analysis.
  */
-#if defined(__GNUC__) && ! defined(__clang__)
-#define error(...) (error(__VA_ARGS__), -1)
-#endif
+__attribute__((format (printf, 1, 0)))
+extern void error_impl(const char *err, va_list params);
+__attribute__((format (printf, 1, 2)))
+static inline int error(const char *err, ...)
+{
+    va_list params;
+    va_start(params, err);
+    error_impl(err, params);
+    va_end(params);
+    return -1;
+}
 
 extern void set_die_routine(NORETURN_PTR void (*routine)(const char *err, va_list params));
 extern void set_error_routine(void (*routine)(const char *err, va_list params));
diff --git a/usage.c b/usage.c
index ed14645..5456e4b 100644
--- a/usage.c
+++ b/usage.c
@@ -138,15 +138,9 @@ void NORETURN die_errno(const char *fmt, ...)
 	va_end(params);
 }
 
-#undef error
-int error(const char *err, ...)
+void error_impl(const char *err, va_list params)
 {
-	va_list params;
-
-	va_start(params, err);
 	error_routine(err, params);
-	va_end(params);
-	return -1;
 }
 
 void warning(const char *warn, ...)
-- 
2.0.0.rc1.436.g03cb729
Previous: Felipe ContrerasNext: Felipe Contreras
Message 3 of 26 in “Fix a ton of compiler warnings”
  1. 0/3 Fix a ton of compiler warningsFelipe Contreras, May 4, 2014
  2. 1/3 Revert "make error()'s constant return value more visible"Felipe Contreras, May 4, 2014
  3. Jeff KingMay 5, 2014
  4. Felipe ContrerasMay 5, 2014
  5. Jeff KingMay 5, 2014
  6. Felipe ContrerasMay 5, 2014
  7. Jeff KingMay 5, 2014
  8. Felipe ContrerasMay 5, 2014
  9. Jeff KingMay 5, 2014
  10. 1/2 inline constant return from error() functionJeff King, May 6, 2014
  11. Junio C HamanoMay 6, 2014
  12. Jeff KingMay 7, 2014
  13. Junio C HamanoMay 11, 2014
  14. Jeff KingMay 12, 2014
  15. Felipe ContrerasMay 11, 2014
  16. Jonathan NiederMay 12, 2014
  17. Jeff KingMay 12, 2014
  18. 2/2 let clang use the constant-return error() macroJeff King, May 6, 2014
  19. 2/3 Revert "silence some -Wuninitialized false positives"Felipe Contreras, May 4, 2014
  20. 3/3 Silence a bunch of format-zero-length warningsFelipe Contreras, May 4, 2014
  21. brian m. carlsonMay 4, 2014
  22. Felipe ContrerasMay 4, 2014
  23. Jeff KingMay 5, 2014
  24. Junio C HamanoMay 7, 2014
  25. Heiko VoigtMay 7, 2014
  26. Junio C HamanoMay 7, 2014

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.