Subject: [PATCH/RFC] reflog: silence -O3 -Wuninitialized warning

From: Jonathan Nieder <[email-masked]>
Date: Tue, 15 Mar 2011 21:49:59 -0500

Date: Fri, 04 Mar 2011 00:54:53 -0600

Starting with gcc 4.5 (r147852, Pretty-ipa merge: Inliner heruistics
reorg, 2009-05-25), gcc -O3 -Wall warns when building
reflog_expire_config:

    warning: 'expire' may be used uninitialized in this function [-Wuninitialized]

The cause: starting with that version, gcc realizes it can inline the
call to parse_expire_cfg_value.  In the error case, 'expire' is not
initialized and the function returns early, but gcc does not have
enough information to figure out that this is an error return.

Squash the warning by letting the optimizer peek at the return value
from config_error_nonbool.  This also decreases the text size by a
tiny (negligible) amount when building with -Os --- before:

    text    data     bss     dec     hex filename
 1002184   24856  316928 1343968  1481e0 git

After:

    text    data     bss     dec     hex filename
 1002120   24856  316928 1343904  1481a0 git

Signed-off-by: Jonathan Nieder <[email-masked]>
---
Hi,

Another patch that was sitting around in my tree.  (I had the somewhat
insane idea of turning on as many warnings as feasible and getting git
to build with -Werror.  The effect on running time for tests was
encouraging but within noise.)

While it might make sense to do something like this for error()
itself, I don't know a clean and portable way to make a variadic macro
or inline function.

Anyway, maybe this can provide some amusement.

 cache.h  |    8 +++++++-
 config.c |    4 ++--
 2 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/cache.h b/cache.h
index c4ef999..c8ce53a 100644
--- a/cache.h
+++ b/cache.h
@@ -1022,10 +1022,16 @@ 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 git_config_global(void);
-extern int config_error_nonbool(const char *);
 extern const char *get_log_output_encoding(void);
 extern const char *get_commit_output_encoding(void);
 
+extern void config_print_error_nonbool(const char *);
+static inline int config_error_nonbool(const char *var)
+{
+	config_print_error_nonbool(var);
+	return -1;
+}
+
 extern const char *config_exclusive_filename;
 
 #define MAX_GITNAME (1000)
diff --git a/config.c b/config.c
index b94de8f..cf41c1c 100644
--- a/config.c
+++ b/config.c
@@ -1506,7 +1506,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").
  */
-int config_error_nonbool(const char *var)
+void config_print_error_nonbool(const char *var)
 {
-	return error("Missing value for '%s'", var);
+	error("Missing value for '%s'", var);
 }
-- 
1.7.4.1