Go to the documentation of this file.
    5#ifndef DUNE_COMMON_STD_ASSUME_HH 
    6#define DUNE_COMMON_STD_ASSUME_HH 
   27#ifdef __has_cpp_attribute 
   28  #if __has_cpp_attribute(assume) >= 202207L 
   29    #define DUNE_ASSUME(...) [[assume(__VA_ARGS__)]] 
   35  #if defined(__clang__) && defined(__has_builtin) 
   36    #if __has_builtin(__builtin_assume) 
   37      #define DUNE_ASSUME(...) __builtin_assume(__VA_ARGS__) 
   39  #elif defined(_MSC_VER) 
   40    #define DUNE_ASSUME(...) __assume(__VA_ARGS__) 
   41  #elif defined(__GNUC__) 
   43      #define DUNE_ASSUME(...) __attribute__((__assume__(__VA_ARGS__))) 
   49#if !defined(DUNE_ASSUME) && defined(NDEBUG) 
   51  #if __cpp_lib_unreachable >= 202202L 
   52    #define DUNE_ASSUME(...) do { if (!bool(__VA_ARGS__)) ::std::unreachable(); } while(0) 
   53  #elif defined(__GNUC__) 
   54    #define DUNE_ASSUME(...) do { if (!bool(__VA_ARGS__)) __builtin_unreachable(); } while(0) 
   55  #elif defined(__has_builtin) 
   56    #if __has_builtin(__builtin_unreachable) 
   57      #define DUNE_ASSUME(...) do { if (!bool(__VA_ARGS__)) __builtin_unreachable(); } while(0) 
   61    #define DUNE_ASSUME(...) do { if (!bool(__VA_ARGS__)) std::abort(); } while(0) 
   68  #define DUNE_ASSUME(...) assert(bool(__VA_ARGS__))