Disable Visual C++ 2013 Debug mode assert on null pointer in some STL algorithms,
authorYaron Keren <yaron.keren@gmail.com>
Fri, 21 Aug 2015 17:31:03 +0000 (17:31 +0000)
committerYaron Keren <yaron.keren@gmail.com>
Fri, 21 Aug 2015 17:31:03 +0000 (17:31 +0000)
such as std::equal on the third argument. This reverts previous workarounds.

Predefining _DEBUG_POINTER_IMPL disables Visual C++ 2013 headers from defining
it to a function performing the null pointer check. In practice, it's not that
bad since any function actually using the nullptr will seg fault. The other
iterator sanity checks remain enabled in the headers.

Reviewed by Aaron Ballmanþ and Duncan P. N. Exon Smith.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@245711 91177308-0d34-0410-b5e6-96231b3b80d8

cmake/modules/HandleLLVMOptions.cmake
docs/CodingStandards.rst
include/llvm/ADT/ArrayRef.h
lib/CodeGen/SelectionDAG/SelectionDAG.cpp

index 1aadd61c6024fb24af89d50d31f5cc3a9141cda8..7a6f63319fbd2163e392c6e6c061d4b221ea18fe 100644 (file)
@@ -247,6 +247,12 @@ if( MSVC_IDE )
 endif()
 
 if( MSVC )
 endif()
 
 if( MSVC )
+  if( CMAKE_CXX_COMPILER_VERSION VERSION_LESS 19.0 )
+    # For MSVC 2013, disable iterator null pointer checking in debug mode,
+    # especially so std::equal(nullptr, nullptr, nullptr) will not assert.
+    add_llvm_definitions("-D_DEBUG_POINTER_IMPL=")
+  endif()
+  
   include(ChooseMSVCCRT)
 
   if( NOT (${CMAKE_VERSION} VERSION_LESS 2.8.11) )
   include(ChooseMSVCCRT)
 
   if( NOT (${CMAKE_VERSION} VERSION_LESS 2.8.11) )
index f410293e1bf20f80e8955a99901b252647462bd5..91faadffea62e84b40e2248da3eab37476109b04 100644 (file)
@@ -178,8 +178,6 @@ being aware of:
 * While most of the atomics library is well implemented, the fences are
   missing. Fortunately, they are rarely needed.
 * The locale support is incomplete.
 * While most of the atomics library is well implemented, the fences are
   missing. Fortunately, they are rarely needed.
 * The locale support is incomplete.
-* ``std::equal()`` (and other algorithms) incorrectly assert in MSVC when given
-  ``nullptr`` as an iterator.
 
 Other than these areas you should assume the standard library is available and
 working as expected until some build bot tells you otherwise. If you're in an
 
 Other than these areas you should assume the standard library is available and
 working as expected until some build bot tells you otherwise. If you're in an
index e8063305591f95f79585d439e1dfc65ec7da3f37..c28fdffae73dafeab2a890213e95664a6ad9c683 100644 (file)
@@ -156,8 +156,6 @@ namespace llvm {
     bool equals(ArrayRef RHS) const {
       if (Length != RHS.Length)
         return false;
     bool equals(ArrayRef RHS) const {
       if (Length != RHS.Length)
         return false;
-      if (Length == 0)
-        return true;
       return std::equal(begin(), end(), RHS.begin());
     }
 
       return std::equal(begin(), end(), RHS.begin());
     }
 
index 0ae52b2caf0601ce511eacd8f5d432ee547a7887..0d73bc5e65d46c1a34098c71549b9412c35ab079 100644 (file)
@@ -5676,7 +5676,7 @@ UpdateNodeOperands(SDNode *N, ArrayRef<SDValue> Ops) {
          "Update with wrong number of operands");
 
   // If no operands changed just return the input node.
          "Update with wrong number of operands");
 
   // If no operands changed just return the input node.
-  if (Ops.empty() || std::equal(Ops.begin(), Ops.end(), N->op_begin()))
+  if (std::equal(Ops.begin(), Ops.end(), N->op_begin()))
     return N;
 
   // See if the modified node already exists.
     return N;
 
   // See if the modified node already exists.