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__)) 71 #endif // DUNE_COMMON_STD_ASSUME_HH