test_macros.h revision 570f32c8dd02715d2448e69b47fc1c3fae90c9b1
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(__clang__) 56#define TEST_COMPILER_CLANG 57# if defined(__apple_build_version__) 58# define TEST_COMPILER_APPLE_CLANG 59# endif 60#elif defined(_MSC_VER) 61# define TEST_COMPILER_C1XX 62#elif defined(__GNUC__) 63# define TEST_COMPILER_GCC 64#endif 65 66#if defined(__apple_build_version__) 67#define TEST_APPLE_CLANG_VER (__clang_major__ * 100) + __clang_minor__ 68#elif defined(__clang_major__) 69#define TEST_CLANG_VER (__clang_major__ * 100) + __clang_minor__ 70#elif defined(__GNUC__) 71#define TEST_GCC_VER (__GNUC__ * 100 + __GNUC_MINOR__) 72#endif 73 74/* Make a nice name for the standard version */ 75#ifndef TEST_STD_VER 76#if __cplusplus <= 199711L 77# define TEST_STD_VER 3 78#elif __cplusplus <= 201103L 79# define TEST_STD_VER 11 80#elif __cplusplus <= 201402L 81# define TEST_STD_VER 14 82#else 83# define TEST_STD_VER 16 // current year; greater than current standard 84#endif 85#endif 86 87// Attempt to deduce GCC version 88#if defined(_LIBCPP_VERSION) && TEST_HAS_INCLUDE(<features.h>) 89#include <features.h> 90#define TEST_HAS_GLIBC 91#define TEST_GLIBC_PREREQ(major, minor) __GLIBC_PREREQ(major, minor) 92#endif 93 94/* Features that were introduced in C++14 */ 95#if TEST_STD_VER >= 14 96#define TEST_HAS_EXTENDED_CONSTEXPR 97#define TEST_HAS_VARIABLE_TEMPLATES 98#endif 99 100/* Features that were introduced after C++14 */ 101#if TEST_STD_VER > 14 102#endif 103 104#if TEST_STD_VER >= 11 105#define TEST_ALIGNOF(...) alignof(__VA_ARGS__) 106#define TEST_ALIGNAS(...) alignas(__VA_ARGS__) 107#define TEST_CONSTEXPR constexpr 108#define TEST_NOEXCEPT noexcept 109#define TEST_NOEXCEPT_COND(...) noexcept(__VA_ARGS__) 110# if TEST_STD_VER >= 14 111# define TEST_CONSTEXPR_CXX14 constexpr 112# else 113# define TEST_CONSTEXPR_CXX14 114# endif 115# if TEST_STD_VER > 14 116# define TEST_THROW_SPEC(...) 117# else 118# define TEST_THROW_SPEC(...) throw(__VA_ARGS__) 119# endif 120#else 121#define TEST_ALIGNOF(...) __alignof(__VA_ARGS__) 122#define TEST_ALIGNAS(...) __attribute__((__aligned__(__VA_ARGS__))) 123#define TEST_CONSTEXPR 124#define TEST_CONSTEXPR_CXX14 125#define TEST_NOEXCEPT throw() 126#define TEST_NOEXCEPT_COND(...) 127#define TEST_THROW_SPEC(...) throw(__VA_ARGS__) 128#endif 129 130#define TEST_ALIGNAS_TYPE(...) TEST_ALIGNAS(TEST_ALIGNOF(__VA_ARGS__)) 131 132#if !TEST_HAS_FEATURE(cxx_rtti) && !defined(__cpp_rtti) \ 133 && !defined(__GXX_RTTI) 134#define TEST_HAS_NO_RTTI 135#endif 136 137#if !TEST_HAS_FEATURE(cxx_exceptions) && !defined(__cpp_exceptions) \ 138 && !defined(__EXCEPTIONS) 139#define TEST_HAS_NO_EXCEPTIONS 140#endif 141 142#if TEST_HAS_FEATURE(address_sanitizer) || TEST_HAS_FEATURE(memory_sanitizer) || \ 143 TEST_HAS_FEATURE(thread_sanitizer) 144#define TEST_HAS_SANITIZERS 145#endif 146 147#if defined(_LIBCPP_NORETURN) 148#define TEST_NORETURN _LIBCPP_NORETURN 149#else 150#define TEST_NORETURN [[noreturn]] 151#endif 152 153#if TEST_STD_VER < 11 154#define ASSERT_NOEXCEPT(...) 155#define ASSERT_NOT_NOEXCEPT(...) 156#else 157#define ASSERT_NOEXCEPT(...) \ 158 static_assert(noexcept(__VA_ARGS__), "Operation must be noexcept") 159 160#define ASSERT_NOT_NOEXCEPT(...) \ 161 static_assert(!noexcept(__VA_ARGS__), "Operation must NOT be noexcept") 162#endif 163 164/* Macros for testing libc++ specific behavior and extensions */ 165#if defined(_LIBCPP_VERSION) 166#define LIBCPP_ASSERT(...) assert(__VA_ARGS__) 167#define LIBCPP_STATIC_ASSERT(...) static_assert(__VA_ARGS__) 168#define LIBCPP_ASSERT_NOEXCEPT(...) ASSERT_NOEXCEPT(__VA_ARGS__) 169#define LIBCPP_ASSERT_NOT_NOEXCEPT(...) ASSERT_NOT_NOEXCEPT(__VA_ARGS__) 170#define LIBCPP_ONLY(...) __VA_ARGS__ 171#else 172#define LIBCPP_ASSERT(...) ((void)0) 173#define LIBCPP_STATIC_ASSERT(...) ((void)0) 174#define LIBCPP_ASSERT_NOEXCEPT(...) ((void)0) 175#define LIBCPP_ASSERT_NOT_NOEXCEPT(...) ((void)0) 176#define LIBCPP_ONLY(...) ((void)0) 177#endif 178 179namespace test_macros_detail { 180template <class T, class U> 181struct is_same { enum { value = 0};} ; 182template <class T> 183struct is_same<T, T> { enum {value = 1}; }; 184} // namespace test_macros_detail 185 186#define ASSERT_SAME_TYPE(...) \ 187 static_assert(test_macros_detail::is_same<__VA_ARGS__>::value, \ 188 "Types differ uexpectedly") 189 190#ifndef TEST_HAS_NO_EXCEPTIONS 191#define TEST_THROW(...) throw __VA_ARGS__ 192#else 193#if defined(__GNUC__) 194#define TEST_THROW(...) __builtin_abort() 195#else 196#include <stdlib.h> 197#define TEST_THROW(...) ::abort() 198#endif 199#endif 200 201#if defined(__GNUC__) || defined(__clang__) 202template <class Tp> 203inline void DoNotOptimize(Tp const& value) { 204 asm volatile("" : : "g"(value) : "memory"); 205} 206#else 207#include <intrin.h> 208template <class Tp> 209inline void DoNotOptimize(Tp const& value) { 210 const volatile void* volatile = __builtin_addressof(value); 211 _ReadWriteBarrier(); 212} 213#endif 214 215#if defined(__GNUC__) 216#pragma GCC diagnostic pop 217#endif 218 219#endif // SUPPORT_TEST_MACROS_HPP 220