5#ifndef DUNE_COMMON_STD_ASSUME_HH
6#define DUNE_COMMON_STD_ASSUME_HH
24#ifdef __has_cpp_attribute
25 #if __has_cpp_attribute(assume) >= 202207L
26 #define DUNE_ASSUME(...) [[assume(__VA_ARGS__)]]
32 #if defined(__clang__) && defined(__has_builtin)
33 #if __has_builtin(__builtin_assume)
34 #define DUNE_ASSUME(...) __builtin_assume(__VA_ARGS__)
36 #elif defined(_MSC_VER)
37 #define DUNE_ASSUME(...) __assume(__VA_ARGS__)
38 #elif defined(__GNUC__)
40 #define DUNE_ASSUME(...) __attribute__((__assume__(__VA_ARGS__)))
46#if !defined(DUNE_ASSUME) && defined(NDEBUG)
48 #if __cpp_lib_unreachable >= 202202L
49 #define DUNE_ASSUME(...) do { if (!bool(__VA_ARGS__)) ::std::unreachable(); } while(0)
50 #elif defined(__GNUC__)
51 #define DUNE_ASSUME(...) do { if (!bool(__VA_ARGS__)) __builtin_unreachable(); } while(0)
52 #elif defined(__has_builtin)
53 #if __has_builtin(__builtin_unreachable)
54 #define DUNE_ASSUME(...) do { if (!bool(__VA_ARGS__)) __builtin_unreachable(); } while(0)
58 #define DUNE_ASSUME(...) do { if (!bool(__VA_ARGS__)) std::abort(); } while(0)
65 #define DUNE_ASSUME(...) assert(bool(__VA_ARGS__))