28#include "ruby/internal/config.h"
29#include "ruby/internal/cast.h"
35#if RBIMPL_COMPILER_SINCE(MSVC, 13, 10, 0)
36# define RBIMPL_HAVE___ASSUME
38#elif RBIMPL_COMPILER_SINCE(Intel, 13, 0, 0)
39# define RBIMPL_HAVE___ASSUME
44#if RBIMPL_HAS_BUILTIN(__builtin_unreachable)
45# define RBIMPL_UNREACHABLE_RETURN(_) __builtin_unreachable()
47#elif defined(RBIMPL_HAVE___ASSUME)
48# define RBIMPL_UNREACHABLE_RETURN(_) return (__assume(0), (_))
51# define RBIMPL_UNREACHABLE_RETURN(_) return (_)
55#if RBIMPL_HAS_BUILTIN(__builtin_unreachable)
56# define RBIMPL_UNREACHABLE __builtin_unreachable
58#elif defined(RBIMPL_HAVE___ASSUME)
59# define RBIMPL_UNREACHABLE() __assume(0)
63#if RBIMPL_COMPILER_SINCE(Intel, 13, 0, 0)
66# define RBIMPL_ASSUME(expr) \
67 RBIMPL_WARNING_PUSH() \
68 RBIMPL_WARNING_IGNORED(2261) \
72#elif defined(RBIMPL_HAVE___ASSUME)
73# define RBIMPL_ASSUME __assume
75#elif RBIMPL_HAS_BUILTIN(__builtin_assume)
76# define RBIMPL_ASSUME __builtin_assume
78#elif ! defined(RBIMPL_UNREACHABLE)
79# define RBIMPL_ASSUME(_) RBIMPL_CAST((void)(_))
82# define RBIMPL_ASSUME(_) \
83 (RB_LIKELY(!!(_)) ? RBIMPL_CAST((void)0) : RBIMPL_UNREACHABLE())
86#if ! defined(RBIMPL_UNREACHABLE)
87# define RBIMPL_UNREACHABLE() RBIMPL_ASSUME(0)
Defines RBIMPL_COMPILER_SINCE.
Defines RBIMPL_HAS_BUILTIN.
Defines RBIMPL_WARNING_PUSH.