test_macros.h revision 375e2f669cb882eb9a9700ab7fd1de8d2b57665f
18f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier// -*- C++ -*-
28f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier//===---------------------------- test_macros.h ---------------------------===//
38f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier//
48f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier//                     The LLVM Compiler Infrastructure
58f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier//
68f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier// This file is dual licensed under the MIT and the University of Illinois Open
78f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier// Source Licenses. See LICENSE.TXT for details.
88f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier//
98f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier//===----------------------------------------------------------------------===//
108f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier
118f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#ifndef SUPPORT_TEST_MACROS_HPP
128f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define SUPPORT_TEST_MACROS_HPP
138f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier
14375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#include <ciso646> // Get STL specific macros like _LIBCPP_VERSION
15375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier
168f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_CONCAT1(X, Y) X##Y
178f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_CONCAT(X, Y) TEST_CONCAT1(X, Y)
188f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier
197175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#ifdef __has_feature
207175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#define TEST_HAS_FEATURE(X) __has_feature(X)
217175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#else
227175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#define TEST_HAS_FEATURE(X) 0
237175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#endif
247175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
258f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#ifdef __has_extension
268f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_HAS_EXTENSION(X) __has_extension(X)
278f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#else
288f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_HAS_EXTENSION(X) 0
298f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#endif
308f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier
3176d2446cf4a5e191221d41a44248892a9a6ab37cEric Fiselier#ifdef __has_builtin
3276d2446cf4a5e191221d41a44248892a9a6ab37cEric Fiselier#define TEST_HAS_BUILTIN(X) __has_builtin(X)
3376d2446cf4a5e191221d41a44248892a9a6ab37cEric Fiselier#else
3476d2446cf4a5e191221d41a44248892a9a6ab37cEric Fiselier#define TEST_HAS_BUILTIN(X) 0
3576d2446cf4a5e191221d41a44248892a9a6ab37cEric Fiselier#endif
3676d2446cf4a5e191221d41a44248892a9a6ab37cEric Fiselier
378f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier/* Make a nice name for the standard version */
388f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#if  __cplusplus <= 199711L
398f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier# define TEST_STD_VER 3
408f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#elif __cplusplus <= 201103L
418f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier# define TEST_STD_VER 11
428f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#elif __cplusplus <= 201402L
438f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier# define TEST_STD_VER 14
448f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#else
458f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier# define TEST_STD_VER 99    // greater than current standard
468f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#endif
478f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier
488f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier/* Features that were introduced in C++11 */
498f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#if TEST_STD_VER >= 11
508f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_HAS_RVALUE_REFERENCES
518f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_HAS_VARIADIC_TEMPLATES
528f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#endif
538f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier
548f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier/* Features that were introduced in C++14 */
558f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#if TEST_STD_VER >= 14
568f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_HAS_EXTENDED_CONSTEXPR
578f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_HAS_VARIABLE_TEMPLATES
588f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#endif
598f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier
608f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier/* Features that were introduced after C++14 */
618f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#if TEST_STD_VER > 14
628f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#endif
638f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier
648f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#if TEST_STD_VER >= 11
6500f4a49b0b76dea78a68ea2dd7333408f52caa5bEric Fiselier#define TEST_CONSTEXPR constexpr
668f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_NOEXCEPT noexcept
675ccbc4877466279badcf2b1b46afc641cc401851Eric Fiselier# if TEST_STD_VER >= 14
685ccbc4877466279badcf2b1b46afc641cc401851Eric Fiselier#   define TEST_CONSTEXPR_CXX14 constexpr
695ccbc4877466279badcf2b1b46afc641cc401851Eric Fiselier# else
705ccbc4877466279badcf2b1b46afc641cc401851Eric Fiselier#   define TEST_CONSTEXPR_CXX14
715ccbc4877466279badcf2b1b46afc641cc401851Eric Fiselier# endif
728f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#else
7300f4a49b0b76dea78a68ea2dd7333408f52caa5bEric Fiselier#define TEST_CONSTEXPR
745ccbc4877466279badcf2b1b46afc641cc401851Eric Fiselier#define TEST_CONSTEXPR_CXX14
758f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#define TEST_NOEXCEPT
768f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#endif
778f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier
787175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#if !TEST_HAS_FEATURE(cxx_rtti) && !defined(__cxx_rtti)
797175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#define TEST_HAS_NO_RTTI
807175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#endif
817175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
827175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#if !TEST_HAS_FEATURE(cxx_exceptions) && !defined(__cxx_exceptions)
837175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#define TEST_HAS_NO_EXCEPTIONS
847175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#endif
857175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
86d95ca09be4f47fb819a04439263757c204622d21Eric Fiselier#if TEST_HAS_FEATURE(address_sanitizer) || TEST_HAS_FEATURE(memory_sanitizer) || \
87d95ca09be4f47fb819a04439263757c204622d21Eric Fiselier    TEST_HAS_FEATURE(thread_sanitizer)
88d95ca09be4f47fb819a04439263757c204622d21Eric Fiselier#define TEST_HAS_SANITIZERS
89d95ca09be4f47fb819a04439263757c204622d21Eric Fiselier#endif
90d95ca09be4f47fb819a04439263757c204622d21Eric Fiselier
91375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier/* Macros for testing libc++ specific behavior and extensions */
92375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#if defined(_LIBCPP_VERSION)
93375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#define LIBCPP_ASSERT(...) assert(__VA_ARGS__)
94375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#define LIBCPP_STATIC_ASSERT(...) static_assert(__VA_ARGS__)
95375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#else
96375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#define LIBCPP_ASSERT(...) ((void)0)
97375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#define LIBCPP_STATIC_ASSERT(...) ((void)0)
98375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier#endif
99375e2f669cb882eb9a9700ab7fd1de8d2b57665fEric Fiselier
1008f1d85fde58bcff579994c6be57f37831759c956Eric Fiselier#endif // SUPPORT_TEST_MACROS_HPP
101