From: Erik Faye-Lund <kusmabite@xxxxxxxxxxxxxx> Some compilers (including at least MSVC and ARM RVDS) supports NORETURN on function declarations, but not on function pointers. This patch makes it possible to define NORETURN for these compilers. Signed-off-by: Erik Faye-Lund <kusmabite@xxxxxxxxx> --- __attribute__((noreturn)) is, according to the GCC documentation, about two things: code generation (performance, really) and warnings. On the warnings-side, we need to keep the code warning-free for compilers who doesn't support noreturn anyway, so hiding potential warnings through this mechanism is probably not a good idea in the first place. We still want the performance-side of it, though. However, the only place this really makes a difference is to die and it's variants, since they can potentially be called many times (or so it seems from the compiler's point of view without a noreturn declaration). The function pointers are only called once we're already exiting, and they have only one potential call-site. I hope this all makes sense ;) git-compat-util.h | 2 +- usage.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/git-compat-util.h b/git-compat-util.h index 5876d91..15fe08e 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -183,7 +183,7 @@ 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))); -extern void set_die_routine(void (*routine)(const char *err, va_list params) NORETURN); +extern void set_die_routine(void (*routine)(const char *err, va_list params)); extern int prefixcmp(const char *str, const char *prefix); extern time_t tm_to_time_t(const struct tm *tm); diff --git a/usage.c b/usage.c index b6aea45..18d7f43 100644 --- a/usage.c +++ b/usage.c @@ -36,12 +36,12 @@ static void warn_builtin(const char *warn, va_list params) /* If we are in a dlopen()ed .so write to a global variable would segfault * (ugh), so keep things static. */ -static void (*usage_routine)(const char *err) NORETURN = usage_builtin; -static void (*die_routine)(const char *err, va_list params) NORETURN = die_builtin; +static void (*usage_routine)(const char *err) = usage_builtin; +static void (*die_routine)(const char *err, va_list params) = die_builtin; static void (*error_routine)(const char *err, va_list params) = error_builtin; static void (*warn_routine)(const char *err, va_list params) = warn_builtin; -void set_die_routine(void (*routine)(const char *err, va_list params) NORETURN) +void set_die_routine(void (*routine)(const char *err, va_list params)) { die_routine = routine; } -- 1.6.4.msysgit.0.16.gd92d4.dirty -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html