16#if !defined(FEAT_COMPILER) && defined(__clang__) 
   19#define FEAT_COMPILER_CLANG (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) 
   22#define FEAT_COMPILER ("clang " __clang_version__)
 
   24#if(__clang_major__ >= 15) 
   25#define FEAT_DISABLE_WARNINGS _Pragma("clang diagnostic push") \
 
   26  _Pragma("clang diagnostic ignored \"-Wall\"")
 
   27  _Pragma(
"clang diagnostic ignored \"-Wunused-variable\"") \
 
   28  _Pragma(
"clang diagnostic ignored \"-Wunused-parameter\"") \
 
   29  _Pragma(
"clang diagnostic ignored \"-Wsign-compare\"") \
 
   30  _Pragma(
"clang diagnostic ignored \"-Wconversion\"") \
 
   31  _Pragma(
"clang diagnostic ignored \"-Wmismatched-tags\"") \
 
   32  _Pragma(
"clang diagnostic ignored \"-Wignored-qualifiers\"") \
 
   33  _Pragma(
"clang diagnostic ignored \"-Wcast-qual\"") \
 
   34  _Pragma(
"clang diagnostic ignored \"-Wdeprecated-declarations\"") \
 
   35  _Pragma(
"clang diagnostic ignored \"-Wshadow\"") \
 
   36  _Pragma(
"clang diagnostic ignored \"-Wundef\"") \
 
   37  _Pragma(
"clang diagnostic ignored \"-Wimplicit-fallthrough\"") \
 
   38  _Pragma(
"clang diagnostic ignored \"-Wcomma\"") \
 
   39  _Pragma(
"clang diagnostic ignored \"-Wextra-semi\"") \
 
   40  _Pragma(
"clang diagnostic ignored \"-Wextra-semi-stmt\"") \
 
   41  _Pragma(
"clang diagnostic ignored \"-Wc++98-compat-extra-semi\"") \
 
   42  _Pragma(
"clang diagnostic ignored \"-Wdeprecated-builtins\"") \
 
   43  _Pragma(
"clang diagnostic ignored \"-Wsign-conversion\"")
 
   44#elif(__clang_major__ >= 8) 
   45#define FEAT_DISABLE_WARNINGS _Pragma("clang diagnostic push") \
 
   46  _Pragma("clang diagnostic ignored \"-Wunused-variable\"") \
 
   47  _Pragma("clang diagnostic ignored \"-Wunused-parameter\"") \
 
   48  _Pragma("clang diagnostic ignored \"-Wsign-compare\"") \
 
   49  _Pragma("clang diagnostic ignored \"-Wconversion\"") \
 
   50  _Pragma("clang diagnostic ignored \"-Wmismatched-tags\"") \
 
   51  _Pragma("clang diagnostic ignored \"-Wignored-qualifiers\"") \
 
   52  _Pragma("clang diagnostic ignored \"-Wcast-qual\"") \
 
   53  _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") \
 
   54  _Pragma("clang diagnostic ignored \"-Wshadow\"") \
 
   55  _Pragma("clang diagnostic ignored \"-Wundef\"") \
 
   56  _Pragma("clang diagnostic ignored \"-Wimplicit-fallthrough\"") \
 
   57  _Pragma("clang diagnostic ignored \"-Wcomma\"") \
 
   58  _Pragma("clang diagnostic ignored \"-Wextra-semi\"") \
 
   59  _Pragma("clang diagnostic ignored \"-Wextra-semi-stmt\"") \
 
   60  _Pragma("clang diagnostic ignored \"-Wc++98-compat-extra-semi\"")
 
   61#elif(__clang_major__ >= 4) 
   62#define FEAT_DISABLE_WARNINGS _Pragma("clang diagnostic push") \
 
   63  _Pragma("clang diagnostic ignored \"-Wunused-variable\"") \
 
   64  _Pragma("clang diagnostic ignored \"-Wunused-parameter\"") \
 
   65  _Pragma("clang diagnostic ignored \"-Wsign-compare\"") \
 
   66  _Pragma("clang diagnostic ignored \"-Wconversion\"") \
 
   67  _Pragma("clang diagnostic ignored \"-Wmismatched-tags\"") \
 
   68  _Pragma("clang diagnostic ignored \"-Wignored-qualifiers\"") \
 
   69  _Pragma("clang diagnostic ignored \"-Wcast-qual\"") \
 
   70  _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") \
 
   71  _Pragma("clang diagnostic ignored \"-Wshadow\"") \
 
   72  _Pragma("clang diagnostic ignored \"-Wundef\"") \
 
   73  _Pragma("clang diagnostic ignored \"-Wimplicit-fallthrough\"") \
 
   74  _Pragma("clang diagnostic ignored \"-Wcomma\"")
 
   76#define FEAT_DISABLE_WARNINGS _Pragma("clang diagnostic push") \
 
   77  _Pragma("clang diagnostic ignored \"-Wunused-variable\"") \
 
   78  _Pragma("clang diagnostic ignored \"-Wconversion\"") \
 
   79  _Pragma("clang diagnostic ignored \"-Wmismatched-tags\"") \
 
   80  _Pragma("clang diagnostic ignored \"-Wignored-qualifiers\"")
 
   83#define FEAT_RESTORE_WARNINGS _Pragma("clang diagnostic pop")
 
   85#define FEAT_PRAGMA_IVDEP _Pragma("omp simd")
 
   88#define NOINLINE __attribute__((noinline)) 
   90#define FORCE_INLINE inline __attribute__((always_inline))