Dune Core Modules (unstable)
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__))