From dace4784d1d1effb31955dd79e2b7ac03818fade Mon Sep 17 00:00:00 2001 From: kgv Date: Thu, 9 Feb 2017 15:52:59 +0300 Subject: [PATCH] 0028439: Configuration - compilation error when using thread_local within XCode 7 or earlier __has_feature(cxx_thread_local) check has been added for using thread_local keyword within CLang. --- adm/cmake/occt_defs_flags.cmake | 5 ++++- src/Standard/Standard_Failure.cxx | 18 ++++++++++++------ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/adm/cmake/occt_defs_flags.cmake b/adm/cmake/occt_defs_flags.cmake index 65fff6e721..8f4872bcc3 100644 --- a/adm/cmake/occt_defs_flags.cmake +++ b/adm/cmake/occt_defs_flags.cmake @@ -122,7 +122,10 @@ if(MINGW) add_definitions(-D_WIN32_WINNT=0x0501) # workaround bugs in mingw with vtable export set (CMAKE_SHARED_LINKER_FLAGS "-Wl,--export-all-symbols") -elseif (DEFINED CMAKE_COMPILER_IS_GNUCXX OR "x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xClang") +elseif ("x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xClang") + # CLang can be used with both libstdc++ and libc++, however on OS X libstdc++ is outdated. + set (CMAKE_CXX_FLAGS "-std=c++0x -stdlib=libc++ ${CMAKE_CXX_FLAGS}") +elseif (DEFINED CMAKE_COMPILER_IS_GNUCXX) set (CMAKE_CXX_FLAGS "-std=c++0x ${CMAKE_CXX_FLAGS}") endif() diff --git a/src/Standard/Standard_Failure.cxx b/src/Standard/Standard_Failure.cxx index 83e52e9568..b7a4d147b6 100644 --- a/src/Standard/Standard_Failure.cxx +++ b/src/Standard/Standard_Failure.cxx @@ -58,12 +58,18 @@ static void deallocate_message(Standard_CString aMessage) } } -// Define Standard_THREADLOCAL modifier as C++11 thread_local keyword -// where it is available. -#if (defined(__INTEL_COMPILER) && __INTEL_COMPILER > 1400) || \ - (defined(__clang__)) /* assume standard CLang > 3.3 or XCode >= 8 */ || \ - (defined(_MSC_VER) && _MSC_VER >= 1900) /* MSVC++ >= 14 */ || \ - (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8))) /* GCC >= 4.8 */ +// Define Standard_THREADLOCAL modifier as C++11 thread_local keyword where it is available. +#if defined(__clang__) + // CLang version: standard CLang > 3.3 or XCode >= 8 (but excluding 32-bit ARM) + // Note: this has to be in separate #if to avoid failure of preprocessor on other platforms + #if __has_feature(cxx_thread_local) + #define Standard_THREADLOCAL thread_local + #else + #define Standard_THREADLOCAL + #endif +#elif (defined(__INTEL_COMPILER) && __INTEL_COMPILER > 1400) || \ + (defined(_MSC_VER) && _MSC_VER >= 1900) /* MSVC++ >= 14 */ || \ + (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8))) /* GCC >= 4.8 */ #define Standard_THREADLOCAL thread_local #else #define Standard_THREADLOCAL