From f14d7e06bba5886a0e41a801fa27a8faecde3e43 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Sun, 17 Feb 2019 07:13:14 -0700 Subject: [PATCH] Make noreturn attribute valid only for GNUC implementations .. with an `exit` call to make the declaration clearly true to the compiler. --- racket/src/racket/include/scheme.h | 9 +++++++++ racket/src/racket/src/error.c | 2 ++ racket/src/racket/src/schemef.h | 2 +- racket/src/racket/src/schemex.h | 2 +- 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/racket/src/racket/include/scheme.h b/racket/src/racket/include/scheme.h index 90026477d1..9cebae3bc9 100644 --- a/racket/src/racket/include/scheme.h +++ b/racket/src/racket/include/scheme.h @@ -252,6 +252,15 @@ extern "C" { #endif +/* The reason we need two preprocessor variables is that, in gcc/clang the + function attribute comes after the function declaration. However, + in MSVC the function attribute comes before the function declaration. */ +#ifdef __GNUC__ +#define NORETURN __attribute__((__noreturn__)) +#else +#define NORETURN +#endif + /* Allowed by all configurations, currently: */ #define MZ_CAN_ACCESS_THREAD_LOCAL_DIRECTLY diff --git a/racket/src/racket/src/error.c b/racket/src/racket/src/error.c index aa4c46f9b9..5c9a99c3ae 100644 --- a/racket/src/racket/src/error.c +++ b/racket/src/racket/src/error.c @@ -4412,6 +4412,8 @@ scheme_raise_exn(int id, ...) #else call_error(buffer, alen, scheme_false); #endif + + exit(0); /* should not get here, but makes NORETURN clearly true */ } #ifndef NO_SCHEME_EXNS diff --git a/racket/src/racket/src/schemef.h b/racket/src/racket/src/schemef.h index 28d81790f3..7b827a2bdf 100644 --- a/racket/src/racket/src/schemef.h +++ b/racket/src/racket/src/schemef.h @@ -198,7 +198,7 @@ MZ_EXTERN Scheme_On_Atomic_Timeout_Proc scheme_set_on_atomic_timeout(Scheme_On_A /*========================================================================*/ MZ_EXTERN void scheme_signal_error(const char *msg, ...); -MZ_EXTERN void scheme_raise_exn(int exnid, ...) __attribute__ ((noreturn)); +MZ_EXTERN void scheme_raise_exn(int exnid, ...) NORETURN; MZ_EXTERN void scheme_warning(char *msg, ...); MZ_EXTERN void scheme_raise(Scheme_Object *exn); diff --git a/racket/src/racket/src/schemex.h b/racket/src/racket/src/schemex.h index bd5a7a408c..e573bd99d8 100644 --- a/racket/src/racket/src/schemex.h +++ b/racket/src/racket/src/schemex.h @@ -139,7 +139,7 @@ Scheme_On_Atomic_Timeout_Proc (*scheme_set_on_atomic_timeout)(Scheme_On_Atomic_T /* error handling */ /*========================================================================*/ void (*scheme_signal_error)(const char *msg, ...); -void (*scheme_raise_exn)(int exnid, ...) __attribute__ ((noreturn)); +void (*scheme_raise_exn)(int exnid, ...) NORETURN; void (*scheme_warning)(char *msg, ...); void (*scheme_raise)(Scheme_Object *exn); int (*scheme_log_level_p)(Scheme_Logger *logger, int level);