Home | History | Annotate | Download | only in support
      1 // -*- C++ -*-
      2 //===---------------------------- test_macros.h ---------------------------===//
      3 //
      4 //                     The LLVM Compiler Infrastructure
      5 //
      6 // This file is dual licensed under the MIT and the University of Illinois Open
      7 // Source Licenses. See LICENSE.TXT for details.
      8 //
      9 //===----------------------------------------------------------------------===//
     10 
     11 #ifndef SUPPORT_TEST_MACROS_HPP
     12 #define SUPPORT_TEST_MACROS_HPP
     13 
     14 #include <ciso646> // Get STL specific macros like _LIBCPP_VERSION
     15 
     16 #if defined(__GNUC__)
     17 #pragma GCC diagnostic push
     18 #pragma GCC diagnostic ignored "-Wvariadic-macros"
     19 #endif
     20 
     21 #define TEST_CONCAT1(X, Y) X##Y
     22 #define TEST_CONCAT(X, Y) TEST_CONCAT1(X, Y)
     23 
     24 #ifdef __has_feature
     25 #define TEST_HAS_FEATURE(X) __has_feature(X)
     26 #else
     27 #define TEST_HAS_FEATURE(X) 0
     28 #endif
     29 
     30 #ifdef __has_include
     31 #define TEST_HAS_INCLUDE(X) __has_include(X)
     32 #else
     33 #define TEST_HAS_INCLUDE(X) 0
     34 #endif
     35 
     36 #ifdef __has_extension
     37 #define TEST_HAS_EXTENSION(X) __has_extension(X)
     38 #else
     39 #define TEST_HAS_EXTENSION(X) 0
     40 #endif
     41 
     42 #ifdef __has_builtin
     43 #define TEST_HAS_BUILTIN(X) __has_builtin(X)
     44 #else
     45 #define TEST_HAS_BUILTIN(X) 0
     46 #endif
     47 #ifdef __is_identifier
     48 // '__is_identifier' returns '0' if '__x' is a reserved identifier provided by
     49 // the compiler and '1' otherwise.
     50 #define TEST_HAS_BUILTIN_IDENTIFIER(X) !__is_identifier(X)
     51 #else
     52 #define TEST_HAS_BUILTIN_IDENTIFIER(X) 0
     53 #endif
     54 
     55 #if defined(__apple_build_version__)
     56 #define TEST_APPLE_CLANG_VER (__clang_major__ * 100) + __clang_minor__
     57 #elif defined(__clang_major__)
     58 #define TEST_CLANG_VER (__clang_major__ * 100) + __clang_minor__
     59 #elif defined(__GNUC__)
     60 #define TEST_GCC_VER (__GNUC__ * 100 + __GNUC_MINOR__)
     61 #endif
     62 
     63 /* Make a nice name for the standard version */
     64 #ifndef TEST_STD_VER
     65 #if  __cplusplus <= 199711L
     66 # define TEST_STD_VER 3
     67 #elif __cplusplus <= 201103L
     68 # define TEST_STD_VER 11
     69 #elif __cplusplus <= 201402L
     70 # define TEST_STD_VER 14
     71 #else
     72 # define TEST_STD_VER 16    // current year; greater than current standard
     73 #endif
     74 #endif
     75 
     76 // Attempt to deduce GCC version
     77 #if defined(_LIBCPP_VERSION) && TEST_HAS_INCLUDE(<features.h>)
     78 #include <features.h>
     79 #define TEST_HAS_GLIBC
     80 #define TEST_GLIBC_PREREQ(major, minor) __GLIBC_PREREQ(major, minor)
     81 #endif
     82 
     83 /* Features that were introduced in C++14 */
     84 #if TEST_STD_VER >= 14
     85 #define TEST_HAS_EXTENDED_CONSTEXPR
     86 #define TEST_HAS_VARIABLE_TEMPLATES
     87 #endif
     88 
     89 /* Features that were introduced after C++14 */
     90 #if TEST_STD_VER > 14
     91 #endif
     92 
     93 #if TEST_STD_VER >= 11
     94 #define TEST_ALIGNOF(...) alignof(__VA_ARGS__)
     95 #define TEST_ALIGNAS(...) alignas(__VA_ARGS__)
     96 #define TEST_CONSTEXPR constexpr
     97 #define TEST_NOEXCEPT noexcept
     98 #define TEST_NOEXCEPT_COND(...) noexcept(__VA_ARGS__)
     99 # if TEST_STD_VER >= 14
    100 #   define TEST_CONSTEXPR_CXX14 constexpr
    101 # else
    102 #   define TEST_CONSTEXPR_CXX14
    103 # endif
    104 # if TEST_STD_VER > 14
    105 #   define TEST_THROW_SPEC(...)
    106 # else
    107 #   define TEST_THROW_SPEC(...) throw(__VA_ARGS__)
    108 # endif
    109 #else
    110 #define TEST_ALIGNOF(...) __alignof(__VA_ARGS__)
    111 #define TEST_ALIGNAS(...) __attribute__((__aligned__(__VA_ARGS__)))
    112 #define TEST_CONSTEXPR
    113 #define TEST_CONSTEXPR_CXX14
    114 #define TEST_NOEXCEPT throw()
    115 #define TEST_NOEXCEPT_COND(...)
    116 #define TEST_THROW_SPEC(...) throw(__VA_ARGS__)
    117 #endif
    118 
    119 #define TEST_ALIGNAS_TYPE(...) TEST_ALIGNAS(TEST_ALIGNOF(__VA_ARGS__))
    120 
    121 #if !TEST_HAS_FEATURE(cxx_rtti) && !defined(__cpp_rtti) \
    122     && !defined(__GXX_RTTI)
    123 #define TEST_HAS_NO_RTTI
    124 #endif
    125 
    126 #if !TEST_HAS_FEATURE(cxx_exceptions) && !defined(__cpp_exceptions) \
    127      && !defined(__EXCEPTIONS)
    128 #define TEST_HAS_NO_EXCEPTIONS
    129 #endif
    130 
    131 #if TEST_HAS_FEATURE(address_sanitizer) || TEST_HAS_FEATURE(memory_sanitizer) || \
    132     TEST_HAS_FEATURE(thread_sanitizer)
    133 #define TEST_HAS_SANITIZERS
    134 #endif
    135 
    136 #if defined(_LIBCPP_NORETURN)
    137 #define TEST_NORETURN _LIBCPP_NORETURN
    138 #else
    139 #define TEST_NORETURN [[noreturn]]
    140 #endif
    141 
    142 #define ASSERT_NOEXCEPT(...) \
    143     static_assert(noexcept(__VA_ARGS__), "Operation must be noexcept")
    144 
    145 #define ASSERT_NOT_NOEXCEPT(...) \
    146     static_assert(!noexcept(__VA_ARGS__), "Operation must NOT be noexcept")
    147 
    148 /* Macros for testing libc++ specific behavior and extensions */
    149 #if defined(_LIBCPP_VERSION)
    150 #define LIBCPP_ASSERT(...) assert(__VA_ARGS__)
    151 #define LIBCPP_STATIC_ASSERT(...) static_assert(__VA_ARGS__)
    152 #define LIBCPP_ASSERT_NOEXCEPT(...) ASSERT_NOEXCEPT(__VA_ARGS__)
    153 #define LIBCPP_ASSERT_NOT_NOEXCEPT(...) ASSERT_NOT_NOEXCEPT(__VA_ARGS__)
    154 #define LIBCPP_ONLY(...) __VA_ARGS__
    155 #else
    156 #define LIBCPP_ASSERT(...) ((void)0)
    157 #define LIBCPP_STATIC_ASSERT(...) ((void)0)
    158 #define LIBCPP_ASSERT_NOEXCEPT(...) ((void)0)
    159 #define LIBCPP_ASSERT_NOT_NOEXCEPT(...) ((void)0)
    160 #define LIBCPP_ONLY(...) ((void)0)
    161 #endif
    162 
    163 namespace test_macros_detail {
    164 template <class T, class U>
    165 struct is_same { enum { value = 0};} ;
    166 template <class T>
    167 struct is_same<T, T> { enum {value = 1}; };
    168 } // namespace test_macros_detail
    169 
    170 #define ASSERT_SAME_TYPE(...) \
    171     static_assert(test_macros_detail::is_same<__VA_ARGS__>::value, \
    172                  "Types differ uexpectedly")
    173 
    174 #ifndef TEST_HAS_NO_EXCEPTIONS
    175 #define TEST_THROW(...) throw __VA_ARGS__
    176 #else
    177 #if defined(__GNUC__)
    178 #define TEST_THROW(...) __builtin_abort()
    179 #else
    180 #include <stdlib.h>
    181 #define TEST_THROW(...) ::abort()
    182 #endif
    183 #endif
    184 
    185 #if defined(__GNUC__) || defined(__clang__)
    186 template <class Tp>
    187 inline void DoNotOptimize(Tp const& value) {
    188   asm volatile("" : : "g"(value) : "memory");
    189 }
    190 #else
    191 #include <intrin.h>
    192 template <class Tp>
    193 inline void DoNotOptimize(Tp const& value) {
    194   const volatile void* volatile = __builtin_addressof(value);
    195   _ReadWriteBarrier();
    196 }
    197 #endif
    198 
    199 #if defined(__GNUC__)
    200 #pragma GCC diagnostic pop
    201 #endif
    202 
    203 #endif // SUPPORT_TEST_MACROS_HPP
    204