From e908591baaf74db521c973369b15951184e2134b Mon Sep 17 00:00:00 2001
From: Paul Sokolovsky <pfalcon@users.sourceforge.net>
Date: Wed, 30 Apr 2014 05:35:18 +0300
Subject: [PATCH] py: Abstract no-return attribute for functions a bit.

---
 py/mpconfig.h | 3 +++
 py/nlr.h      | 5 +++--
 py/objstr.c   | 2 +-
 3 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/py/mpconfig.h b/py/mpconfig.h
index 13918e839..04d4a7ddc 100644
--- a/py/mpconfig.h
+++ b/py/mpconfig.h
@@ -230,3 +230,6 @@ typedef double mp_float_t;
 #define INT_FMT "%d"
 #endif
 #endif //INT_FMT
+
+// Modifier for function which doesn't return
+#define NORETURN __attribute__((noreturn))
diff --git a/py/nlr.h b/py/nlr.h
index 662928545..c7b592843 100644
--- a/py/nlr.h
+++ b/py/nlr.h
@@ -3,6 +3,7 @@
 
 #include <limits.h>
 #include <setjmp.h>
+#include "mpconfig.h"
 
 typedef struct _nlr_buf_t nlr_buf_t;
 struct _nlr_buf_t {
@@ -33,7 +34,7 @@ struct _nlr_buf_t {
 
 #if MICROPY_NLR_SETJMP
 extern nlr_buf_t *nlr_setjmp_top;
-void nlr_setjmp_jump(void *val) __attribute__((noreturn));
+NORETURN void nlr_setjmp_jump(void *val);
 // nlr_push() must be defined as a macro, because "The stack context will be
 // invalidated if the function which called setjmp() returns."
 #define nlr_push(buf) ((buf)->prev = nlr_setjmp_top, nlr_setjmp_top = (buf), setjmp((buf)->jmpbuf))
@@ -42,7 +43,7 @@ void nlr_setjmp_jump(void *val) __attribute__((noreturn));
 #else
 unsigned int nlr_push(nlr_buf_t *);
 void nlr_pop(void);
-void nlr_jump(void *val) __attribute__((noreturn));
+NORETURN void nlr_jump(void *val);
 #endif
 
 // This must be implemented by a port.  It's called by nlr_jump
diff --git a/py/objstr.c b/py/objstr.c
index 6819a4ad6..aab1a4492 100644
--- a/py/objstr.c
+++ b/py/objstr.c
@@ -27,7 +27,7 @@ const mp_obj_t mp_const_empty_bytes;
 STATIC mp_obj_t mp_obj_new_str_iterator(mp_obj_t str);
 STATIC mp_obj_t mp_obj_new_bytes_iterator(mp_obj_t str);
 STATIC mp_obj_t str_new(const mp_obj_type_t *type, const byte* data, uint len);
-STATIC void bad_implicit_conversion(mp_obj_t self_in) __attribute__((noreturn));
+STATIC NORETURN void bad_implicit_conversion(mp_obj_t self_in);
 
 /******************************************************************************/
 /* str                                                                        */
-- 
GitLab