|
78 | 78 | #define NEED2UTF8(s) !(IS_ASCII(s) || (s)==NA_STRING || IS_UTF8(s)) |
79 | 79 | #define ENC2UTF8(s) (!NEED2UTF8(s) ? (s) : mkCharCE(translateCharUTF8(s), CE_UTF8)) |
80 | 80 |
|
| 81 | +// R has been providing a widely portable definition, but since that's not documented, define our own too |
| 82 | +#ifndef NORET |
| 83 | +# if defined(__GNUC__) && __GNUC__ >= 3 |
| 84 | +# define NORET __attribute__((__noreturn__)) |
| 85 | +# else |
| 86 | +# define NORET |
| 87 | +# endif |
| 88 | +#endif |
| 89 | + |
81 | 90 | // init.c |
82 | 91 | extern SEXP char_integer64; |
83 | 92 | extern SEXP char_ITime; |
@@ -147,7 +156,7 @@ uint64_t dtwiddle(double x); |
147 | 156 | SEXP forder(SEXP DT, SEXP by, SEXP retGrpArg, SEXP retStatsArg, SEXP sortGroupsArg, SEXP ascArg, SEXP naArg); |
148 | 157 | SEXP forderReuseSorting(SEXP DT, SEXP by, SEXP retGrpArg, SEXP retStatsArg, SEXP sortGroupsArg, SEXP ascArg, SEXP naArg, SEXP reuseSortingArg); // reuseSorting wrapper to forder |
149 | 158 | int getNumericRounding_C(void); |
150 | | -void internal_error_with_cleanup(const char *call_name, const char *format, ...); |
| 159 | +NORET void internal_error_with_cleanup(const char *call_name, const char *format, ...); |
151 | 160 |
|
152 | 161 | // reorder.c |
153 | 162 | SEXP reorder(SEXP x, SEXP order); |
@@ -263,7 +272,7 @@ SEXP islockedR(SEXP x); |
263 | 272 | bool need2utf8(SEXP x); |
264 | 273 | SEXP coerceUtf8IfNeeded(SEXP x); |
265 | 274 | SEXP coerceAs(SEXP x, SEXP as, SEXP copyArg); |
266 | | -void internal_error(const char *call_name, const char *format, ...); |
| 275 | +NORET void internal_error(const char *call_name, const char *format, ...); |
267 | 276 |
|
268 | 277 | // types.c |
269 | 278 | char *end(char *start); |
|
0 commit comments