diff --git a/changelogs/changelog_2_0_0.md b/changelogs/changelog_2_0_0.md index fa2572859188..5707cf955042 100644 --- a/changelogs/changelog_2_0_0.md +++ b/changelogs/changelog_2_0_0.md @@ -256,8 +256,6 @@ declared when they are not available on the backend. Previously it would call `doAssert false` at runtime despite the condition being compile-time. -- Pragma `{.inline.}` generates `__forceinline` if `__has_attribute(__forceinline)` for GCC and Clang. - - `strutils.split` and `strutils.rsplit` now forbid an empty separator. - Relative imports will not resolve to searched paths anymore, e.g. `import ./tables` now reports an error properly. diff --git a/lib/nimbase.h b/lib/nimbase.h index 1b9268881ee3..3a1289b6faf6 100644 --- a/lib/nimbase.h +++ b/lib/nimbase.h @@ -84,29 +84,20 @@ __AVR__ # define __DECLSPEC_SUPPORTED 1 #endif - -/* Calling conventions and inline attributes for the supported C compilers */ -#if defined(__GNUC__) || defined(__clang__) /* GCC and Clang */ -# if __has_attribute(__forceinline) -# define N_INLINE(rettype, name) __attribute__((__forceinline)) rettype name -# else -# define N_INLINE(rettype, name) inline rettype name -# endif -#elif defined(_MSC_VER) /* MSVC */ -# if _MSC_VER > 1200 -# define N_INLINE(rettype, name) __forceinline rettype name -# else -# define N_INLINE(rettype, name) inline rettype name -# endif -#elif defined(__TINYC__) || defined(__BORLANDC__) /* TinyC and BorlandC */ -# define N_INLINE(rettype, name) __inline rettype name -#elif defined(__AVR__) /* Atmel Advanced Virtual RISC */ +/* calling convention mess ----------------------------------------------- */ +#if defined(__GNUC__) || defined(__TINYC__) + /* these should support C99's inline */ # define N_INLINE(rettype, name) inline rettype name -#else /* Unsupported C compilers */ -# define N_INLINE(rettype, name) rettype name +#elif defined(__BORLANDC__) || defined(_MSC_VER) +/* Borland's compiler is really STRANGE here; note that the __fastcall + keyword cannot be before the return type, but __inline cannot be after + the return type, so we do not handle this mess in the code generator + but rather here. */ +# define N_INLINE(rettype, name) __inline rettype name +#else /* others are less picky: */ +# define N_INLINE(rettype, name) rettype __inline name #endif - #define N_INLINE_PTR(rettype, name) rettype (*name) #if defined(__cplusplus)