From 2498e944fc5cc837b91191867b3964ce192caca3 Mon Sep 17 00:00:00 2001
From: Aaron Ballman <aaron@aaronballman.com>
Date: Tue, 5 Jan 2016 14:24:01 +0000
Subject: [PATCH] Enable more strict standards conformance in MSVC for rvalue
 casting and string literal type conversion to non-const types. Also enables
 generation of intrinsics for more functions.

Patch by Alexander Riccio

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@256836 91177308-0d34-0410-b5e6-96231b3b80d8
---
 cmake/modules/HandleLLVMOptions.cmake | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/cmake/modules/HandleLLVMOptions.cmake b/cmake/modules/HandleLLVMOptions.cmake
index 4c5ffe2f7b2..f3a316f5782 100644
--- a/cmake/modules/HandleLLVMOptions.cmake
+++ b/cmake/modules/HandleLLVMOptions.cmake
@@ -363,6 +363,17 @@ if( MSVC )
 
   append("/Zc:inline" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
 
+  # Disable string literal const->non-const type conversion
+  # "When specified, the compiler requires strict const-qualification
+  # conformance for pointers initialized by using string literals."
+  append("/Zc:strictStrings" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
+
+  # Generate Intrinsic Functions
+  append("/Oi" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
+
+  # Enforce type conversion rules
+  append("/Zc:rvalueCast" CMAKE_CXX_FLAGS)
+
   # Disable sized deallocation if the flag is supported. MSVC fails to compile
   # the operator new overload in User otherwise.
   check_c_compiler_flag("/WX /Zc:sizedDealloc-" SUPPORTS_SIZED_DEALLOC)
-- 
2.34.1