Merge branch 'jk/error-const-return'
authorJunio C Hamano <gitster@pobox.com>
Sun, 6 Jan 2013 07:42:00 +0000 (23:42 -0800)
committerJunio C Hamano <gitster@pobox.com>
Sun, 6 Jan 2013 07:42:00 +0000 (23:42 -0800)
Help compilers' flow analysis by making it more explicit that
error() always returns -1, to reduce false "variable used
uninitialized" warnings. Looks somewhat ugly but not too much.

* jk/error-const-return:
silence some -Wuninitialized false positives
make error()'s constant return value more visible

cache.h
config.c
git-compat-util.h
parse-options.c
parse-options.h
usage.c
diff --git a/cache.h b/cache.h
index 8ceb6b8e8d4a51bcbe3bc165bf7dd745788ee095..e1df1e40dd64e990581c4554e8440bed44006e5d 100644 (file)
--- a/cache.h
+++ b/cache.h
@@ -1145,6 +1145,9 @@ extern int check_repository_format_version(const char *var, const char *value, v
 extern int git_env_bool(const char *, int);
 extern int git_config_system(void);
 extern int config_error_nonbool(const char *);
+#ifdef __GNUC__
+#define config_error_nonbool(s) (config_error_nonbool(s), -1)
+#endif
 extern const char *get_log_output_encoding(void);
 extern const char *get_commit_output_encoding(void);
 
index 97364c03fc1ee0e0200b5977e7eea48f384cdaf7..053970f369588b42b600ae32557af0828c7d283c 100644 (file)
--- a/config.c
+++ b/config.c
@@ -1662,6 +1662,7 @@ int git_config_rename_section(const char *old_name, const char *new_name)
  * Call this to report error for your variable that should not
  * get a boolean value (i.e. "[my] var" means "true").
  */
+#undef config_error_nonbool
 int config_error_nonbool(const char *var)
 {
        return error("Missing value for '%s'", var);
index 610e6b7ea49384b032cf9bd642cf4927955e9588..9661bc9f7371fec67627151a04e2a7a5094065fc 100644 (file)
@@ -290,6 +290,17 @@ extern NORETURN void die_errno(const char *err, ...) __attribute__((format (prin
 extern int error(const char *err, ...) __attribute__((format (printf, 1, 2)));
 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 have to restrict this trick to
+ * gcc, though, because of the variadic macro and the magic ## comma pasting
+ * behavior. But since we're only trying to help gcc, anyway, it's OK; other
+ * compilers will fall back to using the function as usual.
+ */
+#ifdef __GNUC__
+#define error(fmt, ...) (error((fmt), ##__VA_ARGS__), -1)
+#endif
+
 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));
 
index c1c66bd408c50685c06fe7ff1e1c6a78c26be1b1..67e98a6323e2dd4e3b4b8003806f7dffaff29a64 100644 (file)
@@ -18,15 +18,6 @@ int optbug(const struct option *opt, const char *reason)
        return error("BUG: switch '%c' %s", opt->short_name, reason);
 }
 
-int opterror(const struct option *opt, const char *reason, int flags)
-{
-       if (flags & OPT_SHORT)
-               return error("switch `%c' %s", opt->short_name, reason);
-       if (flags & OPT_UNSET)
-               return error("option `no-%s' %s", opt->long_name, reason);
-       return error("option `%s' %s", opt->long_name, reason);
-}
-
 static int get_arg(struct parse_opt_ctx_t *p, const struct option *opt,
                   int flags, const char **arg)
 {
@@ -594,3 +585,12 @@ static int parse_options_usage(struct parse_opt_ctx_t *ctx,
        return usage_with_options_internal(ctx, usagestr, opts, 0, err);
 }
 
+#undef opterror
+int opterror(const struct option *opt, const char *reason, int flags)
+{
+       if (flags & OPT_SHORT)
+               return error("switch `%c' %s", opt->short_name, reason);
+       if (flags & OPT_UNSET)
+               return error("option `no-%s' %s", opt->long_name, reason);
+       return error("option `%s' %s", opt->long_name, reason);
+}
index 71a39c60d942601a1cf30e218df56777742d5580..e703853749f0949c58cde0a27ff1d01991609400 100644 (file)
@@ -177,6 +177,10 @@ extern NORETURN void usage_msg_opt(const char *msg,
 
 extern int optbug(const struct option *opt, const char *reason);
 extern int opterror(const struct option *opt, const char *reason, int flags);
+#ifdef __GNUC__
+#define opterror(o,r,f) (opterror((o),(r),(f)), -1)
+#endif
+
 /*----- incremental advanced APIs -----*/
 
 enum {
diff --git a/usage.c b/usage.c
index 8eab28113a970a3f1bc7b9b430aa50341c2667e2..40b3de51c7dfa3fdaaeb44e1c64a2208560414c5 100644 (file)
--- a/usage.c
+++ b/usage.c
@@ -130,6 +130,7 @@ void NORETURN die_errno(const char *fmt, ...)
        va_end(params);
 }
 
+#undef error
 int error(const char *err, ...)
 {
        va_list params;