Manually force the use of __decltype in C++03 with Clang 3.4.
<string> uses `decltype` in a way incompatible with `__typeof__`. This is problematic when compiling <string> with Clang 3.4 because even though it provides `__decltype` libc++ still used `__typeof__` because clang 3.4 doesn't provide __is_identifier which libc++ uses to detect __decltype. This patch manually detects Clang 3.4 and properly configures for it. git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@292833 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -109,6 +109,9 @@
|
|||||||
|
|
||||||
#if defined(__clang__)
|
#if defined(__clang__)
|
||||||
#define _LIBCPP_COMPILER_CLANG
|
#define _LIBCPP_COMPILER_CLANG
|
||||||
|
# ifndef __apple_build_version__
|
||||||
|
# define _LIBCPP_CLANG_VER (__clang_major__ * 100 + __clang_minor__)
|
||||||
|
# endif
|
||||||
#elif defined(__GNUC__)
|
#elif defined(__GNUC__)
|
||||||
#define _LIBCPP_COMPILER_GCC
|
#define _LIBCPP_COMPILER_GCC
|
||||||
#elif defined(_MSC_VER)
|
#elif defined(_MSC_VER)
|
||||||
@@ -117,6 +120,10 @@
|
|||||||
#define _LIBCPP_COMPILER_IBM
|
#define _LIBCPP_COMPILER_IBM
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef _LIBCPP_CLANG_VER
|
||||||
|
#define _LIBCPP_CLANG_VER 0
|
||||||
|
#endif
|
||||||
|
|
||||||
// FIXME: ABI detection should be done via compiler builtin macros. This
|
// FIXME: ABI detection should be done via compiler builtin macros. This
|
||||||
// is just a placeholder until Clang implements such macros. For now assume
|
// is just a placeholder until Clang implements such macros. For now assume
|
||||||
// that Windows compilers pretending to be MSVC++ target the microsoft ABI.
|
// that Windows compilers pretending to be MSVC++ target the microsoft ABI.
|
||||||
@@ -754,7 +761,7 @@ template <unsigned> struct __static_assert_check {};
|
|||||||
|
|
||||||
#ifdef _LIBCPP_HAS_NO_DECLTYPE
|
#ifdef _LIBCPP_HAS_NO_DECLTYPE
|
||||||
// GCC 4.6 provides __decltype in all standard modes.
|
// GCC 4.6 provides __decltype in all standard modes.
|
||||||
#if __has_keyword(__decltype) || _GNUC_VER >= 406
|
#if __has_keyword(__decltype) || _LIBCPP_CLANG_VER >= 304 || _GNUC_VER >= 406
|
||||||
# define decltype(__x) __decltype(__x)
|
# define decltype(__x) __decltype(__x)
|
||||||
#else
|
#else
|
||||||
# define decltype(__x) __typeof__(__x)
|
# define decltype(__x) __typeof__(__x)
|
||||||
|
|||||||
Reference in New Issue
Block a user