From 2b3db2c1bb435fca17ce45675e1f5c63e3ea91f4 Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Wed, 30 Mar 2016 17:30:26 +0000 Subject: [PATCH] [cmake] Add -fms-compatibility-version=19 when clang-cl gives errors about char16_t What we are really trying to do here is to figure out if we are using the 2015 STL. Unfortunately, so far as I know the MSVC STL does not define a version macro that we can check directly. Instead I wrote a check to see if char16_t works. llvm-svn: 264881 --- llvm/cmake/modules/HandleLLVMOptions.cmake | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/llvm/cmake/modules/HandleLLVMOptions.cmake b/llvm/cmake/modules/HandleLLVMOptions.cmake index 7036e74..83c8fe6 100644 --- a/llvm/cmake/modules/HandleLLVMOptions.cmake +++ b/llvm/cmake/modules/HandleLLVMOptions.cmake @@ -347,6 +347,17 @@ if( MSVC ) # "Enforce type conversion rules". append("/Zc:rvalueCast" CMAKE_CXX_FLAGS) + if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") + # In VS 2015, char16_t became a builtin type. Clang still defaults to VS + # 2013 compatibility, where it cannot be a builtin type. If we're using an + # STL newer than 2015, this compilation will fail. Rasing the MSVC + # compatibility version of the compiler will provide char16/32. + check_cxx_source_compiles("#include \nchar16_t v1;\n" STL_PROVIDES_CHAR16_T) + if (NOT STL_PROVIDES_CHAR16_T) + append("-fms-compatibility-version=19" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) + endif() + endif() + if (NOT LLVM_ENABLE_TIMESTAMPS AND CMAKE_CXX_COMPILER_ID MATCHES "Clang") # clang-cl and cl by default produce non-deterministic binaries because # link.exe /incremental requires a timestamp in the .obj file. clang-cl -- 2.7.4